fpc/compiler/Makefile.fpc
Jonas Maebe 9772da7eeb * compare stripped copies of the compiler instead of the original
compiler binaries when determining whether cycle has finished
    on darwin, because when using Dwarf the linked binaries are
    always slightly different there (because the Dwarf info is kept
    in the object files and is referenced using a unique identifier,
    to be able to ascertain that you are using the correct object
    files and binary together when debugging)

git-svn-id: trunk@9715 -
2008-01-11 20:08:47 +00:00

603 lines
15 KiB
Makefile

#
# Makefile.fpc for Free Pascal Compiler
#
[package]
name=compiler
version=2.0.0
[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 powerpc64 m68k
# All supported targets used for clean
ALLTARGETS=$(CYCLETARGETS)
# Allow ALPHA, POWERPC, POWERPC64, M68K, I386 defines for target cpu
ifdef ALPHA
PPC_TARGET=alpha
endif
ifdef POWERPC
PPC_TARGET=powerpc
endif
ifdef POWERPC64
PPC_TARGET=powerpc64
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),powerpc64)
CPUSUF=ppc64
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
REVINC:=$(wildcard revision.inc)
ifneq ($(REVINC),)
override LOCALOPT+=-dREVINC
ifeq ($(REVSTR),)
SVNVERSION:=$(wildcard svnversion$(EXEEXT))
REVSTR:=$(shell svnversion .)
export REVSTR
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+=-Fuppcgen
endif
# PowerPC64 specific
ifeq ($(PPC_TARGET),powerpc64)
override LOCALOPT+=-Fuppcgen
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+=
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=i386 m68k powerpc sparc arm x86_64 powerpc64 alpha vis ia64
.PHONY: $(PPC_TARGETS)
$(PPC_TARGETS):
$(MAKE) PPC_TARGET=$@ CPU_UNITDIR=$@ all
alltargets: $(ALLTARGETS)
#####################################################################
# Default makefile
#####################################################################
.NOTPARALLEL:
.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,$(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))
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,$(ALLTARGETS)) $(addsuffix _distclean,$(TARGET_DIRS))
#####################################################################
# Make targets
#####################################################################
$(MSG2INC): $(COMPILER_TARGETDIR) $(COMPILER_UNITTARGETDIR) $(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
insdatx86 : $(COMPILER_UNITTARGETDIR) x86/x86ins.dat
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkx86ins.pp
cd x86; ../utils/mkx86ins; mv -f *.inc ../i386
cd x86;../utils/mkx86ins x86_64; mv -f *.inc ../x86_64
insdatarm : arm/armins.dat
$(COMPILER) -FE$(COMPILERUTILSDIR) $(COMPILERUTILSDIR)/mkarmins.pp
cd arm; ../utils/mkarmins
insdat: insdatx86 insdatarm
# Make only the compiler
$(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg \
$(wildcard systems/*.pas) $(wilcard systems/*.inc) \
$(wildcard $(PPC_TARGET)/*.pas) $(wildcard $(PPC_TARGET)/*.inc)
ifneq ($(REVSTR),)
$(ECHOREDIR) "'$(REVSTR)'" > revision.inc
endif
$(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
ifneq ($(OS_TARGET),darwin)
DIFFRESULT:=$(shell $(DIFF) $(OLDFPC) $(FPC))
else
DIFFRESULT:=$(shell cp $(OLDFPC) $(OLDFPC).tmp; cp $(FPC) $(FPC).tmp; strip -no_uuid $(OLDFPC).tmp; strip -no_uuid $(FPC).tmp; $(DIFF) $(OLDFPC).tmp $(FPC).tmp; rm $(OLDFPC).tmp $(FPC).tmp)
endif
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<ARCH> (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<ARCH> (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)
# 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<ARCH> (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<ARCH> (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 -glttt -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)/$(INSTALLEXEFILE)
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