# # Makefile.fpc for Free Pascal Compiler # [package] name=compiler version=1.9.9 [target] programs=pp dirs=utils [compiler] targetdir=. unittargetdir=$(CPU_UNITDIR)/units/$(FULL_TARGET) unitdir=$(COMPILERSOURCEDIR) includedir=$(PPC_TARGET) [require] packages=rtl tools=diff cmp [install] fpcpackage=y [default] fpcdir=.. [prerules] # Don't export version it can change after the first compile unexport FPC_VERSION FPC_COMPILERINFO # Which platforms are ready for inclusion in the cycle CYCLETARGETS=i386 powerpc sparc arm x86_64 # Allow ALPHA, POWERPC, M68K, I386 defines for target cpu ifdef ALPHA PPC_TARGET=alpha endif ifdef POWERPC PPC_TARGET=powerpc endif ifdef SPARC PPC_TARGET=sparc endif ifdef M68K PPC_TARGET=m68k endif ifdef I386 PPC_TARGET=i386 endif ifdef X86_64 PPC_TARGET=x86_64 endif ifdef ARM PPC_TARGET=arm endif # Default is to generate a compiler for the same # platform as CPU_TARGET (a native compiler) ifndef PPC_TARGET PPC_TARGET=$(CPU_TARGET) endif # Default is to generate a compiler for the same # target as OS_TARGET (a native compiler) ifndef PPC_OS PPC_OS=$(OS_TARGET) endif # Where to place the unit files. CPU_UNITDIR=$(PPC_TARGET) # RTL UTILSDIR=../utils # Directories containing compiler sources COMPILERSOURCEDIR=$(PPC_TARGET) systems # Utils used by compiler development/installation COMPILERUTILSDIR=utils # Default language for the compiler ifndef FPCLANG FPCLANG=e endif # Local options for the compiler only ifndef LOCALOPT LOCALOPT:=$(OPT) endif # Options for the RTL only when cycling ifndef RTLOPT RTLOPT:=$(OPT) endif # Make OPT empty. It is copied to LOCALOPT and RTLOPT override OPT= # Message files MSGFILES=$(wildcard msg/error*.msg) # ppcSUFFIX ifeq ($(PPC_TARGET),i386) CPUSUF=386 endif ifeq ($(PPC_TARGET),alpha) CPUSUF=axp endif ifeq ($(PPC_TARGET),m68k) CPUSUF=68k endif ifeq ($(PPC_TARGET),powerpc) CPUSUF=ppc endif ifeq ($(PPC_TARGET),sparc) CPUSUF=sparc endif ifeq ($(PPC_TARGET),x86_64) CPUSUF=x64 endif ifeq ($(PPC_TARGET),arm) CPUSUF=arm endif # Do not define the default -d$(CPU_TARGET) because that # will conflict with our -d$(PPC_TARGET) NOCPUDEF=1 # Default message file MSGFILE=msg/error$(FPCLANG).msg # Define Unix also for Linux ifeq ($(OS_TARGET),linux) ifneq ($(findstring 1.0.,$(FPC_VERSION)),) override LOCALOPT+=-dUNIX endif endif ifeq ($(OS_TARGET),freebsd) ifneq ($(findstring 1.0.,$(FPC_VERSION)),) override LOCALOPT+=-dUNIX endif endif # set correct defines (-d$(CPU_TARGET) is automaticly added in makefile.fpc) override LOCALOPT+=-d$(PPC_TARGET) -dGDB -dBROWSERLOG # i386 specific ifeq ($(PPC_TARGET),i386) override LOCALOPT+=-Fux86 endif # x86_64 specific ifeq ($(PPC_TARGET),x86_64) override LOCALOPT+=-Fux86 endif # PowerPC specific ifeq ($(PPC_TARGET),powerpc) override LOCALOPT+= endif # m68k specific ifeq ($(PPC_TARGET),m68k) override LOCALOPT+=-dNOOPT endif # Sparc specific ifeq ($(PPC_TARGET),sparc) override LOCALOPT+= endif # m68k specific with low stack ifeq ($(PPC_TARGET),m68k) ifeq ($(OS_TARGET),amiga) override LOCALOPT+=-Ct endif endif # ARM specific ifeq ($(PPC_TARGET),arm) override LOCALOPT+=-dNOOPT endif [rules] ##################################################################### # Setup Targets ##################################################################### ifeq ($(OS_TARGET),win32) ifdef CMP override DIFF:=$(CMP) -i218 endif endif # Add Local options override COMPILER+=$(LOCALOPT) # Disable optimizer when compiled with 1.0.x ifneq ($(findstring 1.0.,$(FPC_VERSION)),) override COMPILER:=$(patsubst -O%,,$(COMPILER)) endif ##################################################################### # PASDoc ##################################################################### PASDOC:=$(strip $(wildcard $(addsuffix /pasdoc.exe,$(SEARCHPATH)))) ifeq ($(PASDOC),) PASDOC:=$(strip $(wildcard $(addsuffix /pasdoc,$(SEARCHPATH)))) endif ifeq ($(PASDOC),) PASDOC:=../projects/pasdoc/bin/pasdoc else PASDOC:=$(firstword $(PASDOC)) endif ##################################################################### # Setup os-independent filenames ##################################################################### ifndef EXENAME EXENAME=ppc$(CPUSUF)$(EXEEXT) endif PPEXENAME=pp$(EXEEXT) TEMPNAME=ppc$(SRCEXEEXT) PPCROSSNAME=ppcross$(CPUSUF)$(SRCEXEEXT) TEMPNAME1=ppc1$(EXEEXT) TEMPNAME2=ppc2$(EXEEXT) TEMPNAME3=ppc3$(EXEEXT) MAKEDEP=ppdep$(EXEEXT) MSG2INC=./msg2inc$(EXEEXT) ifdef CROSSINSTALL INSTALLEXEFILE=$(PPCROSSNAME) else INSTALLEXEFILE=$(EXENAME) endif ##################################################################### # CPU targets ##################################################################### PPC_TARGETS=alpha i386 m68k powerpc sparc arm x86_64 .PHONY: $(PPC_TARGETS) $(PPC_TARGETS): $(MAKE) PPC_TARGET=$@ CPU_UNITDIR=$@ all ##################################################################### # Default makefile ##################################################################### .PHONY: all compiler echotime ppuclean execlean clean distclean all: compiler $(addsuffix _all,$(TARGET_DIRS)) compiler: $(COMPILER_UNITTARGETDIR) $(COMPILER_TARGETDIR) $(EXENAME) ifeq ($(MAKELEVEL),0) ifndef STARTTIME ifdef DATE STARTTIME:=$(shell $(DATE) +%T) else STARTTIME:=unknown endif endif endif export STARTTIME ifdef DATE ENDTIME=$(shell $(DATE) +%T) else ENDTIME:=unknown endif echotime: @echo Start $(STARTTIME) now $(ENDTIME) ppuclean: -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT) -$(DEL) $(addsuffix /*$(PPUEXT),$(COMPILERSOURCEDIR)) tempclean: -$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC) execlean : -$(DEL) ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) $(EXENAME) $(addsuffix _clean,$(CYCLETARGETS)): -$(DELTREE) $(addprefix $(subst _clean,,$@),/units) -$(DEL) $(addprefix $(subst _clean,,$@)/,*$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)) -$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcppc$(EXEEXT) $(EXENAME)) cycleclean: cleanall $(addsuffix _clean,$(PPC_TARGET)) -$(DEL) $(EXENAME) clean: tempclean execlean cleanall $(addsuffix _clean,$(PPC_TARGET)) $(addsuffix _clean,$(TARGET_DIRS)) distclean: tempclean execlean cleanall $(addsuffix _clean,$(CYCLETARGETS)) $(addsuffix _distclean,$(TARGET_DIRS)) ##################################################################### # Make targets ##################################################################### $(MSG2INC): $(COMPILERUTILSDIR)/msg2inc.pp $(COMPILER) -FE. $(COMPILERUTILSDIR)/msg2inc.pp # The msgtxt.inc only depends on the error?.msg file, not on msg2inc, # because that one will be new almost everytime msgtxt.inc: $(MSGFILE) $(MAKE) $(MSG2INC) $(MSG2INC) $(MSGFILE) msg msg msg: msgtxt.inc # Make only the compiler $(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg \ $(wildcard systems/*.pas) $(wilcard systems/*.inc) \ $(wildcard $(PPC_TARGET)/*.pas) $(wildcard $(PPC_TARGET)/*.inc) $(COMPILER) pp.pas $(EXECPPAS) $(MOVE) $(COMPILER_TARGETDIR)/$(PPEXENAME) $(EXENAME) ##################################################################### # Cycle targets # # 1. Source CPU = Target CPU and Source OS = Target OS # Normal cycle # # 2. Source CPU = Target CPU and Source OS <> Target OS # First source native compiler # Second target native compiler (skipped for cross installation) # # 3. Source CPU <> Target CPU # First source native compiler # Second cross compiler # Third target native compiler (skipped for cross installation) # ##################################################################### ifeq ($(CPU_SOURCE),$(PPC_TARGET)) ifeq ($(OS_SOURCE),$(OS_TARGET)) ########################## # Normal cycle # # Used to avoid unnecessary steps ifdef DIFF ifdef OLDFPC DIFFRESULT:=$(shell $(DIFF) $(OLDFPC) $(FPC)) else DIFFRESULT=Not equal endif else DIFFRESULT=No diff program endif ifndef DIFFRESULT next : @echo $(OLDFPC) and $(FPC) are equal $(COPY) $(FPC) $(EXENAME) else next : $(MAKE) rtlclean rtl $(MAKE) cycleclean compiler $(MAKE) echotime endif $(TEMPNAME1) : $(MAKE) 'OLDFPC=' next -$(DEL) $(TEMPNAME1) $(MOVE) $(EXENAME) $(TEMPNAME1) $(TEMPNAME2) : $(TEMPNAME1) $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME1)' 'OLDFPC=' next -$(DEL) $(TEMPNAME2) $(MOVE) $(EXENAME) $(TEMPNAME2) $(TEMPNAME3) : $(TEMPNAME2) $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME2)' 'OLDFPC=$(BASEDIR)/$(TEMPNAME1)' next -$(DEL) $(TEMPNAME3) $(MOVE) $(EXENAME) $(TEMPNAME3) cycle: $(MAKE) tempclean $(TEMPNAME3) $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME3)' 'OLDFPC=$(BASEDIR)/$(TEMPNAME2)' next $(DIFF) $(TEMPNAME3) $(EXENAME) $(MAKE) $(addsuffix _all,$(TARGET_DIRS)) 'FPC=$(BASEDIR)/$(EXENAME)' $(MAKE) echotime else ########################## # Cross Target cycle # cycle: # ppc (source native) $(MAKE) OS_TARGET=$(OS_SOURCE) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 rtlclean rtl $(MAKE) OS_TARGET=$(OS_SOURCE) EXENAME=$(TEMPNAME) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 cycleclean compiler # ppcross (source native) $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 rtlclean rtl $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) EXENAME=$(PPCROSSNAME) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 cycleclean compiler # ppc (target native) ifndef CROSSINSTALL $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' rtlclean rtl $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' cycleclean compiler endif endif else ########################## # Cross CPU cycle # # ppc1 = native # ppc2 = cross running on this platform # ppc3/ppcXXX = native (skipped for cross installation) # cycle: # ppc (source native) $(MAKE) OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 rtlclean rtl $(MAKE) OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) EXENAME=$(TEMPNAME) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 cycleclean compiler # ppcross (source native) $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 rtlclean rtl $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) PPC_TARGET=$(CPU_TARGET) EXENAME=$(PPCROSSNAME) CROSSBINDIR="" BINUTILSPREFIX="" CROSSCYCLEBOOTSTRAP=1 cycleclean compiler # ppc (target native) ifndef CROSSINSTALL $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' rtlclean rtl $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' cycleclean compiler endif endif cycledep: $(MAKE) cycle USEDEPEND=1 extcycle: $(MAKE) cycle OPT='-n -OG2p3 -gl -CRriot -dEXTDEBUG' cvstest: $(MAKE) cycle 'LOCALOPT=-n -Se' 'RTLOPT=-n -Se' ########################## # Full cycle # # 1. build a compiler using cycle # 2. remove all .ppufiles # 3. build all supported cross compilers except the # current PPC_TARGET which was already build # full: fullcycle fullcycle: $(MAKE) cycle $(MAKE) ppuclean $(MAKE) $(filter-out $(PPC_TARGET),$(CYCLETARGETS)) 'FPC=$(BASEDIR)/$(EXENAME)' ##################################################################### # Docs ##################################################################### htmldocs: $(PASDOC) -p -h -o html$(PATHSEP)$(PPC_TARGET) -d fpc -d gdb -d $(PPC_TARGET) -u $(PPC_TARGET) $(PPC_TARGET)$(PATHSEP)*.pas systems$(PATHSEP)*.pas *.pas ##################################################################### # Installation ##################################################################### .PHONY: quickinstall install installsym MSGINSTALLDIR=$(INSTALL_BASEDIR)/msg override PPEXEFILE:=$(wildcard $(EXENAME)) ifdef UNIXHier PPCCPULOCATION=$(INSTALL_BASEDIR) else PPCCPULOCATION=$(INSTALL_BINDIR) endif # This will only install the ppcXXX executable, not the message files etc. quickinstall: $(addsuffix _install,$(TARGET_DIRS)) # Install ppcXXX executable, for a cross installation we install # the ppcrossXXX as ppcXXX. The target native build ppcXXX is not used # for this installation type ifneq ($(INSTALLEXEFILE),) ifdef UPXPROG -$(UPXPROG) $(INSTALLEXEFILE) endif $(MKDIR) $(PPCCPULOCATION) $(INSTALLEXE) $(INSTALLEXEFILE) $(PPCCPULOCATION)/$(EXENAME) endif install: quickinstall ifndef CROSSINSTALL ifdef UNIXHier $(MKDIR) $(INSTALL_BASEDIR) $(INSTALLEXE) $(COMPILERUTILSDIR)/samplecfg $(INSTALL_BASEDIR)/samplecfg endif $(MKDIR) $(MSGINSTALLDIR) $(INSTALL) $(MSGFILES) $(MSGINSTALLDIR) endif # This also installs a link from bin to the actual executable. # The .deb does that later. installsymlink: install ifneq ($(PPCCPULOCATION),$(INSTALL_BINDIR)) $(MKDIR) $(INSTALL_BINDIR) ln -sf $(INSTALL_BASEDIR)/$(EXENAME) $(INSTALL_BINDIR)/$(EXENAME) endif ##################################################################### # RTL ##################################################################### .PHONY: rtl rtlclean rtlinstall rtl: $(MAKE) -C $(PACKAGEDIR_RTL) 'OPT=$(RTLOPT)' all rtlclean: $(MAKE) -C $(PACKAGEDIR_RTL) clean rtlinstall: $(MAKE) -C $(PACKAGEDIR_RTL) install ##################################################################### # local user configurable file # in makefile.loc you can add any desired target ##################################################################### localmake:=$(strip $(wildcard makefile.loc)) ifdef localmake include ./$(localmake) endif