# # $Id$ # Copyright (c) 1998 by the Free Pascal Development Team # # Common makefile for Free Pascal # # See the file COPYING.FPC, included in this distribution, # for details about the copyright. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # ##################################################################### # Force default settings ##################################################################### # Latest release version override RELEASEVER:=0.99.9 ##################################################################### # Autodetect OS (Linux or Dos or Windows NT) # define inlinux when running under linux # define inWinNT when running under WinNT ##################################################################### PWD=$(strip $(wildcard $(addsuffix /pwd.exe,$(subst ;, ,$(PATH))))) ifeq ($(PWD),) PWD=$(strip $(wildcard $(addsuffix /pwd,$(subst :, ,$(PATH))))) ifeq ($(PWD),) nopwd: @echo @echo You need the GNU pwd,cp,mv,rm,install utils to use this makefile! @echo Get ftp://tflily.fys.kuleuven.ac.be/pub/fpc/dist/gnuutils.zip @echo @exit else inlinux=1 endif else PWD:=$(subst \,/,$(firstword $(PWD))) endif # Detect NT - NT sets OS to Windows_NT ifndef inlinux ifeq ($(OS),Windows_NT) inWinNT=1 endif endif ##################################################################### # Targets ##################################################################### # Target OS ifndef OS_TARGET ifdef inlinux OS_TARGET=linux else ifdef inWinNT OS_TARGET=win32 else OS_TARGET=go32v2 endif endif endif # Source OS ifndef OS_SOURCE ifdef inlinux OS_SOURCE=linux else ifndef inWinNT OS_SOURCE=win32 else OS_SOURCE=go32v2 endif endif endif # CPU ifndef CPU CPU=i386 endif # Options ifndef OPT OPT= endif # What compiler to use ? ifndef PP PP=ppc386 endif # assembler, redefine it if cross compiling ifndef AS AS=as endif # linker, but probably not used ifndef LD LD=ld endif # Release ? Then force OPT and don't use extra opts via commandline ifdef RELEASE override OPT:=-Xs -OG2p2 -n endif # Verbose settings (warning,note,info) ifdef VERBOSE override OPT+=-vwni endif ##################################################################### # Shell commands ##################################################################### # To copy pograms ifndef COPY COPY=cp -fp endif # To move pograms ifndef MOVE MOVE=mv -f endif # Check delete program ifndef DEL DEL=rm -f endif # Check deltree program ifndef DELTREE DELTREE=rm -rf endif # To install files ifndef INSTALL ifdef inlinux INSTALL=install -m 644 else INSTALL=$(COPY) # ginstall has the strange thing to stubify all .o files ! #INSTALL=ginstall -m 644 endif endif # To install programs ifndef INSTALLEXE ifdef inlinux INSTALLEXE=install -m 755 else INSTALLEXE=$(COPY) # ginstall has the strange thing to stubify all .o files ! #INSTALLEXE=ginstall -m 755 endif endif # To make a directory. ifndef MKDIR ifdef inlinux MKDIR=install -m 755 -d else MKDIR=ginstall -m 755 -d endif endif ##################################################################### # Default Tools ##################################################################### # ppas.bat / ppas.sh ifdef inlinux PPAS=ppas.sh else PPAS=ppas.bat endif # ldconfig to rebuild .so cache ifdef inlinux LDCONFIG=ldconfig else LDCONFIG= endif # Where is the ppumove program ? ifndef PPUMOVE PPUMOVE=ppumove endif # diff ifndef DIFF DIFF=diff endif # date ifndef DATE # first try go32v2 specific gdate DATE=$(strip $(wildcard $(addsuffix /gdate.exe,$(subst ;, ,$(PATH))))) # try generic date.exe ifeq ($(DATE),) DATE=$(strip $(wildcard $(addsuffix /date.exe,$(subst ;, ,$(PATH))))) # finally try for linux ifeq ($(DATE),) DATE=$(strip $(wildcard $(addsuffix /date,$(subst :, ,$(PATH))))) ifeq ($(DATE),) DATE= endif else DATE:=$(subst \,/,$(firstword $(DATE))) endif else DATE:=$(subst \,/,$(firstword $(DATE))) endif endif # Sed ifndef SED SED=$(strip $(wildcard $(addsuffix /sed.exe,$(subst ;, ,$(PATH))))) ifeq ($(SED),) SED=$(strip $(wildcard $(addsuffix /sed,$(subst :, ,$(PATH))))) ifeq ($(SED),) SED= endif else SED:=$(subst \,/,$(firstword $(SED))) endif endif ##################################################################### # Default Directories ##################################################################### # Base dir ifdef PWD BASEDIR=$(shell $(PWD)) endif # set the directory to the rtl base ifndef RTLDIR ifdef RTL RTLDIR=$(RTL) else RTLDIR:=$(BASEDIR)/../rtl endif endif # specify where units are. ifndef UNITDIR UNITDIR=$(RTLDIR)/$(OS_TARGET) ifeq ($(OS_TARGET),go32v1) UNITDIR=$(RTLDIR)/dos/go32v1 endif ifeq ($(OS_TARGET),go32v2) UNITDIR=$(RTLDIR)/dos/go32v2 endif endif # set the prefix directory where to install everything ifndef PREFIXINSTALLDIR ifdef inlinux PREFIXINSTALLDIR=/usr else PREFIXINSTALLDIR=/pp endif endif # set the base directory where to install everything ifndef BASEINSTALLDIR ifdef inlinux BASEINSTALLDIR=$(PREFIXINSTALLDIR)/lib/fpc/$(RELEASEVER) else BASEINSTALLDIR=$(PREFIXINSTALLDIR) endif endif ##################################################################### # Install Directories based on BASEINSTALLDIR ##################################################################### # Linux binary really goes to baseinstalldir ifndef LIBINSTALLDIR ifdef inlinux LIBINSTALLDIR=$(BASEINSTALLDIR) else LIBINSTALLDIR=$(BASEINSTALLDIR)/lib endif endif # set the directory where to install the binaries ifndef BININSTALLDIR ifdef inlinux BININSTALLDIR=$(PREFIXINSTALLDIR)/bin else BININSTALLDIR=$(BASEINSTALLDIR)/bin/$(OS_TARGET) endif endif # set the directory where to install the units. ifndef UNITINSTALLDIR ifdef inlinux UNITINSTALLDIR=$(BASEINSTALLDIR)/linuxunits else UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET) endif endif # set the directory where to install the units. ifndef STATIC_UNITINSTALLDIR ifdef inlinux STATIC_UNITINSTALLDIR=$(BASEINSTALLDIR)/staticunits else STATIC_UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)/static endif endif # set the directory where to install the units. ifndef SHARED_UNITINSTALLDIR ifdef inlinux SHARED_UNITINSTALLDIR=$(BASEINSTALLDIR)/sharedunits else SHARED_UNITINSTALLDIR=$(BASEINSTALLDIR)/rtl/$(OS_TARGET)/shared endif endif # set the directory where to install the libs (must exist) ifndef STATIC_LIBINSTALLDIR ifdef inlinux STATIC_LIBINSTALLDIR=$(BASEINSTALLDIR)/staticunits else STATIC_LIBINSTALLDIR=$(STATIC_UNITINSTALLDIR) endif endif # set the directory where to install the libs (must exist) ifndef SHARED_LIBINSTALLDIR ifdef inlinux SHARED_LIBINSTALLDIR=$(PREFIXINSTALLDIR)/lib else SHARED_LIBINSTALLDIR=$(SHARED_UNITINSTALLDIR) endif endif # Where the .msg files will be stored ifndef MSGINSTALLDIR ifdef inlinux MSGINSTALLDIR=$(BASEINSTALLDIR)/msg else MSGINSTALLDIR=$(BININSTALLDIR) endif endif # Where the doc files will be stored ifndef DOCINSTALLDIR ifdef inlinux DOCINSTALLDIR=$(PREFIXINSTALLDIR)/doc/fpc/$(RELEASEVER) else DOCINSTALLDIR=$(BASEINSTALLDIR)/doc endif endif ##################################################################### # Compiler Command Line ##################################################################### # Load commandline OPTDEF and add CPU define override PPOPTDEF=$(OPTDEF) -d$(CPU) # Load commandline OPT and add target and unit dir to be sure override PPOPT=$(OPT) -T$(OS_TARGET) -Fu$(UNITDIR) $(NEEDOPT) # Add include dirs INC and PROCINC ifdef INC override PPOPT+=-I$(INC) endif ifdef PROCINC override PPOPT+=-I$(PROCINC) endif ifdef OSINC override PPOPT+=-I$(OSINC) endif # Target dirs ifdef TARGETDIR override PPOPT+=-FE$(TARGETDIR) endif ifdef UNITTARGETDIR override PPOPT+=-FU$(UNITTARGETDIR) endif # Smartlinking ifeq ($(SMARTLINK),YES) ifeq ($(LIBTYPE),shared) override SMARTLINK=NO else override PPOPT+=-Cx endif endif # Add library type, for static libraries smartlinking is automatic used ifeq ($(LIBTYPE),shared) override PPOPT+=-CD else ifeq ($(LIBTYPE),static) override PPOPT+=-CS endif endif # Add library name ifneq ($(LIBNAME),) override PPOPT:=$(PPOPT) -o$(LIBNAME) endif # Add defines from PPOPTDEF to PPOPT override PPOPT:=$(PPOPT) $(PPOPTDEF) # Was a config file specified ? ifdef CFGFILE override PPOPT:=$(PPOPT) @$(CFGFILE) endif override COMPILER=$(PP) $(PPOPT) ##################################################################### # Default extensions ##################################################################### # Default needed extensions (Go32v2,Linux) PPLEXT=.ppl PPUEXT=.ppu OEXT=.o ASMEXT=.s SMARTEXT=.sl STATICLIBEXT=.a SHAREDLIBEXT=.so # Executable extension ifdef inlinux EXEEXT= else EXEEXT=.exe endif # Go32v1 ifeq ($(OS_TARGET),go32v1) PPUEXT=.pp1 OEXT=.o1 ASMEXT=.s1 SMARTEXT=.sl1 STATICLIBEXT=.a1 SHAREDLIBEXT=.so1 endif # Win32 ifeq ($(OS_TARGET),win32) PPUEXT=.ppw OEXT=.ow ASMEXT=.sw SMARTEXT=.slw STATICLIBEXT=.aw SHAREDLIBEXT=.dll endif # OS/2 ifeq ($(OS_TARGET),os2) PPUEXT=.ppo ASMEXT=.so2 OEXT=.o2 SMARTEXT=.so STATICLIBEXT=.ao SHAREDLIBEXT=.dll endif # determine libary extension. ifeq ($(LIBTYPE),static) LIBEXT=$(STATICLIBEXT) else LIBEXT=$(SHAREDLIBEXT) endif # library prefix LIBPREFIX=lib ifeq ($(OS_TARGET),go32v2) LIBPREFIX= endif ifeq ($(OS_TARGET),go32v1) LIBPREFIX= endif # determine with .pas extension is used ifdef EXEOBJECTS override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(EXEOBJECTS))))) else override TESTPAS:=$(strip $(wildcard $(addsuffix .pas,$(firstword $(UNITOBJECTS))))) endif ifeq ($(TESTPAS),) PASEXT=.pp else PASEXT=.pas endif ##################################################################### # Export commandline values, so nesting use the same values ##################################################################### export OS_SOURCE OS_TARGET OPT OPTDEF CPU PP RELEASE VERBOSE export SMARTLINK LIBTYPE LIBNAME export BASEINSTALLDIR ##################################################################### # General compile rules ##################################################################### # Create Filenames EXEFILES=$(addsuffix $(EXEEXT),$(EXEOBJECTS)) UNITFILES=$(addsuffix $(PPUEXT),$(UNITOBJECTS)) UNITOFILES=$(addsuffix $(OEXT),$(UNITOBJECTS)) .PHONY : all clean install \ info cfginfo objectinfo installinfo filesinfo .SUFFIXES : $(EXEEXT) $(PPUEXT) $(PASEXT) ifdef DEFAULTUNITS all: units else all: units exes endif units: $(UNITFILES) exes: $(EXEFILES) # General compile rules %$(PPUEXT): %$(PASEXT) $(COMPILER) $< %$(EXEEXT): %$(PASEXT) $(COMPILER) $< ##################################################################### # Install rules ##################################################################### install : all ifdef EXEOBJECTS $(MKDIR) $(BININSTALLDIR) $(INSTALLEXE) $(EXEFILES) $(BININSTALLDIR) endif ifdef UNITOBJECTS $(MKDIR) $(UNITINSTALLDIR) ifeq ($(SMARTLINK),YES) $(INSTALL) $(LIBPREFIX)$(LIBNAME)$(LIBEXT) $(UNITINSTALLDIR) else $(INSTALL) $(UNITFILES) $(UNITOFILES) $(UNITINSTALLDIR) endif endif ##################################################################### # Clean rules ##################################################################### clean: -$(DEL) *$(OEXT) *$(ASMEXT) *$(PPUEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) $(PPAS) link.res log -$(DELTREE) *$(SMARTEXT) ifdef EXEOBJECTS -$(DEL) $(EXEFILES) endif ##################################################################### # Depend rules ##################################################################### depend: makedep $(UNITOBJECTS) ##################################################################### # Info rules ##################################################################### info: cfginfo objectinfo installinfo cfginfo: @echo @echo == Configuration info == @echo @echo Source.... $(OS_SOURCE) @echo Target.... $(OS_TARGET) @echo Basedir... $(BASEDIR) @echo Pwd....... $(PWD) ifdef SED @echo Sed....... $(SED) endif @echo objectinfo: @echo @echo == Object info == @echo @echo UnitObjects... $(UNITOBJECTS) @echo ExeObjects.... $(EXEOBJECTS) @echo installinfo: @echo @echo == Install info == @echo @echo BaseInstallDir....... $(BASEINSTALLDIR) @echo BinInstallDir........ $(BININSTALLDIR) @echo UnitInstallDir....... $(UNITINSTALLDIR) @echo StaticUnitInstallDir. $(STATIC_UNITINSTALLDIR) @echo SharedUnitInstallDir. $(SHARED_UNITINSTALLDIR) @echo LibInstallDir........ $(LIBINSTALLDIR) @echo StaticLibInstallDir.. $(STATIC_LIBINSTALLDIR) @echo SharedLibInstallDir.. $(SHARED_LIBINSTALLDIR) @echo MsgInstallDir........ $(MSGINSTALLDIR) @echo DocInstallDir........ $(DOCINSTALLDIR) @echo # try to get the files in the currentdir PASFILES:=$(wildcard *.pas) PPFILES:=$(wildcard *.pp) INCFILES:=$(wildcard *.inc) MSGFILES:=$(wildcard *.msg) ASFILES:=$(wildcard *.as) filesinfo: @echo @echo == Files info == @echo ifdef PASFILES @echo Pas files are $(PASFILES) endif ifdef PPFILES @echo PP files are $(PPFILES) endif ifdef INCFILES @echo Inc files are $(INCFILES) endif ifdef MSGFILES @echo Msg files are $(MSGFILES) endif ifdef ASFILES @echo As files are $(ASFILES) endif