#
#   Makefile.fpc for Free Pascal Source Tree
#

[package]
name=fpc
version=1.9.2

[target]
dirs=compiler rtl utils fcl fv packages ide installer

[install]
fpcpackage=y

[default]
fpcdir=.
rule=help

[prerules]
# make versions < 3.77 (OS2 version) are buggy
ifndef inOS2
override FPCDIR:=$(BASEDIR)
export FPCDIR
endif

# New ppc386 (or ppc68k if on m68k machine !)
ifndef PPNEW
ifeq ($(CPU_TARGET),m68k)
PPSUF=68k
endif
ifeq ($(CPU_TARGET),i386)
PPSUF=386
endif
ifeq ($(CPU_TARGET),powerpc)
PPSUF=ppc
endif
ifeq ($(CPU_TARGET),alpha)
PPSUF=axp
endif

# cross compilers uses full cpu_target, not just ppc-suffix.
ifneq ($(OS_TARGET),$(OS_SOURCE))
PPPRE=ppcross
else
ifneq ($(CPU_TARGET),$(CPU_SOURCE))
PPPRE=ppcross
else
PPPRE=ppc
endif
endif

PPNEW=$(BASEDIR)/compiler/$(PPPRE)$(PPSUF)$(SRCEXEEXT)
endif

# Check if install/ subdir is available
ifneq ($(wildcard install),)
CVSINSTALL=install
else
CVSINSTALL=.
endif

# Install target
ifdef SNAPSHOT
INSTALLTARGET=install
else
INSTALLTARGET=distinstall
endif

# All target
ifdef SNAPSHOT
ALLTARGET=all
else
ifndef ALLTARGET
ifeq ($(OS_TARGET),win32)
ALLTARGET=smart
else
ifeq ($(OS_TARGET),go32v2)
ALLTARGET=smart
else
ifeq ($(OS_TARGET),linux)
ALLTARGET=smart
else
ifeq ($(OS_TARGET),freebsd)
ALLTARGET=smart
else
ifeq ($(OS_TARGET),netbsd)
ALLTARGET=smart
else
ifeq ($(OS_TARGET),openbsd)
ALLTARGET=smart
else
ALLTARGET=all
endif
endif
endif
endif
endif
endif
endif
endif

# Stop with an error?
ifdef SNAPSHOT
NOSTOP=-
else
NOSTOP=
endif

# Prefix for units
ifeq ($(OS_TARGET),linux)
PKGPRE=units
else
ifeq ($(OS_TARGET),freebsd)
PKGPRE=units
else
ifeq ($(OS_TARGET),netbsd)
PKGPRE=units
else
ifeq ($(OS_TARGET),openbsd)
PKGPRE=units
else
PKGPRE=u
endif
endif
endif
endif

# Always compile for release
override RELEASE=1
export RELEASE

# We want to have the resulting .zips in the current dir
ifndef DIST_DESTDIR
export DIST_DESTDIR:=$(BASEDIR)
endif

# Temporary path to pack a file
BASEPACKDIR=$(BASEDIR)/basepack

# Newly created fpcmake
TEMPMAKENEW=$(BASEDIR)/utils/fpcm/fpcmake$(EXEEXT)
ifneq ($(CPU_SOURCE),$(CPU_TARGET))
TEMPMAKENEW=fpcmake
endif
ifneq ($(OS_SOURCE),$(OS_TARGET))
TEMPMAKENEW=fpcmake
endif
FPCMAKENEW=$(TEMPMAKENEW)

# Build/install options
CLEANOPTS=FPC=$(PPNEW)
BUILDOPTS=FPC=$(PPNEW) RELEASE=1
INSTALLOPTS=FPC=$(PPNEW) ZIPDESTDIR=$(BASEDIR) FPCMAKE=$(FPCMAKENEW)

# Compile also IDE (check for ide and fv dir)
ifneq ($(wildcard ide),)
ifneq ($(wildcard fv),)
ifeq ($(OS_TARGET),go32v2)
IDE=1
endif
ifeq ($(OS_TARGET),win32)
IDE=1
endif
ifeq ($(OS_TARGET),linux)
IDE=1
endif
# is now doable too.
ifeq ($(OS_TARGET),freebsd)
IDE=1
endif
ifeq ($(OS_TARGET),os2)
IDE=1
endif
ifeq ($(OS_TARGET),emx)
IDE=1
endif
endif
endif


[rules]
# These values can change
unexport FPC_VERSION OS_SOURCE

# Only process directories that really exists
override TARGET_DIRS:=$(wildcard $(TARGET_DIRS))

#####################################################################
# Main targets
#####################################################################

.PHONY: help checkfpcdir

help:
        @$(ECHO)
        @$(ECHO) Directory targets:
        @$(ECHO)
        @$(ECHO) $(TARGET_DIRS)
        @$(ECHO)
        @$(ECHO) Packing targets are:
        @$(ECHO)
        @$(ECHO) go32v2zip,win32zip,linuxzip,freebsdzip,sourcezip,os2zip,emxzip,beoszip,sunoszip,qnxzip,amigazip
        @$(ECHO)
        @exit


#####################################################################
# Dependencies
#####################################################################

#######################################
# Compiler
#######################################

.PHONY: compiler_cycle

compiler_cycle:
        $(MAKE) -C compiler cycle


#######################################
# Packages
#######################################

.PHONY: packages_base_all packages_extra_all \
        packages_base_smart packages_extra_smart

packages_base_all:
        $(MAKE) -C packages base_all

packages_base_smart:
        $(MAKE) -C packages base_smart

packages_extra_all:
        $(MAKE) -C packages extra_all

packages_extra_smart:
        $(MAKE) -C packages extra_smart


#######################################
# Install targets
#######################################

demo_install:
        $(MAKE) -C $(CVSINSTALL)/demo sourceinstall

man_install:
        $(MAKE) -C $(CVSINSTALL)/man installman

doc_install:
        $(MAKE) -C $(CVSINSTALL)/doc installdoc


#######################################
# Packaging targets
#######################################

optzips: optcompinstall optcompzip

optcompinstall:
        $(MAKE) compiler_cycle OPT=-dNEWOPTIMIZATIONS
        $(MAKE) compiler_install
        $(MAKE) rtl_install

optcompzip:
        $(MAKE) fpc_zipinstall PACKAGENAME=optcomp ZIPTARGET=optcompinstall


##########################################################################
# Packaging
##########################################################################

.PHONY: all clean distclean build install installbase zipinstall zipinstallbase zipinstallfcl \
        zipinstallpackages

all: build

clean: $(addsuffix _distclean,$(TARGET_DIRS))
        $(DEL) build-stamp.$(OS_TARGET)

distclean: clean

build: build-stamp.$(OS_TARGET)
build-stamp.$(OS_TARGET):
# create new compiler
        $(MAKE) compiler_cycle RELEASE=1
# clean
        $(MAKE) rtl_clean $(CLEANOPTS)
        $(MAKE) packages_clean $(CLEANOPTS)
        $(MAKE) fcl_clean $(CLEANOPTS)
        $(MAKE) utils_clean $(CLEANOPTS)
ifdef IDE
        $(MAKE) fv_clean $(CLEANOPTS)
        $(MAKE) ide_clean $(CLEANOPTS)
endif
# build everything
        $(MAKE) rtl_$(ALLTARGET) $(BUILDOPTS)
        $(MAKE) packages_base_$(ALLTARGET) $(BUILDOPTS)
        $(MAKE) fcl_$(ALLTARGET) $(BUILDOPTS)
        $(MAKE) packages_extra_$(ALLTARGET) $(BUILDOPTS)
        $(MAKE) utils_all $(BUILDOPTS)
ifdef IDE
        $(MAKE) fv_all $(BUILDOPTS)
        $(MAKE) ide_all $(BUILDOPTS)
        $(MAKE) installer_all $(BUILDOPTS)
endif
        $(ECHOREDIR) Build > build-stamp.$(OS_TARGET)

installbase: build-stamp.$(OS_TARGET)
# create dirs
        $(MKDIR) $(INSTALL_BASEDIR)
        $(MKDIR) $(INSTALL_DOCDIR)
        $(MKDIR) $(INSTALL_BINDIR)
ifndef SNAPSHOT
# readme & whatsnew and docs
        -$(COPY) $(CVSINSTALL)/doc/*.txt $(CVSINSTALL)/doc/copying* $(CVSINSTALL)/doc/faq.* $(INSTALL_DOCDIR)
# bingo32 (cwsdpmi,wmemu387.dxe)
ifeq ($(OS_TARGET),go32v2)
        $(COPY) $(CVSINSTALL)/bingo32/*.dxe $(INSTALL_BINDIR)
        $(COPY) $(CVSINSTALL)/bingo32/*.exe $(INSTALL_BINDIR)
endif
# binw32 (cygwin1.dll,*.ico)
ifeq ($(OS_TARGET),win32)
        $(COPY) $(CVSINSTALL)/binw32/*.ico $(INSTALL_BINDIR)
        $(COPY) $(CVSINSTALL)/binw32/*.dll $(INSTALL_BINDIR)
endif
# manpages for UNIX systems
ifeq ($(OS_TARGET),linux)
        $(MAKE) -C $(CVSINSTALL)/man installman
endif
ifeq ($(OS_TARGET),freebsd)
        $(MAKE) -C $(CVSINSTALL)/man installman
endif
ifeq ($(OS_TARGET),sunos)
        $(MAKE) -C $(CVSINSTALL)/man installman
endif
ifeq ($(OS_TARGET),qnx)
        $(MAKE) -C $(CVSINSTALL)/man installman
endif
endif
# install generated things
        $(MAKE) compiler_$(INSTALLTARGET) $(INSTALLOPTS)
        $(MAKE) rtl_$(INSTALLTARGET) $(INSTALLOPTS)

install: build-stamp.$(OS_TARGET)
        $(MAKE) installbase $(INSTALLOPTS)
        $(MAKE) packages_$(INSTALLTARGET) $(INSTALLOPTS)
        $(MAKE) fcl_$(INSTALLTARGET) $(INSTALLOPTS)
        $(MAKE) utils_$(INSTALLTARGET) $(INSTALLOPTS)
ifdef IDE
        $(NOSTOP)$(MAKE) ide_$(INSTALLTARGET) $(BUILDOPTS)
endif

zipinstall: build-stamp.$(OS_TARGET)
        $(MAKE) fpc_zipinstall ZIPTARGET=installbase ZIPNAME=base$(ZIPSUFFIX) $(INSTALLOPTS)
        $(MAKE) packages_zip$(INSTALLTARGET) $(INSTALLOPTS) ZIPPREFIX=$(PKGPRE)
        $(MAKE) fcl_zip$(INSTALLTARGET) $(INSTALLOPTS) ZIPPREFIX=$(PKGPRE)
        $(MAKE) utils_zip$(INSTALLTARGET) $(INSTALLOPTS) ZIPNAME=util$(ZIPSUFFIX)
ifdef IDE
        $(NOSTOP)$(MAKE) ide_zip$(INSTALLTARGET) $(INSTALLOPTS) ZIPNAME=ide$(ZIPSUFFIX)
endif


##########################################################################
# Docs
##########################################################################

.PHONY: docspdf docs docsrcinstall docsrc

# We don't want the package name fpc in the path
DOCSOURCEDIR=$(INSTALL_SOURCEDIR)/../docs

docspdf:
        $(MAKE) -C docs pdfinstall DOCINSTALLDIR=$(PACKDIR)

docs:
        $(MAKE) fpc_zipinstall ZIPTARGET=docspdf ZIPNAME=docs

docsrcinstall:
        $(MAKE) -C docs clean
        $(MKDIR) $(DOCSOURCEDIR)
        $(COPYTREE) docs/* $(DOCSOURCEDIR)

docsrc:
        $(MAKE) fpc_zipinstall ZIPTARGET=docsrcinstall ZIPNAME=docsrc


##########################################################################
# Demos
##########################################################################

.PHONY: demozip

# We don't want the package name fpc in the path
ifdef UNIXINSTALLDIR
DEMOSOURCEDIR=$(INSTALL_DOCDIR)/../demo
else
DEMOSOURCEDIR=$(INSTALL_PREFIX)/demo
endif

demosrcinstall:
        $(MAKE) -C demo clean
        $(MKDIR) $(DEMOSOURCEDIR)
        $(COPYTREE) demo/* $(DEMOSOURCEDIR)

demozip:
        $(MAKE) fpc_zipinstall ZIPTARGET=demosrcinstall ZIPNAME=demo


##########################################################################
# Source targets
##########################################################################

.PHONY: sourcebase sourcezip

# We don't want the fpc/ package prefix
INSTALL_BASESOURCEDIR=$(INSTALL_SOURCEDIR)/..

sourcebase:
# base Makefiles needed for sources
        $(MKDIR) $(INSTALL_BASESOURCEDIR)
        $(MKDIR) $(INSTALL_BASESOURCEDIR)/rtl
        $(MKDIR) $(INSTALL_BASESOURCEDIR)/packages
        $(MKDIR) $(INSTALL_BASESOURCEDIR)/packages/base
        $(MKDIR) $(INSTALL_BASESOURCEDIR)/packages/extra
        $(COPY) Makefile*  $(INSTALL_BASESOURCEDIR)
        $(COPY) rtl/Makefile* $(INSTALL_BASESOURCEDIR)/rtl
        $(COPY) packages/Makefile* $(INSTALL_BASESOURCEDIR)/packages
        $(COPY) packages/base/Makefile* $(INSTALL_BASESOURCEDIR)/packages/base
        $(COPY) packages/extra/Makefile* $(INSTALL_BASESOURCEDIR)/packages/extra

sourcezip:
        $(MAKE) fpc_zipinstall ZIPTARGET=sourcebase ZIPNAME=basesrc
        $(MAKE) compiler_zipsourceinstall
        $(MAKE) rtl_zipsourceinstall
        $(MAKE) packages_zipsourceinstall ZIPPREFIX=$(PKGPRE)
        $(MAKE) fcl_zipsourceinstall
        $(MAKE) utils_zipsourceinstall
        $(MAKE) ide_zipsourceinstall
        $(MAKE) installer_zipsourceinstall


##########################################################################
# OS targets
##########################################################################

.PHONY: go32v2 win32 linux freebsd os2 emx netbsd openbsd go32v2zip win32zip linuxzip freebsdzip os2zip emxzip netbsdzip openbsdzip

go32v2: checkfpcdir
        $(MAKE) install OS_TARGET=go32v2

win32: checkfpcdir
        $(MAKE) install OS_TARGET=win32

linux: checkfpcdir
        $(MAKE) install OS_TARGET=linux

freebsd: checkfpcdir
        $(MAKE) install OS_TARGET=freebsd

netbsd: checkfpcdir
        $(MAKE) install OS_TARGET=netbsd

openbsd: checkfpcdir
        $(MAKE) install OS_TARGET=openbsd

os2: checkfpcdir
        $(MAKE) install OS_TARGET=os2

emx: checkfpcdir
        $(MAKE) install OS_TARGET=emx

sunos: checkfpcdir
        $(MAKE) install OS_TARGET=sunos

go32v2zip: checkfpcdir
        $(MAKE) zipinstall OS_TARGET=go32v2

win32zip: checkfpcdir
        $(MAKE) zipinstall OS_TARGET=win32

linuxzip: checkfpcdir
        $(MAKE) zipinstall OS_TARGET=linux

freebsdzip : checkfpcdir
        $(MAKE) zipinstall OS_TARGET=freebsd

netbsdzip : checkfpcdir
        $(MAKE) zipinstall OS_TARGET=netbsd

openbsdzip : checkfpcdir
        $(MAKE) zipinstall OS_TARGET=openbsd

beoszip : checkfpcdir
        $(MAKE) zipinstall OS_TARGET=beos USEZIP=1

os2zip: checkfpcdir
        $(MAKE) zipinstall OS_TARGET=os2

emxzip: checkfpcdir
        $(MAKE) zipinstall OS_TARGET=emx

sunoszip: checkfpcdir
        $(MAKE) zipinstall OS_TARGET=sunos TARPROG=gtar

qnxzip: checkfpcdir
                $(MAKE) zipinstall OS_TARGET=qnx

amigazip: checkfpcdir
                $(MAKE) zipinstall OS_TARGET=amiga

##########################################################################
# Dos, OS/2 Short 8.3 Names
##########################################################################

.PHONY: renametoshort shortsrc shortbin shortnames

renametoshort:
# Compiler parts
        -mv compiler$(ZIPSUFFIX).zip comp$(ZIPSUFFIX).zip
        -mv utils$(ZIPSUFFIX).zip util$(ZIPSUFFIX).zip
        -mv installer$(ZIPSUFFIX).zip inst$(ZIPSUFFIX).zip
# Packages
        -mv ugdbint$(ZIPSUFFIX).zip ugdb$(ZIPSUFFIX).zip
        -mv uregexpr$(ZIPSUFFIX).zip ureg$(ZIPSUFFIX).zip
        -mv upaszlib$(ZIPSUFFIX).zip upzl$(ZIPSUFFIX).zip
        -mv uuncgi$(ZIPSUFFIX).zip ucgi$(ZIPSUFFIX).zip
        -mv uunzip$(ZIPSUFFIX).zip uzip$(ZIPSUFFIX).zip
        -mv unetdb$(ZIPSUFFIX).zip undb$(ZIPSUFFIX).zip
        -mv uftpapi$(ZIPSUFFIX).zip uftp$(ZIPSUFFIX).zip
        -mv uhwvideo$(ZIPSUFFIX).zip uhwv$(ZIPSUFFIX).zip

shortsrc:
        $(MAKE) renametoshort ZIPSUFFIX=src

shortbin:
        $(MAKE) renametoshort

shortnames: shortsrc shortbin

##########################################################################
# Debian
##########################################################################

ifdef inUnix

ifneq ($(wildcard $(CVSINSTALL)/debian/changelog),)

.PHONY: debcopy deb

DEBPACKAGEVERSION:=$(shell head -n 1 $(CVSINSTALL)/debian/changelog | awk '{ print $$2 }' | tr -d '[()]')
DEBFPCVERSION:=$(shell echo $(DEBPACKAGEVERSION) | awk -F '-' '{ print $$1 }')
DEBSRCDIR:=/usr/src/fpc-$(DEBFPCVERSION)

debcopy: distclean
        rm -rf $(DEBSRCDIR)
        install -d $(DEBSRCDIR)
        $(COPYTREE) compiler $(DEBSRCDIR)
        $(COPYTREE) rtl $(DEBSRCDIR)
        $(COPYTREE) fcl $(DEBSRCDIR)
        $(COPYTREE) packages $(DEBSRCDIR)
        $(COPYTREE) utils $(DEBSRCDIR)
        $(COPYTREE) demo $(DEBSRCDIR)
        $(COPYTREE) logs $(DEBSRCDIR)
        $(COPYTREE) docs $(DEBSRCDIR)
        $(COPYTREE) Makefile* $(DEBSRCDIR)
        $(COPYTREE) $(CVSINSTALL)/debian $(DEBSRCDIR)
        $(COPYTREE) $(CVSINSTALL)/man $(DEBSRCDIR)
        $(COPYTREE) $(CVSINSTALL)/doc $(DEBSRCDIR)
        find $(DEBSRCDIR) -name 'CVS*' | xargs -n1 rm -rf
        chmod 755 $(DEBSRCDIR)/debian/rules

deb: checkfpcdir debcopy
        cd $(DEBSRCDIR) ; debian/rules binary

endif   # changelog found

endif


##########################################################################
# RPM
##########################################################################

ifdef inUnix

ifneq ($(wildcard $(CVSINSTALL)/fpc.spec),)

.PHONY: rpmcopy rpm

RPMFPCVERSION:=$(shell grep '^Version:' $(CVSINSTALL)/fpc.spec | awk '{ print $$2 }')

# Only the recent rpms have rpmbuild
RPMBUILD=$(strip $(wildcard $(addsuffix /rpmbuild,$(SEARCHPATH))))
ifeq ($(RPMBUILD),)
RPMBUILD=$(strip $(wildcard $(addsuffix /rpm,$(SEARCHPATH))))
endif
REDHATDIR=/usr/src/redhat
# Debian has /usr/src/rpm
ifeq ($(wildcard $(REDHATDIR)),)
REDHATDIR=/usr/src/rpm
endif
RPMSOURCESDIR:=$(REDHATDIR)/SOURCES
RPMSPECDIR:=$(REDHATDIR)/SPECS
RPMSRCDIR:=$(RPMSOURCESDIR)/fpc
rpmcopy: distclean
        # false || is needed to workaround fpcmake sections
        false || [ -d $(REDHATDIR) ] || install -d $(REDHATDIR)
        false || [ -d $(RRPMSPECDIR) ] || install -d $(RPMSPECDIR)
        false || [ -d $(RPMSOURCESDIR) ] || install -d $(RPMSOURCESDIR)
        rm -rf $(RPMSRCDIR)
        cp $(CVSINSTALL)/fpc.spec $(RPMSPECDIR)/fpc-$(RPMFPCVERSION).spec
ifndef NODOCS
        cat $(CVSINSTALL)/fpcdoc.spec >> $(RPMSPECDIR)/fpc-$(RPMFPCVERSION).spec
endif
        install -d $(RPMSRCDIR)
        $(COPYTREE) compiler $(RPMSRCDIR)
        $(COPYTREE) rtl $(RPMSRCDIR)
        $(COPYTREE) fcl $(RPMSRCDIR)
        $(COPYTREE) packages $(RPMSRCDIR)
        $(COPYTREE) utils $(RPMSRCDIR)
        $(COPYTREE) demo $(RPMSRCDIR)
        $(COPYTREE) logs $(RPMSRCDIR)
        $(COPYTREE) Makefile* $(RPMSRCDIR)
        $(COPYTREE) $(CVSINSTALL)/man $(RPMSRCDIR)
        $(COPYTREE) $(CVSINSTALL)/doc $(RPMSRCDIR)
        $(COPY) $(CVSINSTALL)/smart_strip.sh $(RPMSRCDIR)
        chmod +x $(RPMSRCDIR)/smart_strip.sh
ifndef NODOCS
        $(COPYTREE) docs $(RPMSRCDIR)
endif
        find $(RPMSRCDIR) -name 'CVS*' | xargs -n1 rm -rf
        cd $(RPMSRCDIR) ; tar cvz * > $(RPMSOURCESDIR)/fpc-$(RPMFPCVERSION)-src.tar.gz
        rm -rf $(RPMSRCDIR)

rpm: checkfpcdir rpmcopy
        cd $(RPMSPECDIR) ; $(RPMBUILD) --nodeps -ba fpc-$(RPMFPCVERSION).spec

endif   # spec found

endif