--- Makefile.fpc.orig 2011-04-02 01:15:34.000000000 +0400 +++ Makefile.fpc 2011-08-05 22:29:44.000000000 +0400 @@ -4,7 +4,7 @@ [package] name=compiler -version=2.4.4 +version=2.5.1 [target] programs=pp @@ -32,7 +32,7 @@ unexport FPC_VERSION FPC_COMPILERINFO # Which platforms are ready for inclusion in the cycle -CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb # mipsel mips +CYCLETARGETS=i386 powerpc sparc arm x86_64 powerpc64 m68k armeb mipsel mips avr # All supported targets used for clean ALLTARGETS=$(CYCLETARGETS) @@ -148,6 +148,12 @@ ifeq ($(CPC_TARGET),arm) CPUSUF=arm endif +ifeq ($(CPC_TARGET),mips) +CPUSUF=mips +endif +ifeq ($(CPC_TARGET),mipsel) +CPUSUF=mipsel +endif # Do not define the default -d$(CPU_TARGET) because that # will conflict with our -d$(CPC_TARGET) @@ -224,12 +230,39 @@ override LOCALOPT+= endif +# mipsel specific +ifeq ($(PPC_TARGET),mipsel) +override LOCALOPT+=-Fumips +endif + + +OPTWPOCOLLECT=-OWdevirtcalls,optvmts -FW$(BASEDIR)/pp1.wpo +OPTWPOPERFORM=-Owdevirtcalls,optvmts -Fw$(BASEDIR)/pp1.wpo +# symbol liveness WPO requires nm, smart linking and no stripping (the latter +# is forced by the Makefile when necessary) +ifneq ($(findstring $(OS_TARGET),darwin linux freebsd solaris),) +ifdef LINKSMART +ifdef CREATESMART +OPTWPOCOLLECT+=-OWsymbolliveness -Xs- +OPTWPOPERFORM+=-Owsymbolliveness +endif +endif +endif + + [rules] ##################################################################### # Setup Targets ##################################################################### ifeq ($(OS_TARGET),win32) +USE_CMP_FOR_DIFF=1 +endif +ifeq ($(OS_TARGET),win64) +USE_CMP_FOR_DIFF=1 +endif + +ifdef USE_CMP_FOR_DIFF ifdef CMP override DIFF:=$(CMP) -i218 endif @@ -267,6 +300,8 @@ TEMPNAME1=ppc1$(EXEEXT) TEMPNAME2=ppc2$(EXEEXT) TEMPNAME3=ppc3$(EXEEXT) +TEMPWPONAME1=ppcwpo1$(EXEEXT) +TEMPWPONAME2=ppcwpo2$(EXEEXT) MAKEDEP=ppdep$(EXEEXT) MSG2INC=./msg2inc$(EXEEXT) ifdef CROSSINSTALL @@ -327,15 +362,15 @@ -$(DEL) $(addsuffix /*$(PPUEXT),$(COMPILERSOURCEDIR)) tempclean: - -$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC) + -$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC) pp1.wpo pp2.wpo execlean : - -$(DEL) ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) $(EXENAME) + -$(DEL) ppc386$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) ppcppc64$(EXEEXT) ppcarm$(EXEEXT) ppcmips$(EXEEXT) ppcmipsel$(EXEEXT) $(EXENAME) $(TEMPWPONAME1) $(TEMPWPONAME2) $(addsuffix _clean,$(ALLTARGETS)): -$(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)) + -$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppc68k$(EXEEXT) ppcx64$(EXEEXT) ppcppc$(EXEEXT) ppcsparc$(EXEEXT) ppcppc64$(EXEEXT) ppcarm$(EXEEXT) ppcmips$(EXEEXT) ppcmipsel$(EXEEXT) $(EXENAME)) cycleclean: cleanall $(addsuffix _clean,$(CPC_TARGET)) -$(DEL) $(EXENAME) @@ -444,6 +479,28 @@ # Normal cycle # +ifndef NOWPOCYCLE +ifdef RELEASE +DOWPOCYCLE=1 +# Two WPO cycles in case of RELEASE=1 +wpocycle: +# don't use cycle_clean, it will delete the compiler utilities again + $(RM) $(EXENAME) + $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME3)' 'OPT=$(LOCALOPT) $(OPTWPOCOLLECT)' compiler + $(RM) $(EXENAME) + $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME3)' 'OPT=$(RTLOPT) $(OPTWPOPERFORM)' rtlclean rtl + $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME3)' 'OPT=$(LOCALOPT) $(OPTWPOPERFORM) $(subst pp1.wpo,pp2.wpo,$(OPTWPOCOLLECT))' $(addsuffix _clean,$(ALLTARGETS)) compiler + $(MOVE) $(EXENAME) $(TEMPWPONAME1) + $(MAKE) 'FPC=$(BASEDIR)/$(TEMPWPONAME1)' 'OPT=$(RTLOPT) $(subst pp1.wpo,pp2.wpo,$(OPTWPOPERFORM))' rtlclean rtl + $(MAKE) 'FPC=$(BASEDIR)/$(TEMPWPONAME1)' 'OPT=$(LOCALOPT) $(subst pp1.wpo,pp2.wpo,$(OPTWPOPERFORM))' $(addsuffix _clean,$(ALLTARGETS)) compiler + $(COPY) $(EXENAME) $(TEMPWPONAME2) +endif +endif + +ifndef DOWPOCYCLE +wpocycle: +endif + # Used to avoid unnecessary steps ifdef DIFF ifdef OLDFPC @@ -490,6 +547,7 @@ $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME3)' 'OLDFPC=$(BASEDIR)/$(TEMPNAME2)' next $(DIFF) $(TEMPNAME3) $(EXENAME) $(MAKE) $(addsuffix _all,$(TARGET_DIRS)) 'FPC=$(BASEDIR)/$(EXENAME)' + $(MAKE) wpocycle $(MAKE) echotime else @@ -508,8 +566,11 @@ # ppc (target native) ifndef CROSSINSTALL $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' rtlclean rtl +# building a native compiler for embedded targets is not possible +ifneq ($(OS_TARGET),embedded) $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' cycleclean compiler endif +endif endif @@ -523,10 +584,10 @@ # ppc3/ppcXXX = native (skipped for cross installation) # +cycle: override FPC= cycle: # ppc (source native) # Clear detected compiler binary, because it can be existing crosscompiler binary, but we need native compiler here -override FPC= $(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) @@ -535,8 +596,11 @@ # ppc (target native) ifndef CROSSINSTALL $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' 'OPT=$(OPT) $(CROSSOPT)' rtlclean rtl +# building a native compiler for embedded targets is not possible +ifneq ($(OS_TARGET),embedded) $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' 'OPT=$(OPT) $(CROSSOPT)' cycleclean compiler endif +endif endif