Makefile.fpc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. #
  2. # Makefile.fpc for Free Pascal Compiler
  3. #
  4. [package]
  5. name=compiler
  6. version=1.1
  7. [target]
  8. dirs=utils
  9. [compiler]
  10. targetdir=$(CPU_UNITDIR)
  11. unitdir=$(PPC_TARGET) systems
  12. includedir=$(PPC_TARGET)
  13. [require]
  14. packages=rtl
  15. tools=diff cmp
  16. [install]
  17. fpcpackage=y
  18. [default]
  19. fpcdir=..
  20. [prerules]
  21. # Don't export version it can change after the first compile
  22. unexport FPC_VERSION
  23. # Which platforms are ready for inclusion in the cycle
  24. CYCLETARGETS=i386 powerpc m68k
  25. # Allow ALPHA, POWERPC, M68K, I386 defines for target cpu
  26. ifdef ALPHA
  27. PPC_TARGET=alpha
  28. endif
  29. ifdef POWERPC
  30. PPC_TARGET=powerpc
  31. endif
  32. ifdef M68K
  33. PPC_TARGET=m68k
  34. endif
  35. ifdef I386
  36. PPC_TARGET=i386
  37. endif
  38. ifdef X86_64
  39. PPC_TARGET=x86_64
  40. endif
  41. # Default is to generate a compiler for the same
  42. # platform as CPU_TARGET (a native compiler)
  43. ifndef PPC_TARGET
  44. PPC_TARGET=$(CPU_TARGET)
  45. endif
  46. export PPC_TARGET
  47. # Default is to generate a compiler for the same
  48. # target as OS_TARGET (a native compiler)
  49. ifndef PPC_OS
  50. PPC_OS=$(OS_TARGET)
  51. endif
  52. export PPC_OS
  53. # Where to place the unit files.
  54. CPU_UNITDIR=.
  55. # RTL
  56. UTILSDIR=../utils
  57. # Utils used by compiler development/installation
  58. COMPILERUTILSDIR=utils
  59. # Default language for the compiler
  60. ifndef FPCLANG
  61. FPCLANG=e
  62. endif
  63. # Local defines for the compiler only
  64. ifndef LOCALDEF
  65. LOCALDEF=
  66. endif
  67. # Local options for the compiler only
  68. ifndef LOCALOPT
  69. LOCALOPT=$(OPT)
  70. endif
  71. # Options for the RTL only when cycling
  72. ifndef RTLOPTS
  73. RTLOPTS=$(OPT)
  74. endif
  75. # Message files
  76. MSGFILES=$(wildcard msg/error*.msg)
  77. # ppcSUFFIX
  78. ifeq ($(PPC_TARGET),i386)
  79. CPUSUF=386
  80. endif
  81. ifeq ($(PPC_TARGET),alpha)
  82. CPUSUF=axp
  83. endif
  84. ifeq ($(PPC_TARGET),m68k)
  85. CPUSUF=68k
  86. endif
  87. ifeq ($(PPC_TARGET),powerpc)
  88. CPUSUF=ppc
  89. endif
  90. ifeq ($(PPC_TARGET),x86_64)
  91. CPUSUF=x64
  92. endif
  93. # Do not define the default -d$(CPU_TARGET) because that
  94. # will conflict with our -d$(PPC_TARGET)
  95. NOCPUDEF=1
  96. # Define Unix also for Linux
  97. ifeq ($(OS_TARGET),linux)
  98. ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
  99. override LOCALDEF+=-dUNIX
  100. endif
  101. endif
  102. ifeq ($(OS_TARGET),freebsd)
  103. ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
  104. override LOCALDEF+=-dUNIX
  105. endif
  106. endif
  107. # Default message file
  108. MSGFILE=msg/error$(FPCLANG).msg
  109. # set correct defines (-d$(CPU_TARGET) is automaticly added in makefile.fpc)
  110. override LOCALDEF+=-d$(PPC_TARGET) -dGDB -dBROWSERLOG
  111. # i386 specific
  112. ifeq ($(PPC_TARGET),i386)
  113. override LOCALDEF+=-dSUPPORT_MMX -Fux86
  114. endif
  115. # x86_64 specific
  116. ifeq ($(PPC_TARGET),x86_64)
  117. override LOCALDEF+=-dSUPPORT_MMX -Fux86
  118. endif
  119. # m68k specific
  120. ifeq ($(PPC_TARGET),m68k)
  121. override LOCALDEF+=-dNoAg68kMot -dNoAg68kMpw
  122. endif
  123. PASDOC:=$(strip $(wildcard $(addsuffix /pasdoc.exe,$(SEARCHPATH))))
  124. ifeq ($(PASDOC),)
  125. PASDOC:=$(strip $(wildcard $(addsuffix /pasdoc,$(SEARCHPATH))))
  126. endif
  127. ifeq ($(PASDOC),)
  128. PASDOC:=../projects/pasdoc/bin/pasdoc
  129. else
  130. PASDOC:=$(firstword $(PASDOC))
  131. endif
  132. override LOCALOPT+=$(LOCALDEF)
  133. override FPCOPT:=$(LOCALOPT)
  134. [rules]
  135. #####################################################################
  136. # Setup Targets
  137. #####################################################################
  138. ifeq ($(OS_TARGET),win32)
  139. ifdef CMP
  140. override DIFF:=$(CMP) -i138
  141. endif
  142. # force try to smartlink for windows unit
  143. override COMPILER+=-XX
  144. endif
  145. # Used to avoid unnecessary steps in remake3
  146. ifdef DIFF
  147. ifdef OLDFPC
  148. DIFFRESULT:=$(shell $(DIFF) $(OLDFPC) $(FPC))
  149. else
  150. DIFFRESULT=Not equal
  151. endif
  152. else
  153. DIFFRESULT=No diff program
  154. endif
  155. #####################################################################
  156. # Setup os-independent filenames
  157. #####################################################################
  158. ifndef EXENAME
  159. EXENAME=ppc$(CPUSUF)$(EXEEXT)
  160. endif
  161. PPEXENAME=pp$(EXEEXT)
  162. TEMPNAME=ppc$(SRCEXEEXT)
  163. PPCROSSNAME=ppcross$(CPUSUF)$(SRCEXEEXT)
  164. TEMPNAME1=ppc1$(EXEEXT)
  165. TEMPNAME2=ppc2$(EXEEXT)
  166. TEMPNAME3=ppc3$(EXEEXT)
  167. MAKEDEP=ppdep$(EXEEXT)
  168. MSG2INC=./msg2inc$(EXEEXT)
  169. #####################################################################
  170. # CPU targets
  171. #####################################################################
  172. .PHONY: alpha i386 m68k powerpc
  173. alpha:
  174. $(MAKE) PPC_TARGET=alpha CPU_UNITDIR=alpha all
  175. i386:
  176. $(MAKE) PPC_TARGET=i386 CPU_UNITDIR=i386 all
  177. m68k:
  178. $(MAKE) PPC_TARGET=m68k CPU_UNITDIR=m68k all
  179. powerpc:
  180. $(MAKE) PPC_TARGET=powerpc CPU_UNITDIR=powerpc all
  181. #####################################################################
  182. # Default makefile
  183. #####################################################################
  184. .PHONY: all compiler echotime ppuclean execlean clean distclean
  185. all: $(EXENAME) $(addsuffix _all,$(TARGET_DIRS))
  186. compiler: $(EXENAME)
  187. ifeq ($(MAKELEVEL),0)
  188. ifndef STARTTIME
  189. ifdef DATE
  190. STARTTIME:=$(shell $(DATE) +%T)
  191. else
  192. STARTTIME:=unknown
  193. endif
  194. endif
  195. endif
  196. export STARTTIME
  197. ifdef DATE
  198. ENDTIME=$(shell $(DATE) +%T)
  199. else
  200. ENDTIME:=unknown
  201. endif
  202. echotime:
  203. @echo Start $(STARTTIME) now $(ENDTIME)
  204. ppuclean:
  205. -$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
  206. execlean :
  207. -$(DEL) ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcppc$(EXEEXT) $(EXENAME)
  208. $(addsuffix _clean,$(CYCLETARGETS)):
  209. -$(DEL) $(addprefix $(subst _clean,,$@)/,*$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT))
  210. -$(DEL) $(addprefix $(subst _clean,,$@)/,ppc386$(EXEEXT) ppcaxp$(EXEEXT) ppc68k$(EXEEXT) ppcppc$(EXEEXT) $(EXENAME))
  211. clean : execlean fpc_cleanall $(addsuffix _clean,$(TARGET_DIRS)) $(addsuffix _clean,$(CYCLETARGETS))
  212. distclean: execlean fpc_cleanall $(addsuffix _distclean,$(TARGET_DIRS))
  213. -$(DEL) $(PPCROSSNAME) $(TEMPNAME) $(TEMPNAME1) $(TEMPNAME2) $(TEMPNAME3) $(MSG2INC)
  214. #####################################################################
  215. # Include depencies
  216. #####################################################################
  217. $(MAKEDEP): $(UTILSDIR)/ppdep.pp
  218. $(COMPILER) $(UTILSDIR)/ppdep.pp
  219. $(COPY) $(UTILSDIR)/$(MAKEDEP) $(MAKEDEP)
  220. dependencies : $(MAKEDEP)
  221. $(MAKEDEP) pp.pas $(FPCOPTDEF) $(LOCALDEF) '-F$$(COMPILER) $$(LOCALOPT)' > depend
  222. ifdef USEDEPEND
  223. include depend
  224. endif
  225. #####################################################################
  226. # Make targets
  227. #####################################################################
  228. $(MSG2INC): $(COMPILERUTILSDIR)/msg2inc.pp
  229. $(COMPILER) -FE. $(COMPILERUTILSDIR)/msg2inc.pp
  230. # The msgtxt.inc only depends on the error?.msg file, not on msg2inc,
  231. # because that one will be new almost everytime
  232. msgtxt.inc: $(MSGFILE)
  233. $(MAKE) $(MSG2INC)
  234. $(MSG2INC) $(MSGFILE) msg msg
  235. msg: msgtxt.inc
  236. # Make only the compiler
  237. ifndef COMPLETE
  238. $(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg \
  239. $(wildcard systems/*.pas) $(wilcard systems/*.inc) \
  240. $(wildcard $(PPC_TARGET)/*.pas) $(wildcard $(PPC_TARGET)/*.inc)
  241. $(COMPILER) pp.pas
  242. $(EXECPPAS)
  243. $(MOVE) $(COMPILER_TARGETDIR)/$(PPEXENAME) $(EXENAME)
  244. else
  245. $(EXENAME) : $(wildcard *.pas) $(wildcard *.inc) msg \
  246. $(wildcard systems/*.pas) $(wilcard systems/*.inc) \
  247. $(wildcard $(PPC_TARGET)/*.pas) $(wildcard $(PPC_TARGET)/*.inc)
  248. $(COMPILER) pp.pas
  249. $(EXECPPAS)
  250. $(COMPILER) pp.pas
  251. $(EXECPPAS)
  252. $(COMPILER) pp.pas
  253. $(EXECPPAS)
  254. $(MOVE) $(COMPILER_TARGETDIR)/$(PPEXENAME) $(EXENAME)
  255. endif
  256. tokens.dat : $(wildcard *.pas) $(wildcard *.inc)
  257. $(COMPILER) tokendat.pas
  258. ./tokendat
  259. #####################################################################
  260. # Cycle targets
  261. #
  262. # 1. Source CPU = Target CPU and Source OS = Target OS
  263. # Normal cycle
  264. # 2. Source CPU = Target CPU and Source OS <> Target OS
  265. # First source native compiler
  266. # Second target native compiler
  267. #
  268. # 3. Source CPU <> Target CPU
  269. # First source native compiler
  270. # Second cross compiler
  271. # Third target native compiler
  272. #
  273. #####################################################################
  274. ifeq ($(CPU_SOURCE),$(PPC_TARGET))
  275. ifeq ($(OS_SOURCE),$(OS_TARGET))
  276. ##########################
  277. # Normal cycle
  278. #
  279. ifndef DIFFRESULT
  280. next :
  281. @echo $(OLDFPC) and $(FPC) are equal
  282. $(COPY) $(FPC) $(EXENAME)
  283. else
  284. next :
  285. $(MAKE) execlean
  286. $(MAKE) -C $(UNITDIR_RTL) clean
  287. $(MAKE) -C $(UNITDIR_RTL) 'FPC=$(FPC)' 'OPT=$(RTLOPTS)'
  288. $(MAKE) clean
  289. $(MAKE) $(EXENAME)
  290. $(MAKE) echotime
  291. endif
  292. $(TEMPNAME1) : $(EXENAME)
  293. -$(DEL) $(TEMPNAME1)
  294. $(MOVE) $(EXENAME) $(TEMPNAME1)
  295. $(TEMPNAME2) : $(TEMPNAME1)
  296. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME1)' 'OLDFPC=' next
  297. -$(DEL) $(TEMPNAME2)
  298. $(MOVE) $(EXENAME) $(TEMPNAME2)
  299. $(TEMPNAME3) : $(TEMPNAME2)
  300. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME2)' 'OLDFPC=$(BASEDIR)/$(TEMPNAME1)' next
  301. -$(DEL) $(TEMPNAME3)
  302. $(MOVE) $(EXENAME) $(TEMPNAME3)
  303. # This target remakes the units with the currently made version
  304. remake: $(EXENAME)
  305. $(MOVE) $(EXENAME) $(TEMPNAME)
  306. $(MAKE) execlean
  307. $(MAKE) -C $(UNITDIR_RTL) clean
  308. $(MAKE) clean
  309. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' all
  310. remake3: $(TEMPNAME3)
  311. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME3)' 'OLDFPC=$(BASEDIR)/$(TEMPNAME2)' next
  312. $(DIFF) $(TEMPNAME3) $(EXENAME)
  313. cycle:
  314. $(MAKE) clean
  315. $(MAKE) -C $(UNITDIR_RTL) clean
  316. $(MAKE) -C $(UNITDIR_RTL) 'OPT=$(RTLOPTS)' all
  317. $(MAKE) remake3
  318. $(MAKE) $(addsuffix _all,$(TARGET_DIRS)) 'FPC=$(BASEDIR)/$(EXENAME)'
  319. $(MAKE) echotime
  320. else
  321. ##########################
  322. # Cross Target cycle
  323. #
  324. cycle:
  325. # ppc (source native)
  326. $(MAKE) OS_TARGET=$(OS_SOURCE) rtlclean rtl
  327. $(MAKE) OS_TARGET=$(OS_SOURCE) EXENAME=$(TEMPNAME) clean compiler
  328. # ppcross<ARCH> (source native)
  329. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) rtlclean rtl
  330. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) EXENAME=$(PPCROSSNAME) clean compiler
  331. # ppc<ARCH> (target native)
  332. $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' rtlclean rtl
  333. $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' clean compiler
  334. endif
  335. else
  336. ##########################
  337. # Cross CPU cycle
  338. #
  339. # ppc1 = native
  340. # ppc2 = cross running on this platform
  341. # ppc3/ppcXXX = native
  342. #
  343. cycle:
  344. # ppc (source native)
  345. $(MAKE) OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) rtlclean rtl
  346. $(MAKE) OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) EXENAME=$(TEMPNAME) clean compiler
  347. # ppcross<ARCH> (source native)
  348. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) rtlclean rtl
  349. $(MAKE) 'FPC=$(BASEDIR)/$(TEMPNAME)' OS_TARGET=$(OS_SOURCE) CPU_TARGET=$(CPU_SOURCE) PPC_TARGET=$(CPU_TARGET) EXENAME=$(PPCROSSNAME) clean compiler
  350. # ppc<ARCH> (target native)
  351. $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' rtlclean rtl
  352. $(MAKE) 'FPC=$(BASEDIR)/$(PPCROSSNAME)' clean compiler
  353. endif
  354. cycledep:
  355. $(MAKE) cycle USEDEPEND=1
  356. cvstest:
  357. $(MAKE) cycle 'LOCALOPT=-n -Se' 'RTLOPTS=-n -Se'
  358. ##########################
  359. # Full cycle
  360. #
  361. # 1. build a compiler using cycle
  362. # 2. remove all .ppufiles
  363. # 3. build all supported cross compilers except the
  364. # current PPC_TARGET which was already build
  365. #
  366. full: fullcycle
  367. fullcycle:
  368. $(MAKE) cycle
  369. $(MAKE) ppuclean
  370. $(MAKE) $(filter-out $(PPC_TARGET),$(CYCLETARGETS)) 'FPC=$(BASEDIR)/$(EXENAME)'
  371. #####################################################################
  372. # Docs
  373. #####################################################################
  374. htmldocs:
  375. $(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
  376. #####################################################################
  377. # Installation
  378. #####################################################################
  379. .PHONY: quickinstall install installsym
  380. MSGINSTALLDIR=$(INSTALL_BASEDIR)/msg
  381. override PPEXEFILE:=$(wildcard $(EXENAME))
  382. # This will only install the ppc386.exe, not the message files etc.
  383. quickinstall: $(addsuffix _install,$(TARGET_DIRS))
  384. # Install ppc386.exe
  385. ifneq ($(PPEXEFILE),)
  386. ifdef UPXPROG
  387. -$(UPXPROG) $(EXENAME)
  388. endif
  389. ifdef UNIXINSTALLDIR
  390. $(MKDIR) $(INSTALL_BASEDIR)
  391. $(INSTALLEXE) $(EXENAME) $(INSTALL_BASEDIR)
  392. else
  393. $(MKDIR) $(INSTALL_BINDIR)
  394. $(INSTALLEXE) $(EXENAME) $(INSTALL_BINDIR)
  395. endif
  396. endif
  397. install: quickinstall
  398. ifdef UNIXINSTALLDIR
  399. $(MKDIR) $(INSTALL_BASEDIR)
  400. $(INSTALLEXE) $(COMPILERUTILSDIR)/samplecfg $(INSTALL_BASEDIR)/samplecfg
  401. endif
  402. $(MKDIR) $(MSGINSTALLDIR)
  403. $(INSTALL) $(MSGFILES) $(MSGINSTALLDIR)
  404. # this also installs the link /usr/bin/ppc386. The .deb does that later
  405. installsymlink: install
  406. ifdef UNIXINSTALLDIR
  407. $(MKDIR) $(INSTALL_BINDIR)
  408. ln -sf $(INSTALL_BASEDIR)/ppc386 $(INSTALL_BINDIR)/ppc386
  409. endif
  410. #####################################################################
  411. # RTL
  412. #####################################################################
  413. .PHONY: rtl rtlclean rtlinstall
  414. rtl:
  415. $(MAKE) -C $(UNITDIR_RTL) 'OPT=$(RTLOPTS)' all
  416. rtlclean:
  417. $(MAKE) -C $(UNITDIR_RTL) clean
  418. rtlinstall:
  419. $(MAKE) -C $(UNITDIR_RTL) install
  420. #####################################################################
  421. # local user configurable file
  422. # in makefile.loc you can add any desired target
  423. #####################################################################
  424. localmake:=$(strip $(wildcard makefile.loc))
  425. ifdef localmake
  426. include ./$(localmake)
  427. endif