Browse Source

Merged revisions 7523,7525-7526,7531-7532 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7523 | peter | 2007-05-30 08:11:50 +0200 (Wed, 30 May 2007) | 2 lines

* move fpmake

........
r7525 | peter | 2007-05-30 08:30:51 +0200 (Wed, 30 May 2007) | 2 lines

* Makefiles moved

........
r7526 | peter | 2007-05-30 09:05:09 +0200 (Wed, 30 May 2007) | 2 lines

* fix compile

........
r7531 | peter | 2007-05-30 20:36:29 +0200 (Wed, 30 May 2007) | 2 lines

* merge everything in fpmkunit

........
r7532 | peter | 2007-05-30 20:38:44 +0200 (Wed, 30 May 2007) | 2 lines

* rename package to fpmkunit to not conflict with fpmake executable

........

git-svn-id: branches/fixes_2_2@7705 -

peter 18 years ago
parent
commit
96796db09f

+ 15 - 6
.gitattributes

@@ -765,12 +765,6 @@ packages/base/dbus/example/Makefile.fpc svneol=native#text/plain
 packages/base/dbus/example/busexample.pp svneol=native#text/plain
 packages/base/dbus/example/busexample.pp svneol=native#text/plain
 packages/base/fpmake.inc svneol=native#text/plain
 packages/base/fpmake.inc svneol=native#text/plain
 packages/base/fpmake.pp svneol=native#text/plain
 packages/base/fpmake.pp svneol=native#text/plain
-packages/base/fpmake/Makefile svneol=native#text/plain
-packages/base/fpmake/Makefile.fpc svneol=native#text/plain
-packages/base/fpmake/fpmake.pp svneol=native#text/plain
-packages/base/fpmake/fpmkcnst.inc svneol=native#text/plain
-packages/base/fpmake/fpmktype.pp svneol=native#text/plain
-packages/base/fpmake/fpmkunit.pp svneol=native#text/plain
 packages/base/gdbint/Makefile svneol=native#text/plain
 packages/base/gdbint/Makefile svneol=native#text/plain
 packages/base/gdbint/Makefile.fpc svneol=native#text/plain
 packages/base/gdbint/Makefile.fpc svneol=native#text/plain
 packages/base/gdbint/fpmake.inc svneol=native#text/plain
 packages/base/gdbint/fpmake.inc svneol=native#text/plain
@@ -4240,6 +4234,21 @@ packages/fcl-xml/tests/README svneol=native#text/plain
 packages/fcl-xml/tests/template.xml svneol=native#text/plain
 packages/fcl-xml/tests/template.xml svneol=native#text/plain
 packages/fcl-xml/tests/xmlts.pp svneol=native#text/plain
 packages/fcl-xml/tests/xmlts.pp svneol=native#text/plain
 packages/fpmake.pp svneol=native#text/plain
 packages/fpmake.pp svneol=native#text/plain
+packages/fpmake/Makefile svneol=native#text/plain
+packages/fpmake/Makefile.fpc svneol=native#text/plain
+packages/fpmake/fpmake.inc svneol=native#text/plain
+packages/fpmake/fpmake.pp svneol=native#text/plain
+packages/fpmake/src/Makefile svneol=native#text/plain
+packages/fpmake/src/Makefile.fpc svneol=native#text/plain
+packages/fpmake/src/fpmake.pp svneol=native#text/plain
+packages/fpmake/src/fpmkcnst.inc svneol=native#text/plain
+packages/fpmake/src/fpmktype.pp svneol=native#text/plain
+packages/fpmake/src/fpmkunit.pp svneol=native#text/plain
+packages/fpmkunit/Makefile svneol=native#text/plain
+packages/fpmkunit/Makefile.fpc svneol=native#text/plain
+packages/fpmkunit/fpmake.inc svneol=native#text/plain
+packages/fpmkunit/fpmake.pp svneol=native#text/plain
+packages/fpmkunit/src/fpmkunit.pp svneol=native#text/plain
 rtl/COPYING -text
 rtl/COPYING -text
 rtl/COPYING.FPC -text
 rtl/COPYING.FPC -text
 rtl/Makefile svneol=native#text/plain
 rtl/Makefile svneol=native#text/plain

+ 2221 - 0
packages/fpmake/Makefile

@@ -0,0 +1,2221 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/05/30]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=fpmake
+override PACKAGE_VERSION=2.0.0
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=fpmktype fpmkunit
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) 
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.inc $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:
+fpmkunit$(PPUEXT) : fpmkunit.pp fpmkcnst.inc fpmktype$(PPUEXT)
+fpmktype$(PPUEXT) : fpmktype.pp fpmkcnst.inc

+ 26 - 0
packages/fpmake/Makefile.fpc

@@ -0,0 +1,26 @@
+#
+#   Makefile.fpc for fppkg
+#
+
+[package]
+name=fpmake
+version=2.0.0
+
+[target]
+units=fpmktype fpmkunit
+
+[install]
+fpcpackage=y
+
+[compiler]
+sourcedir=src
+includedir=src
+
+[default]
+fpcdir=../..
+
+[rules]
+.NOTPARALLEL:
+fpmkunit$(PPUEXT) : fpmkunit.pp fpmkcnst.inc fpmktype$(PPUEXT)
+
+fpmktype$(PPUEXT) : fpmktype.pp fpmkcnst.inc

+ 9 - 0
packages/fpmake/fpmake.inc

@@ -0,0 +1,9 @@
+    StartPackage('fpmake');
+    Version:='2.0.0';
+    Description:='Free Pascal Make Tool';
+		T:=Targets.AddUnit('fpmktype');
+    T:=Targets.AddUnit('fpmkunit');
+    S:=Sources.AddSrcFiles('src/*');
+    S:=Sources.AddSrcFiles('fpmake.inc');
+    S:=Sources.AddSrcFiles('fpmake.pp');
+		EndPackage;

+ 16 - 0
packages/fpmake/fpmake.pp

@@ -0,0 +1,16 @@
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmktype,fpmkunit;
+
+var
+  T : TTarget;
+  S : TSource;
+begin
+  with Installer do
+    begin
+      {$i fpmake.inc}
+      Run;
+    end;
+end.
+

+ 2 - 2
packages/base/fpmake/Makefile → packages/fpmake/src/Makefile

@@ -1,5 +1,5 @@
 #
 #
-# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/04/08]
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/03/04]
 #
 #
 default: all
 default: all
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
 MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
@@ -231,7 +231,7 @@ UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
 endif
 endif
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
 override PACKAGE_NAME=fpmake
 override PACKAGE_NAME=fpmake
-override PACKAGE_VERSION=2.1.4
+override PACKAGE_VERSION=2.0.0
 ifeq ($(FULL_TARGET),i386-linux)
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_UNITS+=fpmktype fpmkunit
 override TARGET_UNITS+=fpmktype fpmkunit
 endif
 endif

+ 1 - 1
packages/base/fpmake/Makefile.fpc → packages/fpmake/src/Makefile.fpc

@@ -4,7 +4,7 @@
 
 
 [package]
 [package]
 name=fpmake
 name=fpmake
-version=2.1.4
+version=2.0.0
 
 
 [target]
 [target]
 units=fpmktype fpmkunit
 units=fpmktype fpmkunit

+ 0 - 0
packages/base/fpmake/fpmake.pp → packages/fpmake/src/fpmake.pp


+ 0 - 0
packages/base/fpmake/fpmkcnst.inc → packages/fpmake/src/fpmkcnst.inc


+ 0 - 0
packages/base/fpmake/fpmktype.pp → packages/fpmake/src/fpmktype.pp


+ 0 - 0
packages/base/fpmake/fpmkunit.pp → packages/fpmake/src/fpmkunit.pp


+ 2207 - 0
packages/fpmkunit/Makefile

@@ -0,0 +1,2207 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2007/02/25]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+FORCE:
+.PHONY: FORCE
+override PATH:=$(patsubst %/,%,$(subst \,/,$(PATH)))
+ifneq ($(findstring darwin,$(OSTYPE)),)
+inUnix=1 #darwin
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+ifeq ($(findstring ;,$(PATH)),)
+inUnix=1
+SEARCHPATH:=$(filter-out .,$(subst :, ,$(PATH)))
+else
+SEARCHPATH:=$(subst ;, ,$(PATH))
+endif
+endif
+SEARCHPATH+=$(patsubst %/,%,$(subst \,/,$(dir $(MAKE))))
+PWD:=$(strip $(wildcard $(addsuffix /pwd.exe,$(SEARCHPATH))))
+ifeq ($(PWD),)
+PWD:=$(strip $(wildcard $(addsuffix /pwd,$(SEARCHPATH))))
+ifeq ($(PWD),)
+$(error You need the GNU utils package to use this Makefile)
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=
+endif
+else
+PWD:=$(firstword $(PWD))
+SRCEXEEXT=.exe
+endif
+ifndef inUnix
+ifeq ($(OS),Windows_NT)
+inWinNT=1
+else
+ifdef OS2_SHELL
+inOS2=1
+endif
+endif
+else
+ifneq ($(findstring cygdrive,$(PATH)),)
+inCygWin=1
+endif
+endif
+ifdef inUnix
+SRCBATCHEXT=.sh
+else
+ifdef inOS2
+SRCBATCHEXT=.cmd
+else
+SRCBATCHEXT=.bat
+endif
+endif
+ifdef inUnix
+PATHSEP=/
+else
+PATHSEP:=$(subst /,\,/)
+ifdef inCygWin
+PATHSEP=/
+endif
+endif
+ifdef PWD
+BASEDIR:=$(subst \,/,$(shell $(PWD)))
+ifdef inCygWin
+ifneq ($(findstring /cygdrive/,$(BASEDIR)),)
+BASENODIR:=$(patsubst /cygdrive%,%,$(BASEDIR))
+BASEDRIVE:=$(firstword $(subst /, ,$(BASENODIR)))
+BASEDIR:=$(subst /cygdrive/$(BASEDRIVE)/,$(BASEDRIVE):/,$(BASEDIR))
+endif
+endif
+else
+BASEDIR=.
+endif
+ifdef inOS2
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO=echo
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+endif
+override DEFAULT_FPCDIR=../..
+ifndef FPC
+ifdef PP
+FPC=$(PP)
+endif
+endif
+ifndef FPC
+FPCPROG:=$(strip $(wildcard $(addsuffix /fpc$(SRCEXEEXT),$(SEARCHPATH))))
+ifneq ($(FPCPROG),)
+FPCPROG:=$(firstword $(FPCPROG))
+FPC:=$(shell $(FPCPROG) -PB)
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+else
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+endif
+endif
+override FPC:=$(subst $(SRCEXEEXT),,$(FPC))
+override FPC:=$(subst \,/,$(FPC))$(SRCEXEEXT)
+FOUNDFPC:=$(strip $(wildcard $(FPC)))
+ifeq ($(FOUNDFPC),)
+FOUNDFPC=$(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))
+ifeq ($(FOUNDFPC),)
+$(error Compiler $(FPC) not found)
+endif
+endif
+ifndef FPC_COMPILERINFO
+FPC_COMPILERINFO:=$(shell $(FPC) -iVSPTPSOTO)
+endif
+ifndef FPC_VERSION
+FPC_VERSION:=$(word 1,$(FPC_COMPILERINFO))
+endif
+export FPC FPC_VERSION FPC_COMPILERINFO
+unexport CHECKDEPEND ALLDEPENDENCIES
+ifndef CPU_TARGET
+ifdef CPU_TARGET_DEFAULT
+CPU_TARGET=$(CPU_TARGET_DEFAULT)
+endif
+endif
+ifndef OS_TARGET
+ifdef OS_TARGET_DEFAULT
+OS_TARGET=$(OS_TARGET_DEFAULT)
+endif
+endif
+ifneq ($(words $(FPC_COMPILERINFO)),5)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTP)
+FPC_COMPILERINFO+=$(shell $(FPC) -iSO)
+FPC_COMPILERINFO+=$(shell $(FPC) -iTO)
+endif
+ifndef CPU_SOURCE
+CPU_SOURCE:=$(word 2,$(FPC_COMPILERINFO))
+endif
+ifndef CPU_TARGET
+CPU_TARGET:=$(word 3,$(FPC_COMPILERINFO))
+endif
+ifndef OS_SOURCE
+OS_SOURCE:=$(word 4,$(FPC_COMPILERINFO))
+endif
+ifndef OS_TARGET
+OS_TARGET:=$(word 5,$(FPC_COMPILERINFO))
+endif
+FULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+FULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+TARGETSUFFIX=$(OS_TARGET)
+SOURCESUFFIX=$(OS_SOURCE)
+else
+TARGETSUFFIX=$(FULL_TARGET)
+SOURCESUFFIX=$(FULL_SOURCE)
+endif
+ifneq ($(FULL_TARGET),$(FULL_SOURCE))
+CROSSCOMPILE=1
+endif
+ifeq ($(findstring makefile,$(MAKECMDGOALS)),)
+ifeq ($(findstring $(FULL_TARGET),$(MAKEFILETARGETS)),)
+$(error The Makefile doesn't support target $(FULL_TARGET), please run fpcmake first)
+endif
+endif
+ifneq ($(findstring $(OS_TARGET),$(BSDs)),)
+BSDhier=1
+endif
+ifeq ($(OS_TARGET),linux)
+linuxHier=1
+endif
+export OS_TARGET OS_SOURCE CPU_TARGET CPU_SOURCE FULL_TARGET FULL_SOURCE TARGETSUFFIX SOURCESUFFIX CROSSCOMPILE
+ifdef FPCDIR
+override FPCDIR:=$(subst \,/,$(FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+else
+override FPCDIR=wrong
+endif
+ifdef DEFAULT_FPCDIR
+ifeq ($(FPCDIR),wrong)
+override FPCDIR:=$(subst \,/,$(DEFAULT_FPCDIR))
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=wrong
+endif
+endif
+endif
+ifeq ($(FPCDIR),wrong)
+ifdef inUnix
+override FPCDIR=/usr/local/lib/fpc/$(FPC_VERSION)
+ifeq ($(wildcard $(FPCDIR)/units),)
+override FPCDIR=/usr/lib/fpc/$(FPC_VERSION)
+endif
+else
+override FPCDIR:=$(subst /$(FPC),,$(firstword $(strip $(wildcard $(addsuffix /$(FPC),$(SEARCHPATH))))))
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(FPCDIR)/..
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR:=$(BASEDIR)
+ifeq ($(wildcard $(addprefix $(FPCDIR)/,rtl units)),)
+override FPCDIR=c:/pp
+endif
+endif
+endif
+endif
+endif
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(FPCDIR)/bin/$(TARGETSUFFIX))
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+endif
+endif
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
+ifeq ($(UNITSDIR),)
+UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
+endif
+PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(FPCDIR)/packages/extra)
+override PACKAGE_NAME=fpmkunit
+override PACKAGE_VERSION=2.0.0
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=fpmkunit
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=fpmkunit
+endif
+override INSTALL_FPCPACKAGE=y
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifdef REQUIRE_UNITSDIR
+override UNITSDIR+=$(REQUIRE_UNITSDIR)
+endif
+ifdef REQUIRE_PACKAGESDIR
+override PACKAGESDIR+=$(REQUIRE_PACKAGESDIR)
+endif
+ifdef ZIPINSTALL
+ifneq ($(findstring $(OS_TARGET),$(UNIXs)),)
+UNIXHier=1
+endif
+else
+ifneq ($(findstring $(OS_SOURCE),$(UNIXs)),)
+UNIXHier=1
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef PREFIX
+INSTALL_PREFIX=$(PREFIX)
+endif
+endif
+ifndef INSTALL_PREFIX
+ifdef UNIXHier
+INSTALL_PREFIX=/usr/local
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=/pp
+else
+INSTALL_BASEDIR:=/$(PACKAGE_NAME)
+endif
+endif
+endif
+export INSTALL_PREFIX
+ifdef INSTALL_FPCSUBDIR
+export INSTALL_FPCSUBDIR
+endif
+ifndef DIST_DESTDIR
+DIST_DESTDIR:=$(BASEDIR)
+endif
+export DIST_DESTDIR
+ifndef COMPILER_UNITTARGETDIR
+ifdef PACKAGEDIR_MAIN
+COMPILER_UNITTARGETDIR=$(PACKAGEDIR_MAIN)/units/$(TARGETSUFFIX)
+else
+COMPILER_UNITTARGETDIR=units/$(TARGETSUFFIX)
+endif
+endif
+ifndef COMPILER_TARGETDIR
+COMPILER_TARGETDIR=.
+endif
+ifndef INSTALL_BASEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/fpc/$(FPC_VERSION)
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)/lib/$(PACKAGE_NAME)
+endif
+else
+INSTALL_BASEDIR:=$(INSTALL_PREFIX)
+endif
+endif
+ifndef INSTALL_BINDIR
+ifdef UNIXHier
+INSTALL_BINDIR:=$(INSTALL_PREFIX)/bin
+else
+INSTALL_BINDIR:=$(INSTALL_BASEDIR)/bin
+ifdef INSTALL_FPCPACKAGE
+ifdef CROSSCOMPILE
+ifdef CROSSINSTALL
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(SOURCESUFFIX)
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+else
+INSTALL_BINDIR:=$(INSTALL_BINDIR)/$(TARGETSUFFIX)
+endif
+endif
+endif
+endif
+ifndef INSTALL_UNITDIR
+INSTALL_UNITDIR:=$(INSTALL_BASEDIR)/units/$(TARGETSUFFIX)
+ifdef INSTALL_FPCPACKAGE
+ifdef PACKAGE_NAME
+INSTALL_UNITDIR:=$(INSTALL_UNITDIR)/$(PACKAGE_NAME)
+endif
+endif
+endif
+ifndef INSTALL_LIBDIR
+ifdef UNIXHier
+INSTALL_LIBDIR:=$(INSTALL_PREFIX)/lib
+else
+INSTALL_LIBDIR:=$(INSTALL_UNITDIR)
+endif
+endif
+ifndef INSTALL_SOURCEDIR
+ifdef UNIXHier
+ifdef BSDhier
+SRCPREFIXDIR=share/src
+else
+ifdef linuxHier
+SRCPREFIXDIR=share/src
+else
+SRCPREFIXDIR=src
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_PREFIX)/$(SRCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+ifdef INSTALL_FPCSUBDIR
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(INSTALL_FPCSUBDIR)/$(PACKAGE_NAME)
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source/$(PACKAGE_NAME)
+endif
+else
+INSTALL_SOURCEDIR:=$(INSTALL_BASEDIR)/source
+endif
+endif
+endif
+ifndef INSTALL_DOCDIR
+ifdef UNIXHier
+ifdef BSDhier
+DOCPREFIXDIR=share/doc
+else
+ifdef linuxHier
+DOCPREFIXDIR=share/doc
+else
+DOCPREFIXDIR=doc
+endif
+endif
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_PREFIX)/$(DOCPREFIXDIR)/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc/$(PACKAGE_NAME)
+else
+INSTALL_DOCDIR:=$(INSTALL_BASEDIR)/doc
+endif
+endif
+endif
+ifndef INSTALL_EXAMPLEDIR
+ifdef UNIXHier
+ifdef INSTALL_FPCPACKAGE
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/fpc-$(FPC_VERSION)/$(PACKAGE_NAME)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/fpc-$(FPC_VERSION)/examples/$(PACKAGE_NAME)
+endif
+endif
+else
+ifdef BSDhier
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/share/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+ifdef linuxHier
+INSTALL_EXAMPLEDIR:=$(INSTALL_DOCDIR)/examples/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_PREFIX)/doc/$(PACKAGE_NAME)-$(PACKAGE_VERSION)
+endif
+endif
+endif
+else
+ifdef INSTALL_FPCPACKAGE
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples/$(PACKAGE_NAME)
+else
+INSTALL_EXAMPLEDIR:=$(INSTALL_BASEDIR)/examples
+endif
+endif
+endif
+ifndef INSTALL_DATADIR
+INSTALL_DATADIR=$(INSTALL_BASEDIR)
+endif
+ifndef INSTALL_SHAREDDIR
+INSTALL_SHAREDDIR=$(INSTALL_PREFIX)/lib
+endif
+ifdef CROSSCOMPILE
+ifndef CROSSBINDIR
+CROSSBINDIR:=$(wildcard $(CROSSTARGETDIR)/bin/$(SOURCESUFFIX))
+ifeq ($(CROSSBINDIR),)
+CROSSBINDIR:=$(wildcard $(INSTALL_BASEDIR)/cross/$(TARGETSUFFIX)/bin/$(FULL_SOURCE))
+endif
+endif
+else
+CROSSBINDIR=
+endif
+BATCHEXT=.bat
+LOADEREXT=.as
+EXEEXT=.exe
+PPLEXT=.ppl
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.so
+SHAREDLIBPREFIX=libfp
+STATICLIBPREFIX=libp
+IMPORTLIBPREFIX=libimp
+RSTEXT=.rst
+ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),go32v1)
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),morphos)
+EXEEXT=
+SHAREDLIBEXT=.library
+SHORTSUFFIX=mos
+endif
+ifeq ($(OS_TARGET),atari)
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+ifeq ($(OS_TARGET),darwin)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=dwn
+endif
+ifeq ($(OS_TARGET),gba)
+EXEEXT=.gba
+SHAREDLIBEXT=.so
+SHORTSUFFIX=gba
+endif
+ifeq ($(OS_TARGET),symbian)
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=symbian
+endif
+else
+ifeq ($(OS_TARGET),go32v1)
+PPUEXT=.pp1
+OEXT=.o1
+ASMEXT=.s1
+SMARTEXT=.sl1
+STATICLIBEXT=.a1
+SHAREDLIBEXT=.so1
+STATICLIBPREFIX=
+SHORTSUFFIX=v1
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+endif
+ifeq ($(OS_TARGET),linux)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=lnx
+endif
+ifeq ($(OS_TARGET),freebsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=fbs
+endif
+ifeq ($(OS_TARGET),netbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=nbs
+endif
+ifeq ($(OS_TARGET),openbsd)
+BATCHEXT=.sh
+EXEEXT=
+HASSHAREDLIB=1
+SHORTSUFFIX=obs
+endif
+ifeq ($(OS_TARGET),win32)
+PPUEXT=.ppw
+OEXT=.ow
+ASMEXT=.sw
+SMARTEXT=.slw
+STATICLIBEXT=.aw
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=w32
+endif
+ifeq ($(OS_TARGET),os2)
+BATCHEXT=.cmd
+PPUEXT=.ppo
+ASMEXT=.so2
+OEXT=.oo2
+AOUTEXT=.out
+SMARTEXT=.sl2
+STATICLIBPREFIX=
+STATICLIBEXT=.ao2
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=os2
+ECHO=echo
+endif
+ifeq ($(OS_TARGET),amiga)
+EXEEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.library
+SHORTSUFFIX=amg
+endif
+ifeq ($(OS_TARGET),atari)
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=.ttp
+SHORTSUFFIX=ata
+endif
+ifeq ($(OS_TARGET),beos)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=be
+endif
+ifeq ($(OS_TARGET),solaris)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=sun
+endif
+ifeq ($(OS_TARGET),qnx)
+BATCHEXT=.sh
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+SHORTSUFFIX=qnx
+endif
+ifeq ($(OS_TARGET),netware)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nw
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+endif
+endif
+ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
+FPCMADE=fpcmade.$(SHORTSUFFIX)
+ZIPSUFFIX=$(SHORTSUFFIX)
+ZIPCROSSPREFIX=
+ZIPSOURCESUFFIX=src
+ZIPEXAMPLESUFFIX=exm
+else
+FPCMADE=fpcmade.$(TARGETSUFFIX)
+ZIPSOURCESUFFIX=.source
+ZIPEXAMPLESUFFIX=.examples
+ifdef CROSSCOMPILE
+ZIPSUFFIX=.$(SOURCESUFFIX)
+ZIPCROSSPREFIX=$(TARGETSUFFIX)-
+else
+ZIPSUFFIX=.$(TARGETSUFFIX)
+ZIPCROSSPREFIX=
+endif
+endif
+ifndef ECHO
+ECHO:=$(strip $(wildcard $(addsuffix /gecho$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO:=$(strip $(wildcard $(addsuffix /echo$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ECHO),)
+ECHO= __missing_command_ECHO
+else
+ECHO:=$(firstword $(ECHO))
+endif
+else
+ECHO:=$(firstword $(ECHO))
+endif
+endif
+export ECHO
+ifndef DATE
+DATE:=$(strip $(wildcard $(addsuffix /gdate$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE:=$(strip $(wildcard $(addsuffix /date$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(DATE),)
+DATE= __missing_command_DATE
+else
+DATE:=$(firstword $(DATE))
+endif
+else
+DATE:=$(firstword $(DATE))
+endif
+endif
+export DATE
+ifndef GINSTALL
+GINSTALL:=$(strip $(wildcard $(addsuffix /ginstall$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL:=$(strip $(wildcard $(addsuffix /install$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(GINSTALL),)
+GINSTALL= __missing_command_GINSTALL
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+else
+GINSTALL:=$(firstword $(GINSTALL))
+endif
+endif
+export GINSTALL
+ifndef CPPROG
+CPPROG:=$(strip $(wildcard $(addsuffix /cp$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(CPPROG),)
+CPPROG= __missing_command_CPPROG
+else
+CPPROG:=$(firstword $(CPPROG))
+endif
+endif
+export CPPROG
+ifndef RMPROG
+RMPROG:=$(strip $(wildcard $(addsuffix /rm$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(RMPROG),)
+RMPROG= __missing_command_RMPROG
+else
+RMPROG:=$(firstword $(RMPROG))
+endif
+endif
+export RMPROG
+ifndef MVPROG
+MVPROG:=$(strip $(wildcard $(addsuffix /mv$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MVPROG),)
+MVPROG= __missing_command_MVPROG
+else
+MVPROG:=$(firstword $(MVPROG))
+endif
+endif
+export MVPROG
+ifndef MKDIRPROG
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /gmkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG:=$(strip $(wildcard $(addsuffix /mkdir$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(MKDIRPROG),)
+MKDIRPROG= __missing_command_MKDIRPROG
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+else
+MKDIRPROG:=$(firstword $(MKDIRPROG))
+endif
+endif
+export MKDIRPROG
+ifndef ECHOREDIR
+ifndef inUnix
+ECHOREDIR=echo
+else
+ECHOREDIR=$(ECHO)
+endif
+endif
+ifndef COPY
+COPY:=$(CPPROG) -fp
+endif
+ifndef COPYTREE
+COPYTREE:=$(CPPROG) -Rfp
+endif
+ifndef MKDIRTREE
+MKDIRTREE:=$(MKDIRPROG) -p
+endif
+ifndef MOVE
+MOVE:=$(MVPROG) -f
+endif
+ifndef DEL
+DEL:=$(RMPROG) -f
+endif
+ifndef DELTREE
+DELTREE:=$(RMPROG) -rf
+endif
+ifndef INSTALL
+ifdef inUnix
+INSTALL:=$(GINSTALL) -c -m 644
+else
+INSTALL:=$(COPY)
+endif
+endif
+ifndef INSTALLEXE
+ifdef inUnix
+INSTALLEXE:=$(GINSTALL) -c -m 755
+else
+INSTALLEXE:=$(COPY)
+endif
+endif
+ifndef MKDIR
+MKDIR:=$(GINSTALL) -m 755 -d
+endif
+export ECHOREDIR COPY COPYTREE MOVE DEL DELTREE INSTALL INSTALLEXE MKDIR
+ifndef PPUMOVE
+PPUMOVE:=$(strip $(wildcard $(addsuffix /ppumove$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(PPUMOVE),)
+PPUMOVE= __missing_command_PPUMOVE
+else
+PPUMOVE:=$(firstword $(PPUMOVE))
+endif
+endif
+export PPUMOVE
+ifndef FPCMAKE
+FPCMAKE:=$(strip $(wildcard $(addsuffix /fpcmake$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(FPCMAKE),)
+FPCMAKE= __missing_command_FPCMAKE
+else
+FPCMAKE:=$(firstword $(FPCMAKE))
+endif
+endif
+export FPCMAKE
+ifndef ZIPPROG
+ZIPPROG:=$(strip $(wildcard $(addsuffix /zip$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(ZIPPROG),)
+ZIPPROG= __missing_command_ZIPPROG
+else
+ZIPPROG:=$(firstword $(ZIPPROG))
+endif
+endif
+export ZIPPROG
+ifndef TARPROG
+TARPROG:=$(strip $(wildcard $(addsuffix /gtar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG:=$(strip $(wildcard $(addsuffix /tar$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(TARPROG),)
+TARPROG= __missing_command_TARPROG
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+else
+TARPROG:=$(firstword $(TARPROG))
+endif
+endif
+export TARPROG
+ASNAME=$(BINUTILSPREFIX)as
+LDNAME=$(BINUTILSPREFIX)ld
+ARNAME=$(BINUTILSPREFIX)ar
+RCNAME=$(BINUTILSPREFIX)rc
+ifneq ($(findstring 1.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),win32)
+ifeq ($(CROSSBINDIR),)
+ASNAME=asw
+LDNAME=ldw
+ARNAME=arw
+endif
+endif
+endif
+ifndef ASPROG
+ifdef CROSSBINDIR
+ASPROG=$(CROSSBINDIR)/$(ASNAME)$(SRCEXEEXT)
+else
+ASPROG=$(ASNAME)
+endif
+endif
+ifndef LDPROG
+ifdef CROSSBINDIR
+LDPROG=$(CROSSBINDIR)/$(LDNAME)$(SRCEXEEXT)
+else
+LDPROG=$(LDNAME)
+endif
+endif
+ifndef RCPROG
+ifdef CROSSBINDIR
+RCPROG=$(CROSSBINDIR)/$(RCNAME)$(SRCEXEEXT)
+else
+RCPROG=$(RCNAME)
+endif
+endif
+ifndef ARPROG
+ifdef CROSSBINDIR
+ARPROG=$(CROSSBINDIR)/$(ARNAME)$(SRCEXEEXT)
+else
+ARPROG=$(ARNAME)
+endif
+endif
+AS=$(ASPROG)
+LD=$(LDPROG)
+RC=$(RCPROG)
+AR=$(ARPROG)
+PPAS=ppas$(SRCBATCHEXT)
+ifdef inUnix
+LDCONFIG=ldconfig
+else
+LDCONFIG=
+endif
+ifdef DATE
+DATESTR:=$(shell $(DATE) +%Y%m%d)
+else
+DATESTR=
+endif
+ifndef UPXPROG
+ifeq ($(OS_TARGET),go32v2)
+UPXPROG:=1
+endif
+ifeq ($(OS_TARGET),win32)
+UPXPROG:=1
+endif
+ifdef UPXPROG
+UPXPROG:=$(strip $(wildcard $(addsuffix /upx$(SRCEXEEXT),$(SEARCHPATH))))
+ifeq ($(UPXPROG),)
+UPXPROG=
+else
+UPXPROG:=$(firstword $(UPXPROG))
+endif
+else
+UPXPROG=
+endif
+endif
+export UPXPROG
+ZIPOPT=-9
+ZIPEXT=.zip
+ifeq ($(USETAR),bz2)
+TAROPT=vj
+TAREXT=.tar.bz2
+else
+TAROPT=vz
+TAREXT=.tar.gz
+endif
+override REQUIRE_PACKAGES=rtl 
+ifeq ($(FULL_TARGET),i386-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifdef REQUIRE_PACKAGES_RTL
+PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
+ifneq ($(PACKAGEDIR_RTL),)
+ifneq ($(wildcard $(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)),)
+UNITDIR_RTL=$(PACKAGEDIR_RTL)/units/$(TARGETSUFFIX)
+else
+UNITDIR_RTL=$(PACKAGEDIR_RTL)
+endif
+ifdef CHECKDEPEND
+$(PACKAGEDIR_RTL)/$(FPCMADE):
+	$(MAKE) -C $(PACKAGEDIR_RTL) $(FPCMADE)
+override ALLDEPENDENCIES+=$(PACKAGEDIR_RTL)/$(FPCMADE)
+endif
+else
+PACKAGEDIR_RTL=
+UNITDIR_RTL:=$(subst /Package.fpc,,$(strip $(wildcard $(addsuffix /rtl/Package.fpc,$(UNITSDIR)))))
+ifneq ($(UNITDIR_RTL),)
+UNITDIR_RTL:=$(firstword $(UNITDIR_RTL))
+else
+UNITDIR_RTL=
+endif
+endif
+ifdef UNITDIR_RTL
+override COMPILER_UNITDIR+=$(UNITDIR_RTL)
+endif
+endif
+ifndef NOCPUDEF
+override FPCOPTDEF=$(CPU_TARGET)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(CPU_TARGET)
+endif
+ifeq ($(OS_SOURCE),openbsd)
+override FPCOPT+=-FD$(NEW_BINUTILS_PATH)
+endif
+ifndef CROSSBOOTSTRAP
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-XP$(BINUTILSPREFIX) -Xc
+endif
+ifneq ($(BINUTILSPREFIX),)
+override FPCOPT+=-Xr$(RLINKPATH)
+endif
+endif
+ifdef UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(UNITDIR))
+endif
+ifdef LIBDIR
+override FPCOPT+=$(addprefix -Fl,$(LIBDIR))
+endif
+ifdef OBJDIR
+override FPCOPT+=$(addprefix -Fo,$(OBJDIR))
+endif
+ifdef INCDIR
+override FPCOPT+=$(addprefix -Fi,$(INCDIR))
+endif
+ifdef LINKSMART
+override FPCOPT+=-XX
+endif
+ifdef CREATESMART
+override FPCOPT+=-CX
+endif
+ifdef DEBUG
+override FPCOPT+=-gl
+override FPCOPTDEF+=DEBUG
+endif
+ifdef RELEASE
+ifneq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(CPU_TARGET),i386)
+FPCCPUOPT:=-OG2p3
+endif
+ifeq ($(CPU_TARGET),powerpc)
+FPCCPUOPT:=-O1r
+endif
+else
+FPCCPUOPT:=-O2
+endif
+override FPCOPT+=-Ur -Xs $(FPCCPUOPT) -n
+override FPCOPTDEF+=RELEASE
+endif
+ifdef STRIP
+override FPCOPT+=-Xs
+endif
+ifdef OPTIMIZE
+override FPCOPT+=-O2
+endif
+ifdef VERBOSE
+override FPCOPT+=-vwni
+endif
+ifdef COMPILER_OPTIONS
+override FPCOPT+=$(COMPILER_OPTIONS)
+endif
+ifdef COMPILER_UNITDIR
+override FPCOPT+=$(addprefix -Fu,$(COMPILER_UNITDIR))
+endif
+ifdef COMPILER_LIBRARYDIR
+override FPCOPT+=$(addprefix -Fl,$(COMPILER_LIBRARYDIR))
+endif
+ifdef COMPILER_OBJECTDIR
+override FPCOPT+=$(addprefix -Fo,$(COMPILER_OBJECTDIR))
+endif
+ifdef COMPILER_INCLUDEDIR
+override FPCOPT+=$(addprefix -Fi,$(COMPILER_INCLUDEDIR))
+endif
+ifdef CROSSBINDIR
+override FPCOPT+=-FD$(CROSSBINDIR)
+endif
+ifdef COMPILER_TARGETDIR
+override FPCOPT+=-FE$(COMPILER_TARGETDIR)
+ifeq ($(COMPILER_TARGETDIR),.)
+override TARGETDIRPREFIX=
+else
+override TARGETDIRPREFIX=$(COMPILER_TARGETDIR)/
+endif
+endif
+ifdef COMPILER_UNITTARGETDIR
+override FPCOPT+=-FU$(COMPILER_UNITTARGETDIR)
+ifeq ($(COMPILER_UNITTARGETDIR),.)
+override UNITTARGETDIRPREFIX=
+else
+override UNITTARGETDIRPREFIX=$(COMPILER_UNITTARGETDIR)/
+endif
+else
+ifdef COMPILER_TARGETDIR
+override COMPILER_UNITTARGETDIR=$(COMPILER_TARGETDIR)
+override UNITTARGETDIRPREFIX=$(TARGETDIRPREFIX)
+endif
+endif
+ifdef CREATESHARED
+override FPCOPT+=-Cg
+ifeq ($(CPU_TARGET),i386)
+override FPCOPT+=-Aas
+endif
+endif
+ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
+ifeq ($(OS_TARGET),linux)
+ifeq ($(CPU_TARGET),x86_64)
+override FPCOPT+=-Cg
+endif
+endif
+endif
+ifdef LINKSHARED
+endif
+ifdef OPT
+override FPCOPT+=$(OPT)
+endif
+ifdef FPCOPTDEF
+override FPCOPT+=$(addprefix -d,$(FPCOPTDEF))
+endif
+ifdef CFGFILE
+override FPCOPT+=@$(CFGFILE)
+endif
+ifdef USEENV
+override FPCEXTCMD:=$(FPCOPT)
+override FPCOPT:=!FPCEXTCMD
+export FPCEXTCMD
+endif
+override AFULL_TARGET=$(CPU_TARGET)-$(OS_TARGET)
+override AFULL_SOURCE=$(CPU_SOURCE)-$(OS_SOURCE)
+ifneq ($(AFULL_TARGET),$(AFULL_SOURCE))
+override ACROSSCOMPILE=1
+endif
+ifdef ACROSSCOMPILE
+override FPCOPT+=$(CROSSOPT)
+endif
+override COMPILER:=$(FPC) $(FPCOPT)
+ifeq (,$(findstring -s ,$(COMPILER)))
+EXECPPAS=
+else
+ifeq ($(FULL_SOURCE),$(FULL_TARGET))
+EXECPPAS:=@$(PPAS)
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS),)
+override ALLTARGET+=fpc_units
+override UNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_UNITS))
+override IMPLICITUNITPPUFILES=$(addsuffix $(PPUEXT),$(TARGET_IMPLICITUNITS))
+override INSTALLPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+override CLEANPPUFILES+=$(UNITPPUFILES) $(IMPLICITUNITPPUFILES)
+endif
+fpc_units: $(COMPILER_UNITTARGETDIR) $(UNITPPUFILES)
+ifdef TARGET_RSTS
+override RSTFILES=$(addsuffix $(RSTEXT),$(TARGET_RSTS))
+override CLEANRSTFILES+=$(RSTFILES)
+endif
+.PHONY: fpc_all fpc_smart fpc_debug fpc_release fpc_shared
+$(FPCMADE): $(ALLDEPENDENCIES) $(ALLTARGET)
+	@$(ECHOREDIR) Compiled > $(FPCMADE)
+fpc_all: $(FPCMADE)
+fpc_smart:
+	$(MAKE) all LINKSMART=1 CREATESMART=1
+fpc_debug:
+	$(MAKE) all DEBUG=1
+fpc_release:
+	$(MAKE) all RELEASE=1
+.SUFFIXES: $(EXEEXT) $(PPUEXT) $(OEXT) .pas .lpr .dpr .pp .rc .res
+$(COMPILER_UNITTARGETDIR):
+	$(MKDIRTREE) $(COMPILER_UNITTARGETDIR)
+$(COMPILER_TARGETDIR):
+	$(MKDIRTREE) $(COMPILER_TARGETDIR)
+%$(PPUEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(PPUEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pp
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.pas
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.lpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%$(EXEEXT): %.dpr
+	$(COMPILER) $<
+	$(EXECPPAS)
+%.res: %.rc
+	windres -i $< -o $@
+vpath %.pp $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.pas $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.lpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %.dpr $(COMPILER_SOURCEDIR) $(COMPILER_INCLUDEDIR)
+vpath %$(OEXT) $(COMPILER_UNITTARGETDIR)
+vpath %$(PPUEXT) $(COMPILER_UNITTARGETDIR)
+.PHONY: fpc_shared
+override INSTALLTARGET+=fpc_shared_install
+ifndef SHARED_LIBVERSION
+SHARED_LIBVERSION=$(FPC_VERSION)
+endif
+ifndef SHARED_LIBNAME
+SHARED_LIBNAME=$(PACKAGE_NAME)
+endif
+ifndef SHARED_FULLNAME
+SHARED_FULLNAME=$(SHAREDLIBPREFIX)$(SHARED_LIBNAME)-$(SHARED_LIBVERSION)$(SHAREDLIBEXT)
+endif
+ifndef SHARED_LIBUNITS
+SHARED_LIBUNITS:=$(TARGET_UNITS) $(TARGET_IMPLICITUNITS)
+override SHARED_LIBUNITS:=$(filter-out $(INSTALL_BUILDUNIT),$(SHARED_LIBUNITS))
+endif
+fpc_shared:
+ifdef HASSHAREDLIB
+	$(MAKE) all CREATESHARED=1 LINKSHARED=1 CREATESMART=1
+ifneq ($(SHARED_BUILD),n)
+	$(PPUMOVE) -q $(SHARED_LIBUNITS) -i$(COMPILER_UNITTARGETDIR) -o$(SHARED_FULLNAME) -d$(COMPILER_UNITTARGETDIR)
+endif
+else
+	@$(ECHO) Shared Libraries not supported
+endif
+fpc_shared_install:
+ifneq ($(SHARED_BUILD),n)
+ifneq ($(SHARED_LIBUNITS),)
+ifneq ($(wildcard $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME)),)
+	$(INSTALL) $(COMPILER_UNITTARGETDIR)/$(SHARED_FULLNAME) $(INSTALL_SHAREDDIR)
+endif
+endif
+endif
+.PHONY: fpc_install fpc_sourceinstall fpc_exampleinstall
+ifdef INSTALL_UNITS
+override INSTALLPPUFILES+=$(addsuffix $(PPUEXT),$(INSTALL_UNITS))
+endif
+ifdef INSTALL_BUILDUNIT
+override INSTALLPPUFILES:=$(filter-out $(INSTALL_BUILDUNIT)$(PPUEXT),$(INSTALLPPUFILES))
+endif
+ifdef INSTALLPPUFILES
+override INSTALLPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(INSTALLPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(INSTALLPPUFILES)))
+ifneq ($(UNITTARGETDIRPREFIX),)
+override INSTALLPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPUFILES)))
+override INSTALLPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(notdir $(INSTALLPPULINKFILES))))
+endif
+override INSTALL_CREATEPACKAGEFPC=1
+endif
+ifdef INSTALLEXEFILES
+ifneq ($(TARGETDIRPREFIX),)
+override INSTALLEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(notdir $(INSTALLEXEFILES)))
+endif
+endif
+fpc_install: all $(INSTALLTARGET)
+ifdef INSTALLEXEFILES
+	$(MKDIR) $(INSTALL_BINDIR)
+ifdef UPXPROG
+	-$(UPXPROG) $(INSTALLEXEFILES)
+endif
+	$(INSTALLEXE) $(INSTALLEXEFILES) $(INSTALL_BINDIR)
+endif
+ifdef INSTALL_CREATEPACKAGEFPC
+ifdef FPCMAKE
+ifdef PACKAGE_VERSION
+ifneq ($(wildcard Makefile.fpc),)
+	$(FPCMAKE) -p -T$(CPU_TARGET)-$(OS_TARGET) Makefile.fpc
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) Package.fpc $(INSTALL_UNITDIR)
+endif
+endif
+endif
+endif
+ifdef INSTALLPPUFILES
+	$(MKDIR) $(INSTALL_UNITDIR)
+	$(INSTALL) $(INSTALLPPUFILES) $(INSTALL_UNITDIR)
+ifneq ($(INSTALLPPULINKFILES),)
+	$(INSTALL) $(INSTALLPPULINKFILES) $(INSTALL_UNITDIR)
+endif
+ifneq ($(wildcard $(LIB_FULLNAME)),)
+	$(MKDIR) $(INSTALL_LIBDIR)
+	$(INSTALL) $(LIB_FULLNAME) $(INSTALL_LIBDIR)
+ifdef inUnix
+	ln -sf $(LIB_FULLNAME) $(INSTALL_LIBDIR)/$(LIB_NAME)
+endif
+endif
+endif
+ifdef INSTALL_FILES
+	$(MKDIR) $(INSTALL_DATADIR)
+	$(INSTALL) $(INSTALL_FILES) $(INSTALL_DATADIR)
+endif
+fpc_sourceinstall: distclean
+	$(MKDIR) $(INSTALL_SOURCEDIR)
+	$(COPYTREE) $(BASEDIR)/* $(INSTALL_SOURCEDIR)
+fpc_exampleinstall: $(addsuffix _distclean,$(TARGET_EXAMPLEDIRS))
+ifdef HASEXAMPLES
+	$(MKDIR) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef EXAMPLESOURCEFILES
+	$(COPY) $(EXAMPLESOURCEFILES) $(INSTALL_EXAMPLEDIR)
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(COPYTREE) $(addsuffix /*,$(TARGET_EXAMPLEDIRS)) $(INSTALL_EXAMPLEDIR)
+endif
+.PHONY: fpc_distinstall
+fpc_distinstall: install exampleinstall
+.PHONY: fpc_zipinstall fpc_zipsourceinstall fpc_zipexampleinstall
+ifndef PACKDIR
+ifndef inUnix
+PACKDIR=$(BASEDIR)/../fpc-pack
+else
+PACKDIR=/tmp/fpc-pack
+endif
+endif
+ifndef ZIPNAME
+ifdef DIST_ZIPNAME
+ZIPNAME=$(DIST_ZIPNAME)
+else
+ZIPNAME=$(PACKAGE_NAME)
+endif
+endif
+ifndef FULLZIPNAME
+FULLZIPNAME=$(ZIPCROSSPREFIX)$(ZIPPREFIX)$(ZIPNAME)$(ZIPSUFFIX)
+endif
+ifndef ZIPTARGET
+ifdef DIST_ZIPTARGET
+ZIPTARGET=DIST_ZIPTARGET
+else
+ZIPTARGET=install
+endif
+endif
+ifndef USEZIP
+ifdef inUnix
+USETAR=1
+endif
+endif
+ifndef inUnix
+USEZIPWRAPPER=1
+endif
+ifdef USEZIPWRAPPER
+ZIPPATHSEP=$(PATHSEP)
+ZIPWRAPPER=$(subst /,$(PATHSEP),$(DIST_DESTDIR)/fpczip$(SRCBATCHEXT))
+else
+ZIPPATHSEP=/
+endif
+ZIPCMD_CDPACK:=cd $(subst /,$(ZIPPATHSEP),$(PACKDIR))
+ZIPCMD_CDBASE:=cd $(subst /,$(ZIPPATHSEP),$(BASEDIR))
+ifdef USETAR
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(TAREXT)
+ZIPCMD_ZIP:=$(TARPROG) cf$(TAROPT) $(ZIPDESTFILE) *
+else
+ZIPDESTFILE:=$(DIST_DESTDIR)/$(FULLZIPNAME)$(ZIPEXT)
+ZIPCMD_ZIP:=$(subst /,$(ZIPPATHSEP),$(ZIPPROG)) -Dr $(ZIPOPT) $(ZIPDESTFILE) *
+endif
+fpc_zipinstall:
+	$(MAKE) $(ZIPTARGET) INSTALL_PREFIX=$(PACKDIR) ZIPINSTALL=1
+	$(MKDIR) $(DIST_DESTDIR)
+	$(DEL) $(ZIPDESTFILE)
+ifdef USEZIPWRAPPER
+ifneq ($(ECHOREDIR),echo)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDPACK))" > $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_ZIP))" >> $(ZIPWRAPPER)
+	$(ECHOREDIR) -e "$(subst \,\\,$(ZIPCMD_CDBASE))" >> $(ZIPWRAPPER)
+else
+	echo $(ZIPCMD_CDPACK) > $(ZIPWRAPPER)
+	echo $(ZIPCMD_ZIP) >> $(ZIPWRAPPER)
+	echo $(ZIPCMD_CDBASE) >> $(ZIPWRAPPER)
+endif
+ifdef inUnix
+	/bin/sh $(ZIPWRAPPER)
+else
+	$(ZIPWRAPPER)
+endif
+	$(DEL) $(ZIPWRAPPER)
+else
+	$(ZIPCMD_CDPACK) ; $(ZIPCMD_ZIP) ; $(ZIPCMD_CDBASE)
+endif
+	$(DELTREE) $(PACKDIR)
+fpc_zipsourceinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=sourceinstall ZIPSUFFIX=$(ZIPSOURCESUFFIX)
+fpc_zipexampleinstall:
+ifdef HASEXAMPLES
+	$(MAKE) fpc_zipinstall ZIPTARGET=exampleinstall ZIPSUFFIX=$(ZIPEXAMPLESUFFIX)
+endif
+fpc_zipdistinstall:
+	$(MAKE) fpc_zipinstall ZIPTARGET=distinstall
+.PHONY: fpc_clean fpc_cleanall fpc_distclean
+ifdef EXEFILES
+override CLEANEXEFILES:=$(addprefix $(TARGETDIRPREFIX),$(CLEANEXEFILES))
+endif
+ifdef CLEAN_UNITS
+override CLEANPPUFILES+=$(addsuffix $(PPUEXT),$(CLEAN_UNITS))
+endif
+ifdef CLEANPPUFILES
+override CLEANPPULINKFILES:=$(subst $(PPUEXT),$(OEXT),$(CLEANPPUFILES)) $(addprefix $(STATICLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES))) $(addprefix $(IMPORTLIBPREFIX),$(subst $(PPUEXT),$(STATICLIBEXT),$(CLEANPPUFILES)))
+ifdef DEBUGSYMEXT
+override CLEANPPULINKFILES+=$(subst $(PPUEXT),$(DEBUGSYMEXT),$(CLEANPPUFILES))
+endif
+override CLEANPPUFILES:=$(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPUFILES))
+override CLEANPPULINKFILES:=$(wildcard $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANPPULINKFILES)))
+endif
+fpc_clean: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+ifdef CLEAN_FILES
+	-$(DEL) $(CLEAN_FILES)
+endif
+ifdef LIB_NAME
+	-$(DEL) $(LIB_NAME) $(LIB_FULLNAME)
+endif
+	-$(DEL) $(FPCMADE) Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *$(ASMEXT) *_ppas$(BATCHEXT)
+fpc_cleanall: $(CLEANTARGET)
+ifdef CLEANEXEFILES
+	-$(DEL) $(CLEANEXEFILES)
+endif
+ifdef COMPILER_UNITTARGETDIR
+ifdef CLEANPPUFILES
+	-$(DEL) $(CLEANPPUFILES)
+endif
+ifneq ($(CLEANPPULINKFILES),)
+	-$(DEL) $(CLEANPPULINKFILES)
+endif
+ifdef CLEANRSTFILES
+	-$(DEL) $(addprefix $(UNITTARGETDIRPREFIX),$(CLEANRSTFILES))
+endif
+endif
+	-$(DELTREE) units
+	-$(DEL) *$(OEXT) *$(PPUEXT) *$(RSTEXT) *$(ASMEXT) *$(STATICLIBEXT) *$(SHAREDLIBEXT) *$(PPLEXT)
+ifneq ($(PPUEXT),.ppu)
+	-$(DEL) *.o *.ppu *.a
+endif
+	-$(DELTREE) *$(SMARTEXT)
+	-$(DEL) fpcmade.* Package.fpc $(PPAS) script.res link.res $(FPCEXTFILE) $(REDIRFILE)
+	-$(DEL) *_ppas$(BATCHEXT)
+ifdef AOUTEXT
+	-$(DEL) *$(AOUTEXT)
+endif
+ifdef DEBUGSYMEXT
+	-$(DEL) *$(DEBUGSYMEXT)
+endif
+fpc_distclean: cleanall
+.PHONY: fpc_baseinfo
+override INFORULES+=fpc_baseinfo
+fpc_baseinfo:
+	@$(ECHO)
+	@$(ECHO)  == Package info ==
+	@$(ECHO)  Package Name..... $(PACKAGE_NAME)
+	@$(ECHO)  Package Version.. $(PACKAGE_VERSION)
+	@$(ECHO)
+	@$(ECHO)  == Configuration info ==
+	@$(ECHO)
+	@$(ECHO)  FPC.......... $(FPC)
+	@$(ECHO)  FPC Version.. $(FPC_VERSION)
+	@$(ECHO)  Source CPU... $(CPU_SOURCE)
+	@$(ECHO)  Target CPU... $(CPU_TARGET)
+	@$(ECHO)  Source OS.... $(OS_SOURCE)
+	@$(ECHO)  Target OS.... $(OS_TARGET)
+	@$(ECHO)  Full Source.. $(FULL_SOURCE)
+	@$(ECHO)  Full Target.. $(FULL_TARGET)
+	@$(ECHO)  SourceSuffix. $(SOURCESUFFIX)
+	@$(ECHO)  TargetSuffix. $(TARGETSUFFIX)
+	@$(ECHO)
+	@$(ECHO)  == Directory info ==
+	@$(ECHO)
+	@$(ECHO)  Required pkgs... $(REQUIRE_PACKAGES)
+	@$(ECHO)
+	@$(ECHO)  Basedir......... $(BASEDIR)
+	@$(ECHO)  FPCDir.......... $(FPCDIR)
+	@$(ECHO)  CrossBinDir..... $(CROSSBINDIR)
+	@$(ECHO)  UnitsDir........ $(UNITSDIR)
+	@$(ECHO)  PackagesDir..... $(PACKAGESDIR)
+	@$(ECHO)
+	@$(ECHO)  GCC library..... $(GCCLIBDIR)
+	@$(ECHO)  Other library... $(OTHERLIBDIR)
+	@$(ECHO)
+	@$(ECHO)  == Tools info ==
+	@$(ECHO)
+	@$(ECHO)  As........ $(AS)
+	@$(ECHO)  Ld........ $(LD)
+	@$(ECHO)  Ar........ $(AR)
+	@$(ECHO)  Rc........ $(RC)
+	@$(ECHO)
+	@$(ECHO)  Mv........ $(MVPROG)
+	@$(ECHO)  Cp........ $(CPPROG)
+	@$(ECHO)  Rm........ $(RMPROG)
+	@$(ECHO)  GInstall.. $(GINSTALL)
+	@$(ECHO)  Echo...... $(ECHO)
+	@$(ECHO)  Shell..... $(SHELL)
+	@$(ECHO)  Date...... $(DATE)
+	@$(ECHO)  FPCMake... $(FPCMAKE)
+	@$(ECHO)  PPUMove... $(PPUMOVE)
+	@$(ECHO)  Upx....... $(UPXPROG)
+	@$(ECHO)  Zip....... $(ZIPPROG)
+	@$(ECHO)
+	@$(ECHO)  == Object info ==
+	@$(ECHO)
+	@$(ECHO)  Target Loaders........ $(TARGET_LOADERS)
+	@$(ECHO)  Target Units.......... $(TARGET_UNITS)
+	@$(ECHO)  Target Implicit Units. $(TARGET_IMPLICITUNITS)
+	@$(ECHO)  Target Programs....... $(TARGET_PROGRAMS)
+	@$(ECHO)  Target Dirs........... $(TARGET_DIRS)
+	@$(ECHO)  Target Examples....... $(TARGET_EXAMPLES)
+	@$(ECHO)  Target ExampleDirs.... $(TARGET_EXAMPLEDIRS)
+	@$(ECHO)
+	@$(ECHO)  Clean Units......... $(CLEAN_UNITS)
+	@$(ECHO)  Clean Files......... $(CLEAN_FILES)
+	@$(ECHO)
+	@$(ECHO)  Install Units....... $(INSTALL_UNITS)
+	@$(ECHO)  Install Files....... $(INSTALL_FILES)
+	@$(ECHO)
+	@$(ECHO)  == Install info ==
+	@$(ECHO)
+	@$(ECHO)  DateStr.............. $(DATESTR)
+	@$(ECHO)  ZipName.............. $(ZIPNAME)
+	@$(ECHO)  ZipPrefix............ $(ZIPPREFIX)
+	@$(ECHO)  ZipCrossPrefix....... $(ZIPCROSSPREFIX)
+	@$(ECHO)  ZipSuffix............ $(ZIPSUFFIX)
+	@$(ECHO)  FullZipName.......... $(FULLZIPNAME)
+	@$(ECHO)  Install FPC Package.. $(INSTALL_FPCPACKAGE)
+	@$(ECHO)
+	@$(ECHO)  Install base dir..... $(INSTALL_BASEDIR)
+	@$(ECHO)  Install binary dir... $(INSTALL_BINDIR)
+	@$(ECHO)  Install library dir.. $(INSTALL_LIBDIR)
+	@$(ECHO)  Install units dir.... $(INSTALL_UNITDIR)
+	@$(ECHO)  Install source dir... $(INSTALL_SOURCEDIR)
+	@$(ECHO)  Install doc dir...... $(INSTALL_DOCDIR)
+	@$(ECHO)  Install example dir.. $(INSTALL_EXAMPLEDIR)
+	@$(ECHO)  Install data dir..... $(INSTALL_DATADIR)
+	@$(ECHO)
+	@$(ECHO)  Dist destination dir. $(DIST_DESTDIR)
+	@$(ECHO)  Dist zip name........ $(DIST_ZIPNAME)
+	@$(ECHO)
+.PHONY: fpc_info
+fpc_info: $(INFORULES)
+.PHONY: fpc_makefile fpc_makefiles fpc_makefile_sub1 fpc_makefile_sub2 \
+	fpc_makefile_dirs
+fpc_makefile:
+	$(FPCMAKE) -w -T$(OS_TARGET) Makefile.fpc
+fpc_makefile_sub1:
+ifdef TARGET_DIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_DIRS))
+endif
+ifdef TARGET_EXAMPLEDIRS
+	$(FPCMAKE) -w -T$(OS_TARGET) $(addsuffix /Makefile.fpc,$(TARGET_EXAMPLEDIRS))
+endif
+fpc_makefile_sub2: $(addsuffix _makefile_dirs,$(TARGET_DIRS) $(TARGET_EXAMPLEDIRS))
+fpc_makefile_dirs: fpc_makefile_sub1 fpc_makefile_sub2
+fpc_makefiles: fpc_makefile fpc_makefile_dirs
+all: fpc_all
+debug: fpc_debug
+smart: fpc_smart
+release: fpc_release
+units: fpc_units
+examples:
+shared: fpc_shared
+install: fpc_install
+sourceinstall: fpc_sourceinstall
+exampleinstall: fpc_exampleinstall
+distinstall: fpc_distinstall
+zipinstall: fpc_zipinstall
+zipsourceinstall: fpc_zipsourceinstall
+zipexampleinstall: fpc_zipexampleinstall
+zipdistinstall: fpc_zipdistinstall
+clean: fpc_clean
+distclean: fpc_distclean
+cleanall: fpc_cleanall
+info: fpc_info
+makefiles: fpc_makefiles
+.PHONY: all debug smart release units examples shared install sourceinstall exampleinstall distinstall zipinstall zipsourceinstall zipexampleinstall zipdistinstall clean distclean cleanall info makefiles
+ifneq ($(wildcard fpcmake.loc),)
+include fpcmake.loc
+endif
+.NOTPARALLEL:
+fpmkunit$(PPUEXT) : fpmkunit.pp

+ 24 - 0
packages/fpmkunit/Makefile.fpc

@@ -0,0 +1,24 @@
+#
+#   Makefile.fpc for fppkg
+#
+
+[package]
+name=fpmkunit
+version=2.0.0
+
+[target]
+units=fpmkunit
+
+[install]
+fpcpackage=y
+
+[compiler]
+sourcedir=src
+includedir=src
+
+[default]
+fpcdir=../..
+
+[rules]
+.NOTPARALLEL:
+fpmkunit$(PPUEXT) : fpmkunit.pp

+ 9 - 0
packages/fpmkunit/fpmake.inc

@@ -0,0 +1,9 @@
+    StartPackage('fpmkunit');
+    Version:='2.0.0';
+    Description:='Free Pascal Make Tool';
+    T:=Targets.AddUnit('fpmkunit');
+    T.Directory:='src';
+    S:=Sources.AddSrcFiles('src/*');
+    S:=Sources.AddSrcFiles('fpmake.inc');
+    S:=Sources.AddSrcFiles('fpmake.pp');
+    EndPackage;

+ 16 - 0
packages/fpmkunit/fpmake.pp

@@ -0,0 +1,16 @@
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmkunit;
+
+var
+  T : TTarget;
+  S : TSource;
+begin
+  with Installer do
+    begin
+      {$i fpmake.inc}
+      Run;
+    end;
+end.
+

+ 3763 - 0
packages/fpmkunit/src/fpmkunit.pp

@@ -0,0 +1,3763 @@
+{$Mode objfpc}
+{$H+}
+{$define debug}
+unit fpmkunit;
+
+Interface
+
+uses SysUtils,Classes,fpmktype;
+
+Type
+  TFileType = (ftSource,ftUnit,ftObject,ftResource,ftExecutable,ftStaticLibrary,
+               ftSharedLibrary);
+  TFileTypes = set of TFileType;
+
+  TOS = (osNone,Amiga,Atari,Darwin,FreeBSD,Go32v2,Linux,MacOS,MorphOS,NetBSD,
+         Netware,NetwLibc,OpenBSD,OS2,PalmOS,Solaris,Win32,Win64,WinCE,Emx);
+  TOSes = Set of TOS;
+
+  TCPU = (cpuNone,Arm,I386,PPC,SPARC,X86_64,M68K,PPC64);
+  TCPUS = Set of TCPU;
+
+  TCompilerMode = (cmFPC,cmTP,cmObjFPC,cmDelphi,cmMacPas);
+  TCompilerModes = Set of TCompilerMode;
+
+  TTargetType = (ttUnit,ttProgram,ttExampleUnit,ttExampleProgram);
+  TTargetTypes = set of TTargetType;
+
+  TTargetState = (tsNeutral,tsCompiling,tsCompiled,tsInstalled);
+  TTargetStates = Set of TTargetState;
+
+  TSourceType = (stDoc,stSrc,stExample,stTest);
+  TSourceTypes = set of TSourceType;
+
+  TVerboseLevel = (vlError,vlWarning,vlInfo,vlCompare,vlCommand,vldebug);
+  TVerboseLevels = Set of TVerboseLevel;
+
+  TCommandAt = (caBeforeCompile,caAfterCompile,
+                caBeforeInstall,caAfterInstall,
+                caBeforeArchive,caAfterArchive,
+                caBeforeClean,caAfterClean,
+                caBeforeDownload,caAfterDownload);
+
+  TLogEvent = Procedure (Level : TVerboseLevel; Const Msg : String) of Object;
+
+  TRunMode = (rmCompile,rmBuild,rmInstall,rmArchive,rmClean,rmManifest,rmListSources);
+
+Const
+  // Aliases
+  Amd64   = X86_64;
+  PowerPC = PPC;
+  PowerPC64 = PPC64;
+  DOS = Go32v2;
+  MacOSX = Darwin;
+
+  AllOSs  = [Low(TOS)..High(TOS)];
+  AllCPUs = [Low(TCPU)..High(TCPU)];
+
+  // Useful
+  UnitExt = '.ppu';
+  PPUExt  = UnitExt;
+  PasExt  = '.pas';
+  PPExt   = '.pp';
+  IncExt  = '.inc';
+  ObjExt  = '.o';
+  RstExt  = '.rst';
+  LibExt  = '.a';
+  SharedLibExt = '.so';
+  DLLExt  = '.dll';
+  ExeExt  = '.exe';
+  ZipExt  = '.zip';
+
+  UnitTargets = [ttUnit,ttExampleUnit];
+  ProgramTargets = [ttProgram,ttExampleProgram];
+
+  AllMessages = [vlError,vlWarning,vlInfo,vlCompare,vlCommand];
+
+Type
+  { TNamedItem }
+
+  TNamedItem = Class(TCollectionItem)
+  private
+    FName: String;
+    procedure SetName(const AValue: String);virtual;
+  Public
+    property Name : String Read FName Write SetName;
+  end;
+
+  { TNamedCollection }
+
+  TNamedCollection = Class(TCollection)
+  private
+    FUniqueNames: Boolean;
+  Public
+    Function IndexOfName(AName : String) : Integer;
+    Function ItemByName(AName : String) : TNamedItem;
+    Property UniqueNames : Boolean Read FUniqueNames;
+  end;
+
+  { TNamedItemList }
+
+  TNamedItemList = Class(TList)
+  private
+    function GetNamedItem(Index : Integer): TNamedItem;
+    procedure SetNamedItem(Index : Integer; const AValue: TNamedItem);
+  public
+    Function IndexOfName(AName : String) : Integer;
+    Function ItemByName(ANAme : String) : TNamedItem;
+    Property NamedItems[Index : Integer] : TNamedItem Read GetNamedItem Write SetNamedItem; default;
+  end;
+
+  { TCommand }
+  TCommand = Class(TNamedItem)
+  private
+    FAfterCommand: TNotifyEvent;
+    FBeforeCommand: TNotifyEvent;
+    FCommand: String;
+    FCommandAt: TCommandAt;
+    FDestFile: String;
+    FIgnoreResult: Boolean;
+    FOptions: String;
+    FSourceFile: String;
+  Public
+    Property SourceFile : String Read FSourceFile Write FSourceFile;
+    Property DestFile : String Read FDestFile Write FDestFile;
+    Property Command : String Read FCommand Write FCommand;
+    Property Options : String Read FOptions Write FOptions;
+    Property At : TCommandAt Read FCommandAt Write FCommandAt;
+    Property IgnoreResult : Boolean Read FIgnoreResult Write FIgnoreResult;
+    Property BeforeCommand : TNotifyEvent Read FBeforeCommand Write FBeforeCommand;
+    Property AfterCommand : TNotifyEvent Read FAfterCommand Write FAfterCommand;
+  end;
+
+  { TCommands }
+
+  TCommands = Class(TNamedCollection)
+  private
+    FDefaultAt: TCommandAt;
+    function GetCommand(Dest : String): TCommand;
+    function GetCommandItem(Index : Integer): TCommand;
+    procedure SetCommandItem(Index : Integer; const AValue: TCommand);
+  Public
+    Function AddCommand(Const Cmd : String) : TCommand;
+    Function AddCommand(Const Cmd,Options : String) : TCommand;
+    Function AddCommand(Const Cmd,Options,Dest,Source : String) : TCommand;
+    Function AddCommand(At : TCommandAt; Const Cmd : String) : TCommand;
+    Function AddCommand(At : TCommandAt; Const Cmd,Options : String) : TCommand;
+    Function AddCommand(At : TCommandAt; Const Cmd,Options, Dest,Source : String) : TCommand;
+    Property CommandItems[Index : Integer] : TCommand Read GetCommandItem Write SetCommandItem;
+    Property Commands[Dest : String] : TCommand Read GetCommand; default;
+    Property DefaultAt : TCommandAt Read FDefaultAt Write FDefaultAt;
+  end;
+
+  { TTarget }
+
+  TTarget = Class(TNamedItem)
+  private
+    FInstall : Boolean;
+    FAfterClean: TNotifyEvent;
+    FAfterCompile: TNotifyEvent;
+    FBeforeClean: TNotifyEvent;
+    FBeforeCompile: TNotifyEvent;
+    FCPUs: TCPUs;
+    FMode: TCompilerMode;
+    FResourceStrings: Boolean;
+    FObjectPath,
+    FUnitPath,
+    FIncludePath,
+    FDependencies: TStrings;
+    FCommands : TCommands;
+    FDirectory: String;
+    FExtension: String;
+    FFileType: TFileType;
+    FOptions: String;
+    FOSes: TOSes;
+    FFPCTarget: String;
+    FTargetState: TTargetState;
+    FTargetType: TTargetType;
+    function GetCommands: TCommands;
+    function GetHasCommands: Boolean;
+    function GetHasStrings(AIndex: integer): Boolean;
+    function GetStrings(AIndex: integer): TStrings;
+    procedure SetCommands(const AValue: TCommands);
+    procedure SetStrings(AIndex: integer; const AValue: TStrings);
+  Protected
+    Function GetSourceFileName : String; virtual;
+    Function GetUnitFileName : String; virtual;
+    Function GetObjectFileName : String; virtual;
+    Function GetRSTFileName : String; Virtual;
+    Function GetProgramFileName(AnOS : TOS) : String; Virtual;
+  Public
+    Constructor Create(ACollection : TCollection); override;
+    Destructor Destroy; override;
+    Function GetOutputFileName (AOs : TOS) : String; Virtual;
+    procedure SetName(const AValue: String);override;
+    Procedure GetCleanFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
+    Procedure GetSourceFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
+    Procedure GetInstallFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
+    Procedure GetArchiveFiles(List : TStrings; APrefix : String; AnOS : TOS); virtual;
+    Property HasUnitPath : Boolean Index 0 Read GetHasStrings;
+    Property HasObjectPath : Boolean Index 1 Read GetHasStrings;
+    Property HasIncludePath : Boolean Index 2 Read GetHasStrings;
+    Property HasDependencies : Boolean Index 3 Read GetHasStrings;
+    Property HasCommands : Boolean Read GetHasCommands;
+    Property UnitPath : TStrings Index 0 Read GetStrings Write SetStrings;
+    Property ObjectPath : TStrings Index 1  Read GetStrings Write SetStrings;
+    Property IncludePath : TStrings Index 2 Read GetStrings Write SetStrings;
+    Property Dependencies : TStrings Index 3 Read GetStrings Write SetStrings;
+    Property Commands : TCommands Read GetCommands Write SetCommands;
+    Property State : TTargetState Read FTargetState;
+    Property TargetType : TTargetType Read FTargetType Write FTargetType;
+    Property OS : TOSes Read FOSes Write FOSes;
+    Property Mode : TCompilerMode Read FMode Write FMode;
+    Property Options : String Read FOptions Write Foptions;
+    Property SourceFileName: String Read GetSourceFileName ;
+    Property UnitFileName : String Read GetUnitFileName;
+    Property ObjectFileName : String Read GetObjectFileName;
+    Property RSTFileName : String Read GetRSTFileName;
+    Property CPU : TCPUs Read FCPUs Write FCPUs;
+    Property FPCTarget : String Read FFPCTarget Write FFPCTarget;
+    Property Extension : String Read FExtension Write FExtension;
+    Property FileType : TFileType Read FFileType Write FFileType;
+    Property Directory : String Read FDirectory Write FDirectory;
+    Property ResourceStrings : Boolean Read FResourceStrings Write FResourceStrings;
+    Property Install : Boolean Read FInstall Write FInstall;
+    // Events.
+    Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
+    Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAfterCompile;
+    Property BeforeClean : TNotifyEvent Read FBeforeClean Write FBeforeClean;
+    Property AfterClean : TNotifyEvent Read FAfterClean Write FAfterClean;
+  end;
+
+  { TTargets }
+
+  TTargets = Class(TNamedCollection)
+  private
+    FDefaultCPU: TCPUs;
+    FDefaultDir : String;
+    FDefaultOS: TOSes;
+    function GetTargetItem(Index : Integer): TTarget;
+    function GetTarget(AName : String): TTarget;
+    procedure SetDefaultDir(const AValue: String);
+    procedure SetTargetItem(Index : Integer; const AValue: TTarget);
+    Procedure ApplyDefaults(ATarget : TTarget);
+  Public
+    Procedure ResetDefaults;
+    Function AddUnit(AUnitName : String) : TTarget;
+    Function AddProgram(AProgramName : String) : TTarget;
+    Function AddExampleUnit(AUnitName : String) : TTarget;
+    Function AddExampleProgram(AProgramName : String) : TTarget;
+    Property Targets[AName : String] : TTarget Read GetTarget; default;
+    Property TargetItems[Index : Integer] : TTarget Read GetTargetItem Write SetTargetItem;
+    Property DefaultDir : String Read FDefaultDir Write SetDefaultDir;
+    Property DefaultOS : TOSes Read FDefaultOS Write FDefaultOS;
+    Property DefaultCPU : TCPUs Read FDefaultCPU Write FDefaultCPU;
+  end;
+
+  { TSource }
+
+  TSource = Class(TNamedItem)
+  private
+    FSourceType: TSourceType;
+  Public
+    Constructor Create(ACollection : TCollection); override;
+    Destructor Destroy; override;
+    procedure GetSourceFiles(List: TStrings);
+    Property SourceType : TSourceType Read FSourceType Write FSourceType;
+  end;
+
+  { TSources }
+
+  TSources = Class(TNamedCollection)
+  private
+    function GetSourceItem(Index : Integer): TSource;
+    procedure SetSourceItem(Index : Integer; const AValue: TSource);
+  public
+    Function AddDocFiles(AFiles : String) : TSource;
+    Function AddSrcFiles(AFiles : String) : TSource;
+    Function AddExampleFiles(AFiles : String) : TSource;
+    Function AddTestFiles(AFiles : String) : TSource;
+    Property SourceItems[Index : Integer] : TSource Read GetSourceItem Write SetSourceItem;default;
+  end;
+
+  { TPackage }
+
+  TPackage = Class(TNamedItem) // Maybe descend from/use TTarget ?
+  private
+    FAfterArchive: TNotifyEvent;
+    FAfterClean: TNotifyEvent;
+    FAfterCompile: TNotifyEvent;
+    FAfterInstall: TNotifyEvent;
+    FAfterManifest: TNotifyEvent;
+    FBeforeArchive: TNotifyEvent;
+    FBeforeClean: TNotifyEvent;
+    FBeforeCompile: TNotifyEvent;
+    FBeforeInstall: TNotifyEvent;
+    FBeforeManifest: TNotifyEvent;
+    FUnitPath,
+    FObjectPath,
+    FIncludePath,
+    FCleanFiles,
+    FArchiveFiles,
+    FInstallFiles,
+    FDependencies: TStrings;
+    FCPU: TCPUs;
+    FOS: TOses;
+    FTargetState: TTargetState;
+    FTargets: TTargets;
+    FSources: TSources;
+    FDirectory: String;
+    FOptions: String;
+    FFileName: String;
+    FAuthor: String;
+    FLicense: String;
+    FExternalURL: String;
+    FVersion: String;
+    FEmail : String;
+    FCommands : TCommands;
+    FDescriptionFile : String;
+    FDescription : String;
+    Function GetDescription : string;
+    Function GetFileName : string;
+    function GetCommands: TCommands;
+    function GetHasCommands: Boolean;
+    function GetHasStrings(AIndex: integer): Boolean;
+    function GetStrings(AIndex: integer): TStrings;
+    procedure SetCommands(const AValue: TCommands);
+    procedure SetStrings(AIndex: integer; const AValue: TStrings);
+  Public
+    constructor Create(ACollection: TCollection); override;
+    destructor destroy; override;
+    Function AddTarget(AName : String) : TTarget;
+    Procedure AddDependency(AName : String);
+    Procedure AddInstallFile(AFileName : String);
+    Procedure GetCleanFiles(List : TStrings; Const APrefix : String; AOS : TOS); virtual;
+    procedure GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix : String; AOS : TOS);
+    Procedure GetArchiveFiles(List : TStrings; Const APrefix : String; AOS : TOS); virtual;
+    Procedure GetSourceFiles(List : TStrings); virtual;
+    Procedure GetManifest(Manifest : TStrings);
+    Property Version : String Read FVersion Write FVersion;
+    Property FileName : String Read GetFileName Write FFileName;
+    Property ExternalURL : String Read FExternalURL Write FExternalURL;
+    Property Email : String Read FEmail Write FEmail;
+    Property Author : String Read FAuthor Write FAuthor;
+    Property License : String Read FLicense Write FLicense;
+    Property Directory : String Read FDirectory Write FDirectory;
+    Property Description : String Read GetDescription Write FDescription;
+    Property DescriptionFile : String Read FDescriptionFile Write FDescriptionFile;
+    // Compiler options.
+    Property OS : TOses Read FOS Write FOS;
+    Property CPU : TCPUs Read FCPU Write FCPU;
+    Property Options: String Read FOptions Write FOptions;
+    Property HasUnitPath : Boolean Index 0 Read GetHasStrings;
+    Property HasObjectPath : Boolean Index 1 Read GetHasStrings;
+    Property HasIncludePath : Boolean Index 2 Read GetHasStrings;
+    Property HasDependencies : Boolean Index 3 Read GetHasStrings;
+    Property HasInstallFiles: Boolean Index 4 Read GetHasStrings;
+    Property HasCleanFiles : Boolean Index 5 Read GetHasStrings;
+    Property HasArchiveFiles : Boolean Index 6 Read GetHasStrings;
+    Property HasCommands : Boolean Read GetHasCommands;
+    Property UnitPath : TStrings Index 0 Read GetStrings Write SetStrings;
+    Property ObjectPath : TStrings Index 1  Read GetStrings Write SetStrings;
+    Property IncludePath : TStrings Index 2 Read GetStrings Write SetStrings;
+    // Targets and dependencies
+    Property Dependencies : TStrings Index 3 Read GetStrings Write SetStrings;
+    Property InstallFiles : TStrings Index 4 Read GetStrings Write SetStrings;
+    Property CleanFiles : TStrings Index 5 Read GetStrings Write SetStrings;
+    Property ArchiveFiles : TStrings Index 6 Read GetStrings Write SetStrings;
+    Property Commands : TCommands Read GetCommands Write SetCommands;
+    Property State : TTargetState Read FTargetState;
+    Property Targets : TTargets Read FTargets;
+    Property Sources : TSources Read FSources;
+    // events
+    Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
+    Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAfterCompile;
+    Property BeforeInstall : TNotifyEvent Read FBeforeInstall Write FBeforeInstall;
+    Property AfterInstall : TNotifyEvent Read FAfterInstall Write FAfterInstall;
+    Property BeforeClean : TNotifyEvent Read FBeforeClean Write FBeforeClean;
+    Property AfterClean : TNotifyEvent Read FAfterClean Write FAfterClean;
+    Property BeforeArchive : TNotifyEvent Read FBeforeArchive Write FBeforeArchive;
+    Property AfterArchive : TNotifyEvent Read FAfterArchive Write FAfterArchive;
+    Property BeforeManifest : TNotifyEvent Read FBeforeManifest Write FBeforeManifest;
+    Property AfterManifest : TNotifyEvent Read FAfterManifest Write FAfterManifest;
+  end;
+
+  { TPackages }
+
+  TPackages = Class(TNamedCollection)
+  private
+    function GetPackage(AName : String): TPackage;
+    function GetPackageItem(AIndex : Integer): TPackage;
+    procedure SetPackageItem(AIndex : Integer; const AValue: TPackage);
+  Public
+    Function AddPackage(Const AName : String) : TPackage;
+    Property Packages[AName : String] : TPackage Read GetPackage ; Default;
+    Property PackageItems[AIndex : Integer] : TPackage Read GetPackageItem Write SetPackageItem;
+  end;
+
+  { TDefaults }
+
+  TDefaults = Class(TPersistent)
+  Private
+    FArchive: String;
+    FCompiler: String;
+    FCopy: String;
+    FMkDir: String;
+    FMove: String;
+    FOptions: String;
+    FCPU: TCPU;
+    FOS: TOS;
+    FMode : TCompilerMode;
+    FCompilerVersion : String;
+    FPrefix: String;
+    FBaseInstallDir,
+    FUnitInstallDir,
+    FBinInstallDir,
+    FDocInstallDir,
+    FExamplesInstallDir : String;
+    FRemove: String;
+    FTarget: String;
+    FUnixPaths: Boolean;
+    function GetBaseInstallDir: String;
+    function GetBinInstallDir: String;
+    function GetCompiler: String;
+    function GetDocInstallDir: String;
+    function GetExamplesInstallDir: String;
+    function GetUnitInstallDir: String;
+    procedure SetBaseInstallDir(const AValue: String);
+    procedure SetCPU(const AValue: TCPU);
+    procedure SetOS(const AValue: TOS);
+    procedure SetPrefix(const AValue: String);
+    procedure SetTarget(const AValue: String);
+  Protected
+    procedure RecalcTarget;
+  Public
+    Constructor Create;
+    Procedure InitDefaults;
+    Procedure Assign(ASource : TPersistent);override;
+    procedure CompilerDefaults;
+    Procedure LocalInit(Const AFileName : String);
+    Procedure LoadFromFile(Const AFileName : String);
+    Procedure SaveToFile(Const AFileName : String);
+    procedure SaveToStream(S : TStream);virtual;
+    procedure LoadFromStream(S : TStream);virtual;
+    // Compile Information
+    Property Target : String Read FTarget Write SetTarget;
+    Property OS : TOS Read FOS Write SetOS;
+    Property CPU : TCPU Read FCPU Write SetCPU;
+    Property Mode : TCompilerMode Read FMode Write FMode;
+    Property UnixPaths : Boolean Read FUnixPaths Write FUnixPaths;
+    Property Options : String Read FOptions Write FOptions;    // Default compiler options.
+    // paths etc.
+    Property Prefix : String Read FPrefix Write SetPrefix;
+    Property BaseInstallDir : String Read GetBaseInstallDir Write SetBaseInstallDir;
+    Property UnitInstallDir : String Read GetUnitInstallDir Write FUnitInstallDir;
+    Property BinInstallDir : String Read GetBinInstallDir Write FBinInstallDir;
+    Property DocInstallDir : String Read GetDocInstallDir Write FDocInstallDir;
+    Property ExamplesInstallDir : String Read GetExamplesInstallDir Write FExamplesInstallDir;
+    // Command tools. If not set, internal commands  will be used.
+    Property Compiler : String Read GetCompiler Write FCompiler; // Compiler. Defaults to fpc/ppc386
+    Property Copy : String Read FCopy Write FCopy;             // copy $(FILES) to $(DEST)
+    Property Move : String Read FMove Write FMove;             // Move $(FILES) to $(DEST)
+    Property Remove : String Read FRemove Write FRemove;       // Delete $(FILES)
+    Property MkDir : String Read FMkDir write FMkDir;          // Make $(DIRECTORY)
+    Property Archive : String Read FArchive Write FArchive;    // zip $(ARCHIVE) $(FILESORDIRS)
+  end;
+
+  { TBuildEngine }
+
+  TBuildEngine = Class(TComponent)
+  private
+    // general variables
+    FCompiler : String;
+    FStartDir : String;
+    FTargetDir : String;
+    FDefaults : TDefaults;
+    FForceCompile : Boolean;
+    FListMode : Boolean;
+    // Variables used when compiling a package.
+    // Only valid during compilation of the package.
+    FCurrentOutputDir : String;
+    FCurrentPackage: TPackage;
+    // Events
+    FOnLog: TLogEvent;
+    FAfterArchive: TNotifyEvent;
+    FAfterClean: TNotifyEvent;
+    FAfterCompile: TNotifyEvent;
+    FAfterInstall: TNotifyEvent;
+    FAfterManifest: TNotifyEvent;
+    FBeforeArchive: TNotifyEvent;
+    FBeforeClean: TNotifyEvent;
+    FBeforeCompile: TNotifyEvent;
+    FBeforeInstall: TNotifyEvent;
+    FBeforeManifest: TNotifyEvent;
+    procedure SetDefaults(const AValue: TDefaults);
+    procedure SetTargetDir(const AValue: String);
+  Protected
+    Procedure Error(Msg : String);
+    Procedure Error(Fmt : String; Args : Array of const);
+    // Internal copy/delete/move/archive/mkdir files
+    Procedure SysCopyFile(Const Src,Dest : String); virtual;
+    Procedure SysMoveFile(Const Src,Dest : String); virtual;
+    Procedure SysDeleteFile(Const AFileName : String); virtual;
+    Procedure SysArchiveFiles(List : TStrings; Const AFileName : String); virtual;
+    Procedure Log(Level : TVerboseLevel; Const Msg : String);
+    Procedure Log(Level : TVerboseLevel; Const Fmt : String; Args : Array Of Const);
+    Procedure EnterDir(ADir : String);
+    Function GetCompiler : String;
+    Procedure InstallPackageFiles(APAckage : TPackage; tt : TTargetType; Const Src,Dest : String); virtual;
+    Function FileNewer(Src,Dest : String) : Boolean;
+
+  Public
+    Constructor Create(AOwner : TComponent); override;
+    // Public Copy/delete/Move/Archive/Mkdir Commands.
+    Procedure ExecuteCommand(Cmd : String; Args : String; IgnoreError : Boolean = False); virtual;
+    Procedure CmdCopyFiles(List : TStrings; Const DestDir : String);
+    Procedure CmdCreateDir(DestDir : String);
+    Procedure CmdMoveFiles(List : TStrings; Const DestDir : String);
+    Procedure CmdDeleteFiles(List : TStrings);
+    Procedure CmdArchiveFiles(List : TStrings; Const ArchiveFile : String);
+    Procedure ExecuteCommands(Commands : TCommands; At : TCommandAt);
+    // Target commands
+    Function  GetTargetDir(APackage : TPackage; ATarget : TTarget; AbsolutePath : Boolean = False) : String;
+    Function  GetCompilerCommand(APackage : TPackage; Target : TTarget) : String;
+    Function  TargetOK(Target : TTarget) : Boolean;
+    Function  NeedsCompile(Target : TTarget) : Boolean;
+    Procedure Compile(Target : TTarget);  virtual;
+    Procedure FixDependencies(Target: TTarget);
+    // Package commands
+    Function  GetPackageDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
+    Function  GetOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
+    Function  PackageOK(APackage : TPackage) : Boolean; virtual;
+    Procedure DoBeforeCompile(APackage : TPackage);virtual;
+    Procedure DoAfterCompile(APackage : TPackage);virtual;
+    Procedure DoBeforeInstall(APackage : TPackage);virtual;
+    Procedure DoAfterInstall(APackage : TPackage);virtual;
+    Procedure DoBeforeArchive(APackage : TPackage);virtual;
+    Procedure DoAfterArchive(APackage : TPackage);virtual;
+    Procedure DoBeforeClean(APackage : TPackage);virtual;
+    Procedure DoAfterClean(APackage : TPackage);virtual;
+    Function NeedsCompile(APackage : TPackage) : Boolean; virtual;
+    Procedure Compile(APackage : TPackage);
+    Procedure Install(APackage : TPackage);
+    Procedure Archive(APackage : TPackage);
+    Procedure Clean(APackage : TPackage);
+    Procedure FixDependencies(APackage : TPackage);
+    Procedure GetSourceFiles(APackage : TPackage; List : TStrings);
+    Procedure GetManifest(APackage : TPackage; Manifest : TStrings);
+    procedure CheckExternalPackage(Const APackageName : String);
+    procedure CreateOutputDir(APackage: TPackage);
+    // Packages commands
+    Procedure Compile(Packages : TPackages);
+    Procedure Install(Packages : TPackages);
+    Procedure Archive(Packages : TPackages);
+    Procedure Clean(Packages : TPackages);
+    Procedure GetSourceFiles(Packages : TPackages;List : TStrings);
+    Procedure GetManifest(Packages : TPackages; Manifest : TStrings);
+    Property ListMode : Boolean Read FListMode Write FListMode;
+    Property ForceCompile : Boolean Read FForceCompile Write FForceCompile;
+    Property Defaults : TDefaults Read FDefaults Write SetDefaults;
+    Property TargetDir : String Read FTargetDir Write SetTargetDir;
+    // Events
+    Property BeforeCompile : TNotifyEvent Read FBeforeCompile Write FBeforeCompile;
+    Property AfterCompile : TNotifyEvent Read FAfterCompile Write FAfterCompile;
+    Property BeforeInstall : TNotifyEvent Read FBeforeInstall Write FBeforeInstall;
+    Property AfterInstall : TNotifyEvent Read FAfterInstall Write FAfterInstall;
+    Property BeforeClean : TNotifyEvent Read FBeforeClean Write FBeforeClean;
+    Property AfterClean : TNotifyEvent Read FAfterClean Write FAfterClean;
+    Property BeforeArchive : TNotifyEvent Read FBeforeArchive Write FBeforeArchive;
+    Property AfterArchive : TNotifyEvent Read FAfterArchive Write FAfterArchive;
+    Property BeforeManifest : TNotifyEvent Read FBeforeManifest Write FBeforeManifest;
+    Property AfterManifest : TNotifyEvent Read FAfterManifest Write FAfterManifest;
+    Property OnLog : TLogEvent Read FOnLog Write FOnlog;
+  end;
+
+  { TInstaller }
+
+  TInstaller = Class(TComponent)
+  private
+    FBuildEngine: TBuildEngine;
+    FDefaultPackage: TPackage;
+    FDefaults: TDefaults;
+    FPackages: TPackages;
+    FRunMode: TRunMode;
+    FListMode : Boolean;
+    FLogLevels : TVerboseLevels;
+    Function GetPackageString(Index : Integer) : String;
+    Procedure SetPackageString(Index : Integer; AValue : String);
+    function GetStrings(AIndex : Integer): TStrings;
+    function GetOSes: TOSes;
+    function GetTargets: TTargets;
+    function GetSources: TSources;
+    procedure SetDefaultPackage(const AValue: TPackage);
+    procedure SetDefaults(const AValue: TDefaults);
+    procedure SetStrings(AIndex : Integer; const AValue: TStrings);
+    procedure SetOses(const AValue: TOSes);
+  Protected
+    Procedure Log(Level : TVerboseLevel; Const Msg : String);
+    Procedure CreatePackages; virtual;
+    Procedure CheckPackages; virtual;
+    Procedure CreateBuildEngine; virtual;
+    Procedure CheckDefaultPackage;
+    Procedure Error(Msg : String);
+    Procedure Error(Fmt : String; Args : Array of const);
+    Procedure AnalyzeOptions;
+    Procedure Usage(FMT : String; Args : Array of const);
+    Procedure Compile(Force : Boolean); virtual;
+    Procedure Clean; virtual;
+    Procedure Install; virtual;
+    Procedure Archive; virtual;
+    Procedure Manifest; virtual;
+    Procedure GetSourceFiles; virtual;
+    Property BuildEngine : TBuildEngine Read FBuildEngine;
+  Public
+    Constructor Create(AOWner : TComponent); override;
+    Destructor destroy; override;
+    Function StartPackage(Const AName : String) : TPackage;
+    Procedure EndPackage;
+    Function Run : Boolean;
+    Function AddTarget(AName : String) : TTarget;
+    Procedure AddDependency(AName : String);
+    Property DefaultPackage : TPackage read FDefaultPackage write SetDefaultPackage;
+    Property Packages : TPackages Read FPackages;
+    Property Dependencies : TStrings Index 0 Read GetStrings Write SetStrings;
+    Property InstallFiles : TStrings Index 1 Read GetStrings Write SetStrings;
+    Property CleanFiles : TStrings Index 2 Read GetStrings Write SetStrings;
+    Property ArchiveFiles : TStrings Index 3 Read GetStrings Write SetStrings;
+    Property Defaults : TDefaults Read FDefaults Write SetDefaults;
+    Property RunMode : TRunMode Read FRunMode;
+    Property ListMode : Boolean Read FListMode;
+    // Default Package redirects.
+    Property Targets : TTargets Read GetTargets;
+    Property Sources : TSources Read GetSources;
+    Property OS: TOSes Read GetOSes Write SetOses;
+    Property Author : String Index 0 Read GetPackageString Write SetPackageString;
+    Property Directory : String Index 1 Read GetPackageString Write SetPackageString;
+    Property License : String Index 2 Read GetPackageString Write SetPackageString;
+    Property Options : String Index 3 Read GetPackageString Write SetPackageString;
+    Property ExternalURL : String Index 4 Read GetPackageString Write SetPackageString;
+    Property Email : String Index 5 Read GetPackageString Write SetPackageString;
+    Property Description: String Index 6 Read GetPackageString Write SetPackageString;
+    Property DescriptionFileName: String Index 7 Read GetPackageString Write SetPackageString;
+    Property Version : String Index 8 Read GetPackageString Write SetPackageString;
+    Property FileName : String Index 9 Read GetPackageString Write SetPackageString;
+  end;
+
+  TReplaceFunction = Function (Const AName,Args : String) : String of Object;
+
+  { TValueItem }
+
+  TValueItem = Class(TObject)
+    FValue : String;
+    Constructor Create(AValue : String);
+  end;
+
+  { TFunctionItem }
+
+  TFunctionItem = Class(TObject)
+    FFunc : TReplaceFunction;
+    Constructor Create(AFunc : TReplaceFunction);
+  end;
+
+  { TDictionary }
+
+  TDictionary = Class(TComponent)
+    FList : TStringList;
+  Public
+    Constructor Create(AOwner : TComponent); override;
+    Destructor Destroy;override;
+    Procedure AddVariable(Const AName,Value : String);
+    Procedure AddFunction(Const AName : String; FReplacement : TReplaceFunction);
+    Procedure RemoveItem(Const AName : String);
+    Function GetValue(Const AName : String) : String;
+    Function GetValue(Const AName,Args : String) : String; virtual;
+    Function ReplaceStrings(Const ASource : String) : String; virtual;
+  end;
+
+  ECollectionError = Class(Exception);
+  EDictionaryError = Class(Exception);
+  EInstallerError = Class(Exception);
+
+  TInstallerClass = Class of TInstaller;
+  TDictionaryClass = Class of TDictionary;
+
+
+Type
+  TArchiveEvent = Procedure (Const AFileName : String; List : TStrings) of Object;
+  TArchiveProc = Procedure (Const AFileName : String; List : TStrings);
+
+Var
+  InstallerClass : TInstallerClass = TInstaller;
+  DictionaryClass : TDictionaryClass = TDictionary;
+  OnArchiveFiles : TArchiveEvent = Nil;
+  ArchiveFilesProc : TArchiveProc = Nil;
+
+Function CurrentOS : String;
+Function CurrentCPU : String;
+
+Function Installer : TInstaller;
+Function Defaults : TDefaults; // Set by installer.
+Function Dictionary : TDictionary;
+
+Function OSToString(OS: TOS) : String;
+Function OSesToString(OSes: TOSes) : String;
+Function CPUToString(CPU: TCPU) : String;
+Function CPUSToString(CPUS: TCPUS) : String;
+Function StringToOS(S : String) : TOS;
+Function OSesToString(S : String) : TOSes;
+Function StringToCPU(S : String) : TCPU;
+Function StringToCPUS(S : String) : TCPUS;
+Function ModeToString(Mode: TCompilerMode) : String;
+Function StringToMode(S : String) : TCompilerMode;
+Function MakeTargetString(CPU : TCPU;OS: TOS) : String;
+Procedure StringToCPUOS(S : String; Var CPU : TCPU; Var OS: TOS);
+Procedure ResolveDependencies(L : TStrings; P : TNamedCollection);
+Function AddStrings(Dest,Src : TStrings) : Integer ;
+function AddStrings(Dest, Src : TStrings; Const APrefix : String) : Integer ;
+Function FileListToString(List : TStrings; Prefix : String) : String;
+Function FixPath (APath : String) : String;
+Procedure ChangeDir(APath : String);
+Function Substitute(Const Source : String; Macros : Array of string) : String;
+Procedure SplitCommand(Const Cmd : String; Var Exe,Options : String);
+
+Implementation
+
+uses typinfo;
+
+ResourceString
+  SErrInvalidCPU        = 'Invalid CPU name : "%s"';
+  SErrInvalidOS         = 'Invalid OS name : "%s"';
+  SErrInvalidMode       = 'Invalid compiler mode : "%s"';
+  SErrInvalidTarget     = 'Invalid compiler target: %s';
+  SErrNameExists        = 'Name "%s" already exists in the collection.';
+  SErrNoSuchName        = 'Could not find item with name "%s" in the collection.';
+  SErrNoPackage         = 'No package available. Add package with StartPackage Call';
+  SErrInValidArgument   = 'Invalid command-line argument at position %d : %s';
+  SErrNeedArgument      = 'Option at position %d (%s) needs an argument';
+  SErrNoPackagesDefined = 'No action possible: No packages were defined.';
+  SErrInstaller         = 'The installer encountered the following error:';
+  SErrDepUnknownTarget  = 'Unknown target in dependencies for %s: %s';
+  SErrExternalCommandFailed = 'External command "%s" failed with exit code: %d';
+  SErrCreatingDirectory = 'Failed to create directory: %s';
+  SErrDeletingFile      = 'Failed to delete file: %s';
+  SErrMovingFile        = 'Failed to move file "%s" to "%s"';
+  SErrCopyingFile       = 'Failed to copy file "%s" to "%s"';
+  SErrChangeDirFailed   = 'Failed to enter directory: %s';
+  SErrInvalidArgumentToSubstitute = 'Invalid number of arguments to Substitute';
+  SErrNoArchiveSupport  = 'This binary contains no archive support. Please recompile with archive support';
+  SErrNoDictionaryItem  = 'No item called "%s" in the dictionary';
+  SErrNoDictionaryValue = 'The item "%s" in the dictionary is not a value.';
+  SErrNoDictionaryFunc  = 'The item "%s" in the dictionary is not a function.';
+  SWarnCircularDependency = 'Warning: Circular dependency detected when compiling target %s: %s';
+  SWarnFailedToSetTime  = 'Warning: Failed to set timestamp on file : %s';
+  SWarnFailedToGetTime  = 'Warning: Failed to get timestamp from file : %s';
+  SWarnFileDoesNotExist = 'Warning: File "%s" does not exist';
+
+  // Log messages
+  SLogEnterDir           = 'Entering directory: %s';
+  SLogCompilingPackage   = 'Compiling package : %s';
+  SLogCompilingTarget    = 'Compiling target  : %s';
+  SLogExecutingCommand   = 'Executing command %s with options: %s';
+  SLogCreatingOutputDir  = 'Creating output dir : %s';
+  SLogOutputDirExists    = 'Output dir exists : %s';
+  SLogInstallingPackage  = 'Installing package : %s';
+  SLogArchivingPackage   = 'Archiving package : %s';
+  SLogCleaningPackage    = 'Cleaning package : %s';
+  SLogCopyingFile        = 'Copying file "%s" to "%s"';
+  SLogCompilingFileTimes = 'Comparing file "%s" time "%s" to "%s" time "%s".';
+  SLogSourceNewerDest    = 'Source file "%s" (%s) is newer than destination "%s" (%s).';
+
+  // Help messages for usage
+  SValue              = 'Value';
+  SHelpUsage          = 'Usage: %s command [options]';
+  SHelpCommand        = 'Where command is one of the following:';
+  SHelpCompile        = 'Compile all units in the package(s).';
+  SHelpBuild          = 'Build all units in the package(s).';
+  SHelpInstall        = 'Install all units in the package(s).';
+  SHelpClean          = 'Clean (remove) all units in the package(s).';
+  SHelpArchive        = 'Create archive (zip) with all units in the package(s).';
+  SHelpHelp           = 'This message.';
+  SHelpManifest       = 'Create a manifest suitable for import in repository.';
+  SHelpCmdOptions     = 'Where options is one or more of the following:';
+  SHelpCPU            = 'Compile for indicated CPU.';
+  SHelpOS             = 'Compile for indicated OS';
+  SHelpTarget         = 'Compile for indicated target';
+  SHelpList           = 'list commands instead of actually executing them.';
+  SHelpPrefix         = 'Use indicated prefix directory for all commands.';
+  SHelpNoDefaults     = 'Do not use defaults when compiling.';
+  SHelpBaseInstallDir = 'Use indicated directory as base install dir.';
+  SHelpCompiler       = 'Use indicated binary as compiler';
+  SHelpConfig         = 'Use indicated config file when compiling.';
+  SHelpVerbose        = 'Be verbose when working.';
+
+
+Const
+  // Keys for Defaults file. Do not localize.
+  KeyCompiler = 'Compiler';
+  KeyArchive  = 'Archive';
+  KeyCopy     = 'Copy';
+  KeyMkDir    = 'MkDir';
+  KeyMove     = 'Move';
+  KeyRemove   = 'Remove';
+  KeyOptions  = 'Options';
+  KeyCPU      = 'CPU';
+  KeyOS       = 'OS';
+  KeyMode     = 'Mode';
+  KeyPrefix   = 'Prefix';
+  KeyTarget   = 'Target';
+  KeyBaseInstallDir     = 'BaseInstallDir';
+  KeyUnitInstallDir     = 'UnitInstallDir';
+  KeyBinInstallDir      = 'BinInstallDir';
+  KeyDocInstallDir      = 'DocInstallDir';
+  KeyExamplesInstallDir = 'ExamplesInstallDir';
+
+// Callback for Sysutils getapplicationname.
+
+Function GetFPMakeName : String;
+
+begin
+  Result:='fpmake';
+end;
+
+
+Function CurrentOS : String;
+
+begin
+  Result:=OSToString(Defaults.OS);
+end;
+
+Function CurrentCPU : String;
+
+begin
+  Result:=CPUToString(Defaults.CPU);
+end;
+
+Function OSToString(OS: TOS) : String;
+
+begin
+  Result:=LowerCase(GetenumName(TypeInfo(TOS),Ord(OS)));
+end;
+
+Function OSesToString(OSes: TOSes) : String;
+
+begin
+  Result:=LowerCase(SetToString(PtypeInfo(TypeInfo(TOSes)),Integer(OSes),False));
+end;
+
+Function CPUToString(CPU: TCPU) : String;
+
+begin
+  Result:=LowerCase(GetenumName(TypeInfo(TCPU),Ord(CPU)));
+end;
+
+Function CPUSToString(CPUS: TCPUS) : String;
+
+begin
+  Result:=LowerCase(SetToString(PTypeInfo(TypeInfo(TCPUS)),Integer(CPUS),False));
+end;
+
+Function StringToOS(S : String) : TOS;
+
+Var
+  I : Integer;
+
+begin
+  I:=GetEnumValue(TypeInfo(TOS),S);
+  if (I=-1) then
+    Raise EInstallerError.CreateFmt(SErrInvalidOS,[S]);
+  Result:=TOS(I);
+end;
+
+
+Function OSesToString(S : String) : TOSes;
+
+begin
+  Result:=TOSes(StringToSet(PTypeInfo(TypeInfo(TOSes)),S));
+end;
+
+Function StringToCPU(S : String) : TCPU;
+
+Var
+  I : Integer;
+
+begin
+  I:=GetEnumValue(TypeInfo(TCPU),S);
+  if (I=-1) then
+    Raise EInstallerError.CreateFmt(SErrInvalidCPU,[S]);
+  Result:=TCPU(I);
+end;
+
+Function StringToCPUS(S : String) : TCPUS;
+
+begin
+  Result:=TCPUS(StringToSet(PTypeInfo(TypeInfo(TCPUS)),S));
+end;
+
+Function ModeToString(Mode: TCompilerMode) : String;
+
+begin
+  Result:=LowerCase(GetenumName(TypeInfo(TCompilerMode),Ord(Mode)));
+end;
+
+Function StringToMode(S : String) : TCompilerMode;
+
+Var
+  I : Integer;
+
+begin
+  I:=GetEnumValue(TypeInfo(TCompilerMode),S);
+  if (I=-1) then
+    Raise EInstallerError.CreateFmt(SErrInvalidMode,[S]);
+  Result:=TCompilerMode(I);
+end;
+
+
+Function MakeTargetString(CPU : TCPU;OS: TOS) : String;
+
+begin
+  Result:=CPUToString(CPU)+'-'+OSToString(OS);
+end;
+
+Procedure StringToCPUOS(S : String; Var CPU : TCPU; Var OS: TOS);
+
+Var
+  P : integer;
+
+begin
+  P:=Pos('-',S);
+  If (P=0) then
+    Raise EInstallerError.CreateFmt(SErrInvalidTarget,[S]);
+  CPU:=StringToCPU(Copy(S,1,P-1));
+  OS:=StringToOs(Copy(S,P+1,Length(S)-P));
+end;
+
+
+Procedure ResolveDependencies(L : TStrings; P : TNamedCollection);
+
+Var
+  I,J : Integer;
+
+begin
+  If Assigned(L) then
+    For I:=0 to L.Count-1 do
+      begin
+      J:=P.IndexOfName(L[i]);
+      If J<>-1 then
+        L.Objects[I]:=P.Items[J];
+      end;
+end;
+
+Function AddStrings(Dest,Src : TStrings) : Integer ;
+
+begin
+  Result:=AddStrings(Dest,Src,'');
+end;
+
+Procedure AddStrings(Var S : String; L : TStrings; Prefix : String);
+
+Var
+  I : Integer;
+
+begin
+  For I:=0 to L.Count-1 do
+    begin
+    if (S<>'') then
+      S:=S+' ';
+    S:=S+Prefix+L[i];
+    end;
+end;
+
+function AddStrings(Dest, Src : TStrings; Const APrefix : String) : Integer ;
+begin
+  Result:=0;
+  While (Result<Src.Count) do
+    begin
+    If (APrefix<>'') then
+      Dest.Add(APrefix+Src[Result]) // Not sure whether '' is optimized away.
+    else
+      Dest.Add(Src[Result]);
+    Inc(Result);
+    end;
+end;
+
+function FileListToString(List : TStrings; Prefix : String) : String;
+
+Var
+  I : integer;
+  S : String;
+
+begin
+  Result:='';
+  For I:=0 to List.Count-1 do
+    begin
+    If (I>0) then
+      Result:=Result+' ';
+    S:=Prefix+List[i];
+    If (Pos(' ',S)<>0) then
+      S:='"'+S+'"';
+    Result:=Result+S;
+    end;
+end;
+
+function FixPath (APath : String) : String;
+
+Var
+  P : PChar;
+
+begin
+  Result:=APath;
+  If (result<>'') then
+    begin
+    P:=PChar(Result);
+    While (P^<>#0) do
+      begin
+      If P^ in ['/','\',':'] then // do not use drive letters.
+        P^:=PathDelim;
+      Inc(P);
+      end;
+    end;
+end;
+
+procedure ChangeDir(APath : String);
+
+begin
+  if Not SetCurrentDir(APath) then
+    Raise EInstallerError.CreateFmt(SErrChangeDirFailed,[APath]);
+end;
+
+procedure SplitCommand(const Cmd : String; var Exe, Options : String);
+
+Const
+  WhiteSpace = [#9,#10,#13,' '];
+  QuoteChars = ['''','"'];
+
+Var
+  I : Integer;
+  InQuote : Boolean;
+  LastQuote : Char;
+  S : String;
+
+begin
+  S:=Trim(Cmd);
+  InQuote:=False;
+  LastQuote:=#0;
+  I:=1;
+  While (I<=Length(S)) and (Inquote or not (S[I] in whiteSpace)) do
+    begin
+    If S[i] in QuoteChars then
+      begin
+      InQuote:=Not (S[i]=LastQuote);
+      If InQuote then
+         LastQuote:=S[i]
+       else
+         LastQuote:=#0;
+      end;
+    Inc(I);
+    end;
+  Exe:=Copy(S,1,I-1);
+  Delete(S,1,I);
+  Options:=Trim(S);
+end;
+
+{ TNamedItem }
+
+procedure TNamedItem.SetName(const AValue: String);
+
+begin
+  if FName=AValue then exit;
+  With TNamedCollection(Collection) do
+    If UniqueNames then
+      If (IndexOfName(AVAlue)<>-1) then
+        Raise ECollectionError.CreateFmt(SErrNameExists,[AValue]);
+  FName:=AValue;
+end;
+
+{ TNamedCollection }
+
+function TNamedCollection.IndexOfName(AName: String): Integer;
+
+begin
+  Result:=Count-1;
+  While (Result>=0) and (CompareText(TNamedItem(Items[Result]).FName,AName)<>0) do
+    Dec(Result);
+end;
+
+function TNamedCollection.ItemByName(AName: String): TNamedItem;
+
+Var
+  I : Integer;
+
+begin
+  I:=IndexOfName(AName);
+  If (I=-1) Then
+    Raise ECollectionError.CreateFmt(SErrNoSuchName,[AName]);
+  Result:=TNamedItem(Items[i]);
+end;
+
+
+{ TTargets }
+
+function TTargets.GetTargetItem(Index : Integer): TTarget;
+begin
+  Result:=TTarget(Items[Index]);
+end;
+
+function TTargets.GetTarget(AName : String): TTarget;
+begin
+  Result:=TTarget(ItemByName(AName));
+end;
+
+procedure TTargets.SetDefaultDir(const AValue: String);
+begin
+  If (AValue<>'') then
+    FDefaultDir:=IncludeTrailingPathDelimiter(AValue)
+  else
+    FDefaultDir:='';
+end;
+
+procedure TTargets.SetTargetItem(Index : Integer; const AValue: TTarget);
+
+begin
+  Items[Index]:=AValue;
+end;
+
+procedure TTargets.ApplyDefaults(ATarget: TTarget);
+begin
+  If (ATarget.Directory='') then
+    ATarget.Directory:=FDefaultDir;
+   ATarget.OS:=FDefaultOS;
+   ATarget.CPU:=FDefaultCPU;
+end;
+
+procedure TTargets.ResetDefaults;
+begin
+  FDefaultDir:='';
+  FDefaultOS:=[];
+  FDefaultCPU:=[];
+end;
+
+Function TTargets.AddUnit(AUnitName: String) : TTarget;
+
+
+begin
+  Result:=Add as TTarget;
+  Result.Name:=AUnitName;
+  Result.TargetType:=TTUnit;
+  ApplyDefaults(Result);
+end;
+
+Function TTargets.AddProgram(AProgramName: String) : TTarget;
+begin
+  Result:=Add as TTarget;
+  Result.Name:=AProgramName;
+  Result.TargetType:=ttProgram;
+  ApplyDefaults(Result);
+end;
+
+Function TTargets.AddExampleUnit(AUnitName: String): TTarget;
+begin
+  Result:=Add as TTarget;
+  Result.Name:=AUnitName;
+  Result.TargetType:=ttExampleUnit;
+  ApplyDefaults(Result);
+end;
+
+Function TTargets.AddExampleProgram(AProgramName: String): TTarget;
+begin
+  Result:=Add as TTarget;
+  Result.Name:=AProgramName;
+  Result.TargetType:=ttExampleProgram;
+  ApplyDefaults(Result);
+end;
+
+
+{ TSources }
+
+function TSources.GetSourceItem(Index : Integer): TSource;
+begin
+  Result:=TSource(Items[Index]);
+end;
+
+
+procedure TSources.SetSourceItem(Index : Integer; const AValue: TSource);
+begin
+  Items[Index]:=AValue;
+end;
+
+
+function TSources.AddDocFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stDoc;
+end;
+
+
+function TSources.AddSrcFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stSrc;
+end;
+
+function TSources.AddExampleFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stExample;
+end;
+
+function TSources.AddTestFiles(AFiles : String) : TSource;
+begin
+  Result:=Add as TSource;
+  Result.Name:=AFiles;
+  Result.SourceType:=stTest;
+end;
+
+{ TNamedItemList }
+
+function TNamedItemList.GetNamedItem(Index : Integer): TNamedItem;
+begin
+  Result:=TNamedItem(Items[Index]);
+end;
+
+procedure TNamedItemList.SetNamedItem(Index : Integer; const AValue: TNamedItem);
+begin
+  Items[Index]:=AValue;
+end;
+
+function TNamedItemList.IndexOfName(AName: String): Integer;
+
+begin
+  Result:=Count-1;
+  While (Result>=0) and (CompareText(GetNamedItem(Result).Name,AName)<>0) do
+    Dec(Result);
+end;
+
+function TNamedItemList.ItemByName(ANAme: String): TNamedItem;
+
+Var
+  I : Integer;
+
+begin
+  I:=IndexOfName(AName);
+  If (I=-1) Then
+    Raise ECollectionError.CreateFmt(SErrNoSuchName,[AName]);
+  Result:=TNamedItem(Items[i]);
+end;
+
+{ TDefaults }
+
+procedure TDefaults.SetCPU(const AValue: TCPU);
+begin
+  FCPU:=AValue;
+  RecalcTarget;
+end;
+
+function TDefaults.GetBaseInstallDir: String;
+begin
+  If (FBaseInstallDir<>'') then
+    Result:=FBaseInstallDir
+  else
+    if UnixPaths then
+      Result:=Prefix+PathDelim+'lib'+PathDelim+'fpc'
+    else
+      Result:=Prefix;
+
+end;
+
+function TDefaults.GetBinInstallDir: String;
+begin
+  If (FBinInstallDir<>'') then
+    Result:=FBinInstallDir
+  else
+    If UnixPaths then
+      Result:=BaseInstallDir+PathDelim+'bin'
+    else
+      Result:=BaseInstallDir+PathDelim+'bin';
+end;
+
+function TDefaults.GetCompiler: String;
+begin
+  If (FCompiler<>'') then
+    Result:=FCompiler
+  else
+    Result:='fpc';
+end;
+
+function TDefaults.GetDocInstallDir: String;
+begin
+  If (FBinInstallDir<>'') then
+    Result:=FBinInstallDir
+  else
+    If UnixPaths then
+      Result:=Prefix+PathDelim+'share'+PathDelim+'docs'
+    else
+      Result:=BaseInstallDir+PathDelim+'docs';
+end;
+
+function TDefaults.GetExamplesInstallDir: String;
+begin
+  If (FExamplesInstallDir<>'') then
+    Result:=FExamplesInstallDir
+  else
+    If UnixPaths then
+      Result:=Prefix+PathDelim+'share'+PathDelim+'docs'+PathDelim+'examples'
+    else
+      Result:=BaseInstallDir+PathDelim+'examples';
+end;
+
+function TDefaults.GetUnitInstallDir: String;
+begin
+  If (FUnitInstallDir<>'') then
+    Result:=FUnitInstallDir
+  else
+    If UnixPaths then
+      Result:=BaseInstallDir+PathDelim+'units'+PathDelim+Target
+    else
+      Result:=BaseInstallDir+PathDelim+'units'+PathDelim+Target;
+end;
+
+procedure TDefaults.SetBaseInstallDir(const AValue: String);
+begin
+  FBaseInstallDir:=AValue;
+  UnitInstallDir:='';
+  BinInstallDir:='';
+  ExamplesInstallDir:='';
+end;
+
+procedure TDefaults.SetOS(const AValue: TOS);
+begin
+  FOS:=AValue;
+  Recalctarget;
+end;
+
+procedure TDefaults.SetPrefix(const AValue: String);
+begin
+  if FPrefix=AValue then exit;
+  FPrefix:=AValue;
+  BaseInstallDir:='';
+end;
+
+procedure TDefaults.SetTarget(const AValue: String);
+
+Var
+  P : Integer;
+
+begin
+  if FTarget<>AValue then
+    begin
+    P:=Pos('-',AValue);
+    If (P<>0) then
+      begin
+      FOS:=StringToOS(System.Copy(Avalue,P+1,Length(AValue)-P));
+      FCPU:=StringToCPU(System.Copy(Avalue,1,P-1));
+      end
+    else
+      FOS:=StringToOS(AValue);
+    FTarget:=AValue;
+    end;
+end;
+
+procedure TDefaults.RecalcTarget;
+begin
+  Ftarget:=CPUToString(FCPU)+'-'+OStoString(FOS);
+end;
+
+constructor TDefaults.Create;
+begin
+  InitDefaults;
+end;
+
+procedure TDefaults.InitDefaults;
+begin
+  {$ifdef unix}
+  UnixPaths:=True;
+  {$else}
+  UnixPaths:=False;
+  {$endif}
+end;
+
+procedure TDefaults.Assign(ASource: TPersistent);
+
+Var
+  d : TDefaults;
+
+begin
+  If ASource is TDefaults then
+    begin
+    D:=ASource as TDefaults;
+    FArchive:=D.Farchive;
+    FCompiler:=D.Compiler;
+    FCopy:=D.FCopy;
+    FCPU:=D.FCPU;
+    FMode:=D.FMode;
+    FMkDir:=D.FMkDir;
+    FMove:=D.FMove;
+    FOptions:=D.FOptions;
+    FOS:=D.FOS;
+    FPrefix:=D.FPrefix;
+    FBaseInstallDir:=D.FBaseInstallDir;
+    FUnitInstallDir:=D.FUnitInstallDir;
+    FBinInstallDir:=D.FBinInstallDir;
+    FDocInstallDir:=D.FDocInstallDir;
+    FExamplesInstallDir:=D.FExamplesInstallDir;
+    FRemove:=D.FRemove;
+    FTarget:=D.FTarget;
+    FUnixPaths:=D.FUnixPaths;
+    end;
+end;
+
+procedure TDefaults.LocalInit(Const AFileName : String);
+
+Var
+  FN : String;
+
+begin
+  FN:=AFileName;
+  If (FN='') then
+    begin
+    // Environment variable.
+    FN:=GetEnvironmentVariable('FPMAKECFG');
+    If (FN<>'') then
+      If not FileExists(FN) then
+        FN:='';
+    // User config file fpmake.cfg
+    If (FN='') then
+      begin
+      FN:=GetAppConfigFile(False);
+      If Not FileExists(FN) then
+        FN:='';
+      end;
+    // Global config file fpmake.cfg
+    If (FN='') then
+      begin
+      FN:=GetAppConfigFile(True);
+      If Not FileExists(FN) then
+        FN:='';
+      end;
+    end;
+  If (FN<>'') and FileExists(FN) then
+    LoadFromFile(FN);
+end;
+
+
+procedure TDefaults.CompilerDefaults;
+begin
+  if Compiler<>'' then
+    Compiler:='fpc';
+  if CPU=cpuNone then
+    CPU:=StringToCPU({$I %FPCTARGETCPU%});
+  if OS=osNone then
+    OS:=StringToOS({$I %FPCTARGETOS%});
+  if FCompilerVersion='' then
+    FCompilerVersion:='2.0.4';
+  if (FBaseInstallDir='') and (FPrefix='') then
+    begin
+      // Use the same algorithm as the compiler, see options.pas
+{$ifdef Unix}
+      FBaseInstallDir:=FixPath(GetEnvironmentVariable('FPCDIR'));
+      if FBaseInstallDir='' then
+        begin
+          FBaseInstallDir:='/usr/local/lib/fpc/'+FCompilerVersion;
+          if not DirectoryExists(FBaseInstallDir) and
+             DirectoryExists('/usr/lib/fpc/'+FCompilerVersion) then
+            FBaseInstallDir:='/usr/lib/fpc/'+FCompilerVersion;
+        end;
+{$else unix}
+      FBaseInstallDir:=FixPath(GetEnvironmentVariable('FPCDIR'));
+      if FBaseInstallDir='' then
+        begin
+          FBaseInstallDir:=ExtractFilePath(FCompiler)+'..';
+          if not(DirectoryExists(FBaseInstallDir+'/units')) and
+             not(DirectoryExists(FBaseInstallDir+'/rtl')) then
+            FBaseInstallDir:=FBaseInstallDir+'..';
+        end;
+{$endif unix}
+    end;
+end;
+
+procedure TDefaults.LoadFromFile(Const AFileName: String);
+
+Var
+  F : TFileStream;
+
+begin
+  F:=TFileStream.Create(AFileName,fmOpenRead);
+  Try
+    LoadFromStream(F);
+  Finally
+    F.Free;
+  end;
+end;
+
+procedure TDefaults.SaveToFile(Const AFileName: String);
+
+Var
+  F : TFileStream;
+
+begin
+  F:=TFileStream.Create(AFileName,fmCreate);
+  Try
+    SaveToStream(F);
+  Finally
+    F.Free;
+  end;
+end;
+
+procedure TDefaults.SaveToStream(S : TStream);
+
+Var
+  L : TStringList;
+
+begin
+  L:=TStringList.Create;
+  try
+    With L do
+      begin
+      Values[KeyArchive]:=FArchive;
+      Values[KeyCompiler]:=FCompiler;
+      Values[KeyCopy]:=FCopy;
+      Values[KeyMkDir]:=FMkDir;
+      Values[KeyMove]:=FMove;
+      Values[KeyOptions]:=FOptions;
+      Values[KeyCPU]:=CPUToString(FCPU);
+      Values[KeyOS]:=OSToString(FOS);
+      Values[KeyMode]:=ModeToString(FMode);
+      Values[KeyPrefix]:=FPrefix;
+      Values[KeyBaseInstallDir]:=FBaseInstallDir;
+      Values[KeyUnitInstallDir]:=FUnitInstallDir;
+      Values[KeyBinInstallDir]:=FBinInstallDir;
+      Values[KeyDocInstallDir]:=FDocInstallDir;
+      Values[KeyExamplesInstallDir]:=FExamplesInstallDir;
+      Values[KeyRemove]:=FRemove;
+      Values[KeyTarget]:=FTarget;
+      end;
+    L.SaveToStream(S);
+  Finally
+    L.Free;
+  end;
+end;
+
+procedure TDefaults.LoadFromStream(S: TStream);
+
+Var
+  L : TStrings;
+  Line : String;
+  I,P,PC : Integer;
+
+
+begin
+  L:=TStringList.Create;
+  Try
+    L.LoadFromStream(S);
+    // Fix lines.
+    For I:=L.Count-1 downto 0 do
+      begin
+      Line:=L[I];
+      P:=Pos('=',Line);
+      PC:=Pos(';',Line);  // Comment line.
+      If (P=0) or ((PC<>0) and (PC<P)) then
+        L.Delete(I)
+      else
+        L[i]:=Trim(System.Copy(Line,1,P-1)+'='+Trim(System.Copy(Line,P+1,Length(Line)-P)));
+      end;
+    With L do
+      begin
+      FArchive:=Values[KeyArchive];
+      FCompiler:=Values[KeyCompiler];
+      FCopy:=Values[KeyCopy];
+      FMkDir:=Values[KeyMkDir];
+      FMove:=Values[KeyMove];
+      FRemove:=Values[KeyRemove];
+      FOptions:=Values[KeyOptions];
+      Line:=Values[KeyCPU];
+      If (Line<>'') then
+        FCPU:=StringToCPU(Line);
+      Line:=Values[KeyOS];
+      If (Line<>'') then
+        FOS:=StringToOS(Line);
+      Line:=Values[KeyMode];
+      If (Line<>'') then
+        FMode:=StringToMode(Line);
+      FTarget:=Values[KeyTarget];
+      FPrefix:=Values[KeyPrefix];
+      FBaseInstallDir:=Values[KeyBaseInstallDir];
+      FUnitInstallDir:=Values[KeyUnitInstallDir];
+      FBinInstallDir:=Values[KeyBinInstallDir];
+      FDocInstallDir:=Values[KeyDocInstallDir];
+      FExamplesInstallDir:=Values[KeyExamplesInstallDir];
+      end;
+  Finally
+    L.Free;
+  end;
+end;
+
+{ TPackage }
+
+function TPackage.GetHasStrings(AIndex: integer): Boolean;
+begin
+  Result:=False;
+  Case AIndex Of
+    0 : Result:=FUnitPath<>Nil;
+    1 : Result:=FObjectPath<>Nil;
+    2 : Result:=FIncludePath<>Nil;
+    3 : Result:=FDependencies<>Nil;
+    4 : Result:=FInstallFiles<>Nil;
+    5 : Result:=FCleanFiles<>Nil;
+    6 : Result:=FArchiveFiles<>Nil;
+  end;
+end;
+
+function TPackage.GetCommands: TCommands;
+begin
+  If Not Assigned(FCommands) then
+    FCommands:=TCommands.Create(TCommand);
+  Result:=FCommands;
+end;
+
+function TPackage.GetHasCommands: Boolean;
+begin
+  Result:=Assigned(FCommands);
+end;
+
+Procedure SplitVersion(AValue: String; Var Release,Major,Minor : Word; Var Suffix : String);
+
+  Function NextDigit(sep : Char; var V : string) : integer;
+
+  Var
+    P : Integer;
+
+  begin
+    P:=Pos(Sep,V);
+    If (P=0) then
+      P:=Length(V)+1;
+    Result:=StrToIntDef(Copy(V,1,P-1),-1);
+    If Result<>-1 then
+      Delete(V,1,P)
+    else
+      Result:=0;
+  end;
+
+Var
+  P : Integer;
+  V : String;
+
+begin
+  Release:=0;
+  Major:=0;
+  Minor:=0;
+  Suffix:='';
+  V:=AValue;
+  Release:=NextDigit('.',V);
+  Major:=NextDigit('.',V);
+  Minor:=NextDigit('-',V);
+  P:=Pos('-',V);
+  If (P<>0) then
+    Delete(V,1,P);
+  Suffix:=V;
+end;
+
+Function QuoteXML(S : String) : string;
+
+  Procedure W(Var J : Integer; Var R : String; T : String);
+
+  Var
+    I: integer;
+
+  begin
+    If J+Length(T)>Length(R) then
+      SetLength(R,J+Length(T));
+    For I:=1 to Length(t) do
+      begin
+      R[J]:=T[i];
+      If I<Length(T) then
+        Inc(J);
+      end;
+  end;
+
+const
+  QuotStr = '&quot;';
+  AmpStr = '&amp;';
+  ltStr = '&lt;';
+  gtStr = '&gt;';
+
+Var
+  I,J : Integer;
+
+begin
+  SetLength(Result,Length(S));
+  J:=0;
+  For I:=1 to Length(S) do
+    begin
+    Inc(J);
+    case S[i] of
+      '"': W(j,Result,QuotStr);
+      '&': W(J,Result,AmpStr);
+      '<': W(J,Result,ltStr);
+      // Escape whitespace using CharRefs to be consistent with W3 spec X 3.3.3
+       #9: w(J,Result,'&#x9;');
+{      #10: wrtStr('&#xA;');
+       #13: wrtStr('&#xD;');}
+    else
+      Result[J]:=S[i];
+    end;
+    If (J=Length(Result)) and (I<Length(S)) then
+      SetLength(Result,J+Length(S)-I);
+    end;
+  If J<>Length(Result) then
+    SetLength(Result,J);
+end;
+
+
+
+Procedure TPackage.GetManifest(Manifest : TStrings);
+
+
+Var
+  S : String;
+  Release,Minor,Major : Word;
+  i : Integer;
+begin
+  With Manifest do
+    begin
+    Add(Format('<package name="%s">',[QuoteXml(Name)]));
+    SplitVersion(Version,Release,Minor,Major,S);
+    Add(Format('<version release="%d" major="%d" minor="%d" suffix="%s"/>',[Release,Minor,Major,QuoteXMl(S)]));
+    Add(Format('<filename>%s</filename>',[QuoteXml(FileName)]));
+    Add(Format('<author>%s</author>',[QuoteXml(Author)]));
+    if ExternalURL<>'' then
+      Add(Format('<externalurl>%s</externalurl>',[QuoteXml(ExternalURL)]));
+    Add(Format('<email>%s</email>',[QuoteXMl(Email)]));
+    S:=Description;
+    If (S<>'') then
+      Add(Format('<description>%s</description>',[QuoteXML(S)]));
+    if HasDependencies then
+      begin
+        If (Dependencies.Count>0) then
+          begin
+            Add('<dependencies>');
+            for I:=0 to Dependencies.Count-1 do
+              Add(Format('<dependency><package packagename="%s"/></dependency>',[QuoteXML(Dependencies[i])]));
+            Add('</dependencies>');
+          end;
+      end;
+    Add('</package>');
+    end;
+end;
+
+function TPackage.GetStrings(AIndex: integer): TStrings;
+
+  Function EnsureStrings(Var S : TStrings) : TStrings;
+
+  begin
+    If (S=Nil) then
+      S:=TStringList.Create;
+    Result:=S;
+  end;
+
+begin
+  Result:=Nil;
+  Case AIndex Of
+    0 : Result:=EnsureStrings(FUnitPath);
+    1 : Result:=EnsureStrings(FObjectPath);
+    2 : Result:=EnsureStrings(FIncludePath);
+    3 : begin
+        Result:=EnsureStrings(FDependencies);
+        With TStringList(Result) do
+          if (Count=0) then
+            begin
+            Sorted:=True;
+            Duplicates:=dupError;
+            end;
+        end;
+    4 : Result:=EnsureStrings(FInstallFiles);
+    5 : Result:=EnsureStrings(FCleanFiles);
+    6 : Result:=EnsureStrings(FArchiveFiles);
+  end;
+end;
+
+procedure TPackage.SetCommands(const AValue: TCommands);
+begin
+  Commands.Assign(AValue);
+end;
+
+procedure TPackage.SetStrings(AIndex: integer; const AValue: TStrings);
+begin
+  GetStrings(AIndex).Assign(AValue);
+end;
+
+constructor TPackage.Create(ACollection: TCollection);
+
+Var
+  L : TStringList;
+
+begin
+  inherited Create(ACollection);
+  FTargets:=TTargets.Create(TTarget);
+  FSources:=TSources.Create(TSource);
+  L:=TStringList.Create;
+  FDependencies:=L;
+  FInstallFiles:=TStringList.Create;
+  FCleanFiles:=TStringList.Create;
+  FArchiveFiles:=TStringList.Create;
+end;
+
+destructor TPackage.destroy;
+begin
+  FreeAndNil(FDependencies);
+  FreeAndNil(FInstallFiles);
+  FreeAndNil(FCleanFiles);
+  FreeAndNil(FArchiveFiles);
+  FreeAndNil(FIncludePath);
+  FreeAndNil(FObjectPath);
+  FreeAndNil(FUnitPath);
+  FreeAndNil(FSources);
+  FreeAndNil(FTargets);
+  inherited destroy;
+end;
+
+function TPackage.AddTarget(AName: String): TTarget;
+begin
+  Result:=Targets.Add as TTarget;
+  Result.Name:=AName;
+end;
+
+procedure TPackage.AddDependency(AName: String);
+begin
+  If FDependencies.IndexOf(AName)=-1 then
+    FDependencies.Add(AName);
+end;
+
+procedure TPackage.AddInstallFile(AFileName: String);
+begin
+  FInstallFiles.add(AFileName);
+end;
+
+procedure TPackage.GetCleanFiles(List: TStrings; Const APrefix : String; AOS : TOS);
+
+Var
+  I : Integer;
+
+begin
+  AddStrings(List,CleanFiles,APrefix);
+  For I:=0 to FTargets.Count-1 do
+    FTargets.TargetItems[I].GetCleanFiles(List,APrefix,AOS);
+end;
+
+procedure TPackage.GetSourceFiles(List: TStrings);
+
+Var
+  I : Integer;
+
+begin
+  // AddStrings(List,SourceFiles,APrefix);
+  For I:=0 to FSources.Count-1 do
+    FSources.SourceItems[I].GetSourceFiles(List);
+end;
+
+procedure TPackage.GetInstallFiles(List: TStrings;Types : TTargetTypes;Const APrefix : String; AOS : TOS);
+
+Var
+  I : Integer;
+  T : TTarget;
+
+begin
+  AddStrings(List,InstallFiles,APrefix);
+  For I:=0 to FTargets.Count-1 do
+    begin
+    T:=FTargets.TargetItems[I];
+    if (T.TargetType in Types)  then
+      T.GetInstallFiles(List,APrefix,AOS);
+    end;
+end;
+
+
+procedure TPackage.GetArchiveFiles(List: TStrings;Const APrefix : String; AOS : TOS);
+
+Var
+  I : Integer;
+
+begin
+  If (OS=[]) or (AOS in OS) then
+    begin
+    AddStrings(List,ArchiveFiles,APrefix);
+    For I:=0 to FTargets.Count-1 do
+      FTargets.TargetItems[I].GetArchiveFiles(List,APrefix,AOS);
+    end;
+end;
+
+Function TPackage.GetDescription : string;
+
+Var
+  FN : String;
+  L : TStringList;
+
+begin
+  If (FDescription<>'') then
+    Result:=FDescription
+  else
+    If (FDescriptionFile<>'') then
+      begin
+      // Always relative to binary name.
+      FN:=ExtractFilePath(ParamStr(0));
+      FN:=FN+FDescriptionFile;
+      If FileExists(FN) then
+        begin
+        L:=TStringList.Create;
+        Try
+          L.LoadFromFile(FN);
+          Result:=L.Text;
+        Finally
+          L.Free;
+        end;
+        end;
+      end;
+end;
+
+
+Function TPackage.GetFileName : string;
+begin
+  If (FFileName<>'') then
+    Result:=FFileName
+  else
+    Result:=Name+'-'+Version+'.zip';
+end;
+
+
+{ TPackages }
+
+function TPackages.GetPackage(AName : String): TPackage;
+begin
+  Result:=TPackage(ItemByName(AName))
+end;
+
+function TPackages.GetPackageItem(AIndex : Integer): TPackage;
+begin
+  Result:=TPackage(Items[AIndex]);
+end;
+
+procedure TPackages.SetPackageItem(AIndex : Integer; const AValue: TPackage);
+begin
+  Items[AIndex]:=AValue;
+end;
+
+function TPackages.AddPackage(const AName: String): TPackage;
+begin
+  Result:=Add as TPackage;
+  Result.Name:=AName;
+end;
+
+
+{ TInstaller }
+
+function TInstaller.GetStrings(AIndex : Integer): TStrings;
+begin
+  CheckDefaultPackage;
+  Case AIndex of
+    0:  Result:=DefaultPackage.Dependencies;
+    1:  Result:=DefaultPackage.InstallFiles;
+    2:  Result:=DefaultPackage.CleanFiles;
+    3:  Result:=DefaultPackage.ArchiveFiles;
+  end;
+end;
+
+Function TInstaller.GetPackageString(Index : Integer) : String;
+
+Var
+  P : TPackage;
+
+
+begin
+  CheckDefaultPackage;
+  P:=DefaultPackage;
+  Case Index of
+    0 : Result:=P.Author;
+    1 : Result:=P.Directory;
+    2 : Result:=P.License;
+    3 : Result:=P.Options;
+    4 : Result:=P.ExternalURL;
+    5 : Result:=P.Email;
+    6 : Result:=P.Description;
+    7 : Result:=P.DescriptionFile;
+    8 : Result:=P.Version;
+    9 : Result:=P.FileName;
+  end;
+end;
+
+
+Procedure TInstaller.SetPackageString(Index : Integer; AValue : String);
+
+Var
+  P : TPackage;
+
+begin
+  CheckDefaultPackage;
+  P:=DefaultPackage;
+  Case Index of
+    0 : P.Author:=AValue;
+    1 : P.Directory:=AValue;
+    2 : P.License:=AValue;
+    3 : P.Options:=AValue;
+    4 : P.ExternalURL:=AValue;
+    5 : P.Email:=AValue;
+    6 : P.Description:=AValue;
+    7 : P.DescriptionFile:=AValue;
+    8 : P.Version:=AValue;
+    9 : P.FileName:=AValue;
+  end;
+end;
+
+
+function TInstaller.GetOSes: TOSes;
+begin
+  CheckDefaultPackage;
+  Result:=DefaultPackage.OS;
+end;
+
+function TInstaller.GetTargets: TTargets;
+begin
+  CheckDefaultPackage;
+  Result:=DefaultPackage.Targets;
+end;
+
+function TInstaller.GetSources: TSources;
+begin
+  CheckDefaultPackage;
+  Result:=DefaultPackage.Sources;
+end;
+
+procedure TInstaller.SetDefaultPackage(const AValue: TPackage);
+begin
+  if FDefaultPackage=AValue then exit;
+  FDefaultPackage:=AValue;
+end;
+
+procedure TInstaller.SetDefaults(const AValue: TDefaults);
+begin
+  FDefaults.Assign(AValue);
+end;
+
+procedure TInstaller.SetStrings(AIndex : Integer; const AValue: TStrings);
+
+Var
+  Res : TStrings;
+
+begin
+  CheckDefaultPackage;
+  Case AIndex of
+    0:  Res:=DefaultPackage.Dependencies;
+    1:  Res:=DefaultPackage.InstallFiles;
+    2:  Res:=DefaultPackage.CleanFiles;
+    3:  Res:=DefaultPackage.ArchiveFiles;
+  end;
+  Res.Assign(Avalue);
+end;
+
+procedure TInstaller.SetOses(const AValue: TOSes);
+begin
+  CheckDefaultPackage;
+  DefaultPackage.OS:=AValue;
+end;
+
+procedure TInstaller.Log(Level: TVerboseLevel; const Msg: String);
+begin
+  If Level in FLogLevels then
+    Writeln(StdErr,Msg);
+end;
+
+procedure TInstaller.CreatePackages;
+begin
+  FPAckages:=TPackages.Create(TPackage);
+end;
+
+procedure TInstaller.CreateBuildEngine;
+begin
+  FBuildEngine:=TBuildEngine.Create(Self);
+  FBuildEngine.Defaults:=Defaults;
+  FBuildEngine.ListMode:=FListMode;
+  FBuildEngine.OnLog:[email protected];
+end;
+
+procedure TInstaller.CheckDefaultPackage;
+begin
+  If (FDefaultPackage=Nil) then
+    Raise EInstallerError.Create(SErrNoPackage);
+end;
+
+procedure TInstaller.Error(Msg: String);
+begin
+  Raise EInstallerError.Create(Msg);
+end;
+
+procedure TInstaller.Error(Fmt: String; Args: array of const);
+begin
+  Raise EInstallerError.CreateFmt(Fmt,Args);
+end;
+
+Function TInstaller.StartPackage(const AName: String) : TPackage;
+begin
+  FDefaultPackage:=FPackages.AddPackage(AName);
+  Result:=FDefaultPackage;
+end;
+
+procedure TInstaller.EndPackage;
+begin
+  FDefaultPackage:=Nil;
+end;
+
+procedure TInstaller.AnalyzeOptions;
+
+  Function CheckOption(Index : Integer;Short,Long : String): Boolean;
+
+  var
+    O : String;
+
+  begin
+    O:=Paramstr(Index);
+    Result:=(O='-'+short) or (O='--'+long) or (copy(O,1,Length(Long)+3)=('--'+long+'='));
+  end;
+
+  Function CheckCommand(Index : Integer;Short,Long : String): Boolean;
+
+  var
+    O : String;
+
+  begin
+    O:=Paramstr(Index);
+    Result:=(O='-'+short) or (O=long);
+  end;
+
+  Function OptionArg(Var Index : Integer) : String;
+
+  Var
+    P : Integer;
+
+  begin
+    if (Length(ParamStr(Index))>1) and (Paramstr(Index)[2]<>'-') then
+      begin
+      If Index<ParamCount then
+        begin
+        Inc(Index);
+        Result:=Paramstr(Index);
+        end
+      else
+        Error(SErrNeedArgument,[Index,ParamStr(Index)]);
+      end
+    else If length(ParamStr(Index))>2 then
+      begin
+      P:=Pos('=',Paramstr(Index));
+      If (P=0) then
+        Error(SErrNeedArgument,[Index,ParamStr(Index)])
+      else
+        begin
+        Result:=Paramstr(Index);
+        Delete(Result,1,P);
+        end;
+      end;
+  end;
+
+Var
+  I : Integer;
+  Nodefaults : Boolean;
+  DefaultsFileName : string;
+
+begin
+  I:=0;
+  NoDefaults:=False;
+  FListMode:=False;
+  While (I<ParamCount) do
+    begin
+    Inc(I);
+    if CheckCommand(I,'m','compile') then
+      FRunMode:=rmCompile
+    else if CheckCommand(I,'b','build') then
+      FRunMode:=rmBuild
+    else if CheckCommand(I,'i','install') then
+      FRunMode:=rmInstall
+    else if CheckCommand(I,'c','clean') then
+      FRunMode:=rmClean
+    else if CheckCommand(I,'a','archive') then
+      FRunMode:=rmarchive
+    else if CheckCommand(I,'M','manifest') then
+      FRunMode:=rmManifest
+    else if CheckCommand(I,'M','listsources') then
+      FRunMode:=rmListSources
+    else if CheckOption(I,'h','help') then
+      Usage('',[])
+    else if Checkoption(I,'C','CPU') then
+      Defaults.CPU:=StringToCPU(OptionArg(I))
+    else if Checkoption(I,'O','OS') then
+      Defaults.OS:=StringToOS(OptionArg(I))
+    else if Checkoption(I,'t','target') then
+      Defaults.Target:=OptionArg(I)
+    else if CheckOption(I,'l','list-commands') then
+      FListMode:=True
+    else if Checkoption(I,'P','prefix') then
+      Defaults.Prefix:=OptionArg(I)
+    else if Checkoption(I,'n','nodefaults') then
+      NoDefaults:=true
+    else if CheckOption(I,'B','baseinstalldir') then
+      Defaults.BaseInstallDir:=OptionArg(I)
+    else if CheckOption(I,'r','compiler') then
+      Defaults.Compiler:=OptionArg(I)
+    else if CheckOption(I,'f','config') then
+      DefaultsFileName:=OptionArg(I)
+    else if CheckOption(I,'v','verbose') then
+      begin
+      Try
+        FLogLevels:=TVerboseLevels(StringToSet(PtypeInfo(TypeInfo(TVerboseLevels)),OptionArg(I)));
+      except
+        FLogLevels:=AllMessages;
+      end;
+      end
+    else
+      begin
+      Usage(SErrInValidArgument,[I,ParamStr(I)]);
+      end;
+    end;
+  If Not NoDefaults then
+    Defaults.LocalInit(DefaultsFileName);
+  Defaults.CompilerDefaults;
+{$ifdef debug}
+  FLogLevels:=AllMessages;
+{$endif}
+end;
+
+
+
+procedure TInstaller.Usage(FMT: String; Args: array of const);
+
+  Procedure WriteCmd(LC : String; Msg : String);
+
+  begin
+    Writeln(stderr,Format(' %-12s %s',[LC,MSG]));
+  end;
+
+  Procedure WriteOption(C: Char; LC : String; Msg : String);
+
+  begin
+    Writeln(stderr,Format(' -%s --%-16s %s',[C,LC,MSG]));
+  end;
+
+  Procedure WriteArgOption(C: Char; LC : String; Msg : String);
+
+  begin
+    Writeln(stderr,Format(' -%s --%-20s %s',[C,LC+'='+SValue,MSG]));
+  end;
+
+begin
+  If (FMT<>'') then
+    Writeln(stderr,Format(Fmt,Args));
+  Writeln(stderr,Format(SHelpUsage,[Paramstr(0)]));
+  Writeln(stderr,SHelpCommand);
+  WriteCmd('compile',SHelpCompile);
+  WriteCmd('build',SHelpBuild);
+  WriteCmd('install',SHelpInstall);
+  WriteCmd('clean',SHelpClean);
+  WriteCmd('archive',SHelpArchive);
+  WriteCmd('manifest',SHelpManifest);
+  Writeln(stderr,SHelpCmdOptions);
+  WriteOption('h','help',SHelpHelp);
+  WriteOption('l','list-commands',SHelpList);
+  WriteOption('n','nodefaults',SHelpNoDefaults);
+  WriteOption('v','verbose',SHelpVerbose);
+  WriteArgOption('C','CPU',SHelpCPU);
+  WriteArgOption('O','OS',SHelpOS);
+  WriteArgOption('t','target',SHelpTarget);
+  WriteArgOption('P','prefix',SHelpPrefix);
+  WriteArgOption('B','baseinstalldir',SHelpBaseInstalldir);
+  WriteArgOption('r','compiler',SHelpCompiler);
+  WriteArgOption('f','config',SHelpConfig);
+  Writeln(stderr,'');
+  If (FMT<>'') then
+    halt(1)
+  else
+    halt(0);
+end;
+
+procedure TInstaller.Compile(Force: Boolean);
+begin
+  FBuildEngine.ForceCompile:=Force;
+  FBuildEngine.Compile(FPackages);
+end;
+
+procedure TInstaller.Clean;
+begin
+  BuildEngine.Clean(FPackages);
+end;
+
+procedure TInstaller.Install;
+begin
+  BuildEngine.Install(FPackages);
+end;
+
+procedure TInstaller.Archive;
+begin
+  FBuildEngine.Archive(FPackages);
+end;
+
+procedure TInstaller.Manifest;
+
+Var
+  L : TStrings;
+begin
+  L:=TStringList.Create;
+  Try
+    Log(vlCommand,'Generating manifest.xml');
+    L.Add('<?xml version="1.0"?>');
+    BuildEngine.GetManifest(FPackages,L);
+    L.SaveToFile('manifest.xml');
+  Finally
+    L.Free;
+  end;
+end;
+
+procedure TInstaller.GetSourceFiles;
+
+Var
+  L : TStrings;
+begin
+  L:=TStringList.Create;
+  Try
+    Log(vlCommand,'Generating sources.xml');
+    L.Add('<?xml version="1.0"?>');
+    BuildEngine.GetSourceFiles(FPackages,L);
+    L.SaveToFile('sources.xml');
+  Finally
+    L.Free;
+  end;
+end;
+
+
+constructor TInstaller.Create(AOWner: TComponent);
+begin
+  inherited Create(AOWner);
+  FDefaults:=TDefaults.Create;
+  AnalyzeOptions;
+  CreatePackages;
+end;
+
+destructor TInstaller.destroy;
+begin
+  FreeAndNil(FDefaults);
+  inherited destroy;
+end;
+
+procedure TInstaller.CheckPackages;
+
+begin
+  If (FPackages.Count=0) then
+    Error(SErrNoPackagesDefined);
+  // Check for other obvious errors ?
+end;
+
+Function TInstaller.Run : Boolean;
+
+begin
+  Result:=True;
+  try
+    CheckPackages;
+    CreateBuildEngine;
+    Case RunMode of
+      rmCompile : Compile(False);
+      rmBuild   : Compile(True);
+      rmInstall : Install;
+      rmArchive : Archive;
+      rmClean    : Clean;
+      rmManifest : Manifest;
+      rmListSources : GetSourceFiles;
+    end;
+  except
+    On E : Exception do
+      begin
+      Writeln(StdErr,SErrInstaller);
+      Writeln(StdErr,E.Message);
+      Result:=False;
+      end;
+  end;
+end;
+
+function TInstaller.AddTarget(AName: String): TTarget;
+begin
+  CheckDefaultPackage;
+  Result:=DefaultPackage.AddTarget(AName);
+end;
+
+procedure TInstaller.AddDependency(AName: String);
+begin
+  CheckDefaultPackage;
+  DefaultPackage.AddDependency(AName);
+end;
+
+{ TBuildEngine }
+
+procedure TBuildEngine.SetDefaults(const AValue: TDefaults);
+begin
+  FDefaults.Assign(AValue);
+end;
+
+procedure TBuildEngine.SetTargetDir(const AValue: String);
+begin
+  if FTargetDir=AValue then exit;
+  FTargetDir:=AValue;
+end;
+
+procedure TBuildEngine.Error(Msg: String);
+begin
+  Raise EInstallerError.Create(Msg);
+end;
+
+procedure TBuildEngine.Error(Fmt: String; Args: array of const);
+begin
+  Raise EInstallerError.CreateFmt(Fmt,Args);
+end;
+
+constructor TBuildEngine.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FDefaults:=TDefaults.Create;
+  // Maybe this should be the current directory ?
+  // Or have it as a command-line option.
+  // Would allow to put all 'installers' in one dir and call them
+  // With --start-dir=/path/to/sources.
+  FStartDir:=includeTrailingPathDelimiter(GetCurrentDir);
+end;
+
+procedure TBuildEngine.ExecuteCommand(Cmd: String; Args : String; IgnoreError : Boolean = False);
+
+Var
+  E : Integer;
+
+begin
+  Log(vlCommand,SLogExecutingCommand,[Cmd,Args]);
+  // We should check cmd for spaces, and move all after first space to args.
+  E:=ExecuteProcess(cmd,args);
+  If (E<>0) and (not IgnoreError) then
+    Error(SErrExternalCommandFailed,[Cmd,E]);
+end;
+
+procedure TBuildEngine.SysCopyFile(Const Src,Dest : String);
+
+Var
+  D,S : String;
+  Fin,FOut : TFileStream;
+  Count : Int64;
+  A : Integer;
+
+begin
+  Log(vlCommand,SLogCopyingFile,[Src,Dest]);
+  FIn:=TFileStream.Create(Src,fmopenRead);
+  Try
+    D:=IncludeTrailingPathDelimiter(Dest);
+    If DirectoryExists(D) then
+      S:=D+ExtractFileName(Src)
+    else
+      S:=Dest;
+    FOut:=TFileStream.Create(S,fmCreate);
+    Try
+      Count:=Fout.CopyFrom(FIn,0);
+      If (Count<>Fin.Size) then
+        Error(SErrCopyingFile,[Src,S]);
+    Finally
+      FreeAndNil(Fout);
+    end;
+    A:=FileGetDate(FIn.Handle);
+    If (A=-1) then
+      log(vlWarning,SWarnFailedToGetTime,[Src])
+    else
+      if FileSetDate(S,A)<>0 then
+        Log(vlWarning,SWarnFailedToSetTime,[S]);
+  finally
+    FreeAndNil(Fin);
+  end;
+end;
+
+procedure TBuildEngine.SysMoveFile(Const Src,Dest : String);
+
+Var
+  S : String;
+
+begin
+    If DirectoryExists(IncludeTrailingPathDelimiter(Dest)) then
+      S:=IncludeTrailingPathDelimiter(Dest)+ExtractFileName(Src)
+    else
+      S:=Dest;
+  If Not RenameFile(Src,S) then
+    begin
+    Try
+      SysCopyFile(Src,S);
+      SysDeleteFile(Src);
+    Except
+      On E : Exception Do
+        Error(SErrMovingFile,[Src,S]);
+    end;
+    end;
+end;
+
+procedure TBuildEngine.SysDeleteFile(Const AFileName : String);
+
+begin
+  if not FileExists(AFileName) then
+    Log(vlWarning,SWarnFileDoesNotExist,[AFileName])
+  else If Not DeleteFile(AFileName) then
+    Error(SErrDeletingFile,[AFileName]);
+end;
+
+
+procedure TBuildEngine.SysArchiveFiles(List: TStrings;Const AFileName: String);
+begin
+  If Not (Assigned(OnArchivefiles) or Assigned(ArchiveFilesProc)) then
+    Raise EInstallerError.Create(SErrNoArchiveSupport);
+  If Assigned(ArchiveFilesProc) then
+    ArchiveFilesProc(AFileName,List)
+  else
+    OnArchiveFiles(AFileName,List);
+end;
+
+procedure TBuildEngine.Log(Level: TVerboseLevel; const Msg: String);
+begin
+  If Assigned(FOnLog) then
+    FOnLog(Level,Msg);
+end;
+
+procedure TBuildEngine.Log(Level: TVerboseLevel; const Fmt: String;
+  Args: array of const);
+begin
+  Log(Level,Format(Fmt,Args));
+end;
+
+procedure TBuildEngine.EnterDir(ADir: String);
+
+Var
+  D : String;
+
+begin
+  D:=FStartDir;
+  D:=D+ADir;
+  Log(vlInfo,SLogEnterDir,[D]);
+  If Not SetCurrentDir(D) then
+    Error(SErrChangeDirFailed,[D]);
+end;
+
+
+procedure TBuildEngine.CmdCopyFiles(List: TStrings; Const DestDir: String);
+
+Var
+  Args : String;
+  I : Integer;
+
+begin
+  CmdCreateDir(DestDir);
+  If (Defaults.Copy<>'') then
+    begin
+    Args:=FileListToString(List,'');
+    Args:=Args+' '+DestDir;
+    ExecuteCommand(Defaults.Copy,Args);
+    end
+  else
+    For I:=0 to List.Count-1 do
+      SysCopyFile(List[i],DestDir);
+end;
+
+procedure TBuildEngine.CmdCreateDir(DestDir: String);
+
+begin
+  If (Defaults.MkDir<>'') then
+    ExecuteCommand(Defaults.MkDir,DestDir)
+  else
+    If not ForceDirectories(DestDir) then
+      Error(SErrCreatingDirectory,[DestDir]);
+end;
+
+procedure TBuildEngine.CmdMoveFiles(List: TStrings; Const DestDir: String);
+
+Var
+  Args : String;
+  I : Integer;
+
+begin
+  CmdCreateDir(DestDir);
+  If (Defaults.Move<>'') then
+    begin
+    Args:=FileListToString(List,'');
+    Args:=Args+' '+DestDir;
+    ExecuteCommand(Defaults.Move,Args);
+    end
+  else
+    For I:=0 to List.Count-1 do
+      SysMoveFile(List[i],DestDir);
+end;
+
+procedure TBuildEngine.CmdDeleteFiles(List: TStrings);
+
+Var
+  Args : String;
+  I : Integer;
+
+begin
+  If (Defaults.Remove<>'') then
+    begin
+    Args:=FileListToString(List,'');
+    ExecuteCommand(Defaults.Remove,Args);
+    end
+  else
+    For I:=0 to List.Count-1 do
+      SysDeleteFile(List[i]);
+end;
+
+procedure TBuildEngine.CmdArchiveFiles(List: TStrings; Const ArchiveFile: String);
+
+Var
+  S,C,O : String;
+
+begin
+  If (Defaults.Archive='') then
+    SysArchiveFiles(List,ArchiveFile)
+  else
+    begin
+    S:=FileListToString(List,'');
+    SplitCommand(Defaults.Archive,C,O);
+    If (O='') then
+      O:=ArchiveFile+' '+S
+    else
+      O:=Substitute(O,['ARCHIVE',ArchiveFile,'FILESORDIRS']);
+    ExecuteCommand(C,O);
+    end;
+end;
+
+Function TBuildEngine.FileNewer(Src,Dest : String) : Boolean;
+
+Var
+  DS,DD : Longint;
+  D1,D2 : TDateTime;
+
+begin
+  DS:=FileAge(Src);
+  DD:=FileAge(Dest);
+  D1:=FileDateToDateTime(DS);
+  D2:=FileDateToDateTime(DD);
+  Log(vlDebug,SLogCompilingFileTimes,[Src,DateTimeToStr(D1),Dest,DateTimeToStr(D2)]);
+  Result:=D1>=D2;
+  If Result then
+    Log(vlCompare,SLogSourceNewerDest,[Src,DateTimeToStr(D1),Dest,DateTimeToStr(D2)]);
+end;
+
+procedure TBuildEngine.ExecuteCommands(Commands: TCommands; At: TCommandAt);
+
+Var
+  C : TCommand;
+  I : Integer;
+  Cmd,O : String;
+  E : Boolean;
+
+begin
+  For I:=0 to Commands.Count-1 do
+    begin
+    C:=Commands.CommandItems[i];
+    if (C.At=At) then
+      begin
+      E:=True;
+      If (C.SourceFile<>'') and (C.DestFile<>'')  then
+        E:=FileNewer(C.SourceFile,IncludeTrailingPathDelimiter(Dictionary.GetValue('OUTPUTDIR'))+C.DestFile);
+      If E then
+        begin
+        If Assigned(C.BeforeCommand) then
+          C.BeforeCommand(C);
+        O:=Substitute(C.Options,['SOURCE',C.SourceFile,'DEST',C.DestFile]);
+        Cmd:=C.Command;
+        If (ExtractFilePath(Cmd)='') then
+          Cmd:=FileSearch(Cmd,GetEnvironmentvariable('PATH'));
+        ExecuteCommand(Cmd,O,C.IgnoreResult);
+        If Assigned(C.AfterCommand) then
+          C.AfterCommand(C);
+        end;
+      end;
+    end;
+end;
+
+// Relative to startdir.
+Function TBuildEngine.GetTargetDir(APackage : TPackage; ATarget : TTarget; AbsolutePath : Boolean = False) : String;
+
+begin
+  If AbsolutePath then
+    Result:=IncludeTrailingPathDelimiter(FStartDir)
+  else
+    Result:='';
+  If (APackage.Directory<>'') then
+    Result:=Result+IncludeTrailingPathDelimiter(APackage.Directory);
+  If (ATarget.Directory<>'') then
+    Result:=IncludeTrailingPathDelimiter(Result+ATarget.Directory);
+
+end;
+
+Function TBuildEngine.TargetOK(Target : TTarget) : Boolean;
+
+begin
+  Result:=(Target.TargetType in [ttUnit,ttProgram])
+          and
+          ((Target.CPU=[]) or (Defaults.CPU in Target.CPU))
+          and
+          ((Target.OS=[]) or (Defaults.OS in Target.OS));
+  If not Result then
+    begin
+    log(vldebug,'Target is not a unit or program');
+    If Not ((Target.CPU=[]) or (Defaults.CPU in Target.CPU)) then
+      Log(vldebug,'Target has wrong CPU: '+CPUsToString(Target.CPU));
+    if not ((Target.OS=[]) or (Defaults.OS in Target.OS)) then
+      Log(vldebug,'Target has wrong OS: '+OSesToString(Target.OS));
+    end;
+end;
+
+Function TBuildEngine.NeedsCompile(Target: TTarget): Boolean;
+
+Var
+  I : Integer;
+  T : TTarget;
+  OD,SD,SFN,OFN : String;
+
+begin
+  Result:=False;
+  OD:=FCurrentOutputDir;
+  If (OD<>'') then
+    OD:=IncludeTrailingPathDelimiter(OD);
+  OFN:=OD+Target.GetOutPutFileName(Defaults.OS);
+  SD:=Target.Directory;
+  If (SD<>'') then
+      SD:=IncludeTrailingPathDelimiter(SD);
+  Result:=Not FileExists(OFN);
+  // Check dependencies
+  If not Result then
+    If Target.HasDependencies then
+      begin
+      ResolveDependencies(Target.Dependencies,Target.Collection as TTargets);
+      I:=0;
+      While (Not Result) and (I<Target.Dependencies.Count) do
+        begin
+        T:=TTarget(Target.Dependencies.Objects[i]);
+        If (T<>Nil) then
+          Result:=NeedsCompile(T)
+        else // if it is a filename, check dates.
+          if FileExists(Target.Dependencies[i]) then
+            Result:=FileNewer(Target.Dependencies[i],OFN)
+          else if FileExists(SD+Target.Dependencies[i]) then
+            Result:=FileNewer(SD+Target.Dependencies[i],OFN);
+        Inc(I)
+        end;
+      end;
+  If not Result then
+    begin
+    SFN:=SD+Target.SourceFileName;
+    If (ExtractFileExt(SFN)='') then
+      if FileExists(SFN+'.pp') then
+        SFN:=SFN+'.pp'
+      else
+        SFN:=SFN+'.pas';
+    // Writeln('Checking : ',OFN,' against ',SFN);
+    Result:=FileNewer(SFN,OFN);
+    // here we should check file timestamps.
+    end;
+end;
+
+
+
+Function TBuildEngine.GetCompilerCommand(APackage : TPackage; Target : TTarget) : String;
+
+
+Var
+  PD,TD,OD,RD : String;
+
+begin
+  PD:=IncludeTrailingPathDelimiter(GetPackageDir(APackage,True));
+  OD:=IncludeTrailingPathDelimiter(GetOutputDir(APackage,True));
+  RD:=ExtractRelativePath(PD,OD);
+  If Target.TargetType in ProgramTargets then
+    Result:='-FE.' // Make this relative to target directory.
+  else
+    Result:='-FU'+RD;
+  If Target.Mode<>cmFPC then
+    Result:=Result+' -M'+ModeToString(Target.Mode)
+  else If Defaults.Mode<>cmFPC then
+    Result:=Result+' -M'+ModeToString(Defaults.Mode);
+  If (Defaults.Options<>'') then
+    Result:=Result+' '+Defaults.Options;
+  If (APackage.Options<>'') then
+    Result:=Result+' '+APackage.Options;
+  If APackage.HasUnitPath then
+    AddStrings(Result,APackage.UnitPath,'-Fu');
+  If APackage.HasIncludePath then
+    AddStrings(Result,APackage.IncludePath,'-Fi');
+  If APackage.HasObjectPath then
+    AddStrings(Result,APackage.ObjectPath,'-Fo');
+  If Target.HasUnitPath then
+    AddStrings(Result,Target.UnitPath,'-Fu');
+  If Target.HasIncludePath then
+    AddStrings(Result,Target.IncludePath,'-Fi');
+  If Target.HasObjectPath then
+    AddStrings(Result,Target.ObjectPath,'-Fo');
+  If (Target.Options<>'') then
+    Result:=Result+' '+Target.Options;
+  TD:=Target.Directory;
+  if (TD<>'') then
+    TD:=IncludeTrailingPathDelimiter(TD);
+  Result:=Result+' '+TD+Target.SourceFileName;
+end;
+
+Function TBuildEngine.GetCompiler : String;
+
+Var
+  S : String;
+
+begin
+  // Cache in FCompiler for speed.
+  If (FCompiler='') then
+    begin
+    FCompiler:=Defaults.Compiler;
+    If (ExtractFilePath(FCompiler)='') then
+      begin
+      S:=FileSearch(FCompiler,GetEnvironmentVariable('PATH'));
+      If (S<>'') then
+         FCompiler:=S;
+      end;
+    end;
+  Result:=FCompiler;
+end;
+
+procedure TBuildEngine.Compile(Target: TTarget);
+
+Var
+  S : String;
+
+begin
+  if Target.State in [tsNeutral,tsCompiling] then
+    begin
+    Log(vlInfo,SLogCompilingTarget,[Target.Name]);
+    If Target.HasCommands then
+      ExecuteCommands(Target.Commands,caBeforeCompile);
+    If Assigned(Target.BeforeCompile) then
+      Target.BeforeCompile(Target);
+    S:=GetCompilerCommand(FCurrentPackage,Target);
+    ExecuteCommand(GetCompiler,S);
+    Target.FTargetState:=tsCompiled;
+    If Assigned(Target.AfterCompile) then
+      Target.AfterCompile(Target);
+    If Target.HasCommands then
+      ExecuteCommands(Target.Commands,caAfterCompile);
+    end
+  else if Target.State<>tsCompiled then
+    Log(vlWarning,'Attempting to compile non-neutral target: '+Target.Name);
+end;
+
+
+procedure TBuildEngine.FixDependencies(Target: TTarget);
+
+Var
+  I : Integer;
+  T : TTarget;
+
+begin
+  Log(vlDebug,'Checking dependencies for target: '+Target.Name);
+  ResolveDependencies(Target.Dependencies,Target.Collection as TTargets);
+  If Target.HasDependencies then
+    For I:=0 to Target.Dependencies.Count-1 do
+      begin
+      T:=TTarget(Target.Dependencies.Objects[i]);
+      If Assigned(T) then
+        begin
+        If (T.State=tsCompiling) then
+          Log(vlWarning,SWarnCircularDependency,[Target.Name,T.Name])
+        else
+          Compile(T)
+        end
+      else if Not FileExists(Target.Dependencies[i]) then
+        Error(SErrDepUnknownTarget,[Target.Name,Target.Dependencies[i]]);
+      end;
+end;
+
+function TBuildEngine.GetPackageDir(APackage: TPackage; AbsolutePath: Boolean
+  ): String;
+begin
+  If AbsolutePath then
+    Result:= IncludeTrailingPathDelimiter(FStartDir)
+  else
+    Result:='';
+  Result:=Result+APackage.Directory;
+  If (Result<>'') then
+    Result:= ExcludeTrailingPathDelimiter(Result)
+end;
+
+
+Function TBuildEngine.GetOutputDir(APackage : TPackage; AbsolutePath : Boolean = False) : String;
+
+begin
+  If (TargetDir<>'') then
+    Result:=TargetDir
+  else
+    begin
+    If AbsolutePath then
+      Result:=IncludeTrailingPathDelimiter(FStartDir)
+    else
+      Result:='';
+    If (APackage.Directory<>'') then
+      Result:=IncludeTrailingPathDelimiter(Result+APackage.Directory);
+    Result:=Result+'units'+PathDelim+Defaults.Target;
+    end;
+end;
+
+procedure TBuildEngine.CreateOutputDir(APackage: TPackage);
+
+Var
+  D : String;
+
+begin
+  D:=GetOutputDir(APackage,True);
+  If DirectoryExists(D) then
+    Log(vlInfo,SLogOutputDirExists,[D])
+  else
+    begin
+    Log(vlInfo,SLogCreatingOutputDir,[D]);
+    CmdCreateDir(D);
+    end;
+end;
+
+Function TBuildEngine.PackageOK(APackage : TPackage) : Boolean;
+
+begin
+  Result:=((APackage.CPU=[]) or (Defaults.CPU in APackage.CPU))
+          and
+          ((APAckage.OS=[]) or (Defaults.OS in APackage.OS));
+end;
+
+
+procedure TBuildEngine.DoBeforeCompile(APackage: TPackage);
+begin
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caBeforeCompile);
+  If Assigned(APackage.BeforeCompile) then
+    APackage.BeforeCompile(APackage);
+end;
+
+procedure TBuildEngine.DoAfterCompile(APackage: TPackage);
+begin
+  If Assigned(APackage.AfterCompile) then
+    APackage.AfterCompile(APackage);
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caAfterCompile);
+end;
+
+procedure TBuildEngine.Compile(APackage: TPackage);
+
+
+Var
+  T : TTarget;
+  I : Integer;
+
+begin
+  Log(vlInfo,SLogCompilingPackage,[APackage.Name]);
+  FCurrentPackage:=APackage;
+  FCurrentOutputDir:=GetOutputDir(APackage,True);
+  Try
+    If (APackage.Directory<>'') then
+      EnterDir(APackage.Directory);
+    CreateOutputDir(APackage);
+    Dictionary.AddVariable('OUTPUTDIR',FCurrentOutputDir);
+    DoBeforeCompile(APackage);
+    Try
+      For I:=0 to APackage.Targets.Count-1 do
+        begin
+        T:=APackage.Targets.TargetItems[i];
+        Log(vlDebug,'Considering target: '+T.Name);
+        If TargetOK(T) then
+          If (T.State=tsNeutral) then
+            begin
+            If (FForceCompile or NeedsCompile(T)) then
+              begin
+              T.FTargetState:=tsCompiling;
+              FixDependencies(T);
+              Compile(T);
+              end;
+            T.FTargetState:=tsCompiled;
+            end;
+        end;
+      DoAfterCompile(APackage);
+    Finally
+      If (APackage.Directory<>'') then
+        EnterDir('');
+    end;
+  Finally
+    FCurrentPackage:=Nil;
+    FCurrentOutputDir:='';
+  end;
+end;
+
+procedure TBuildEngine.CheckExternalPackage(Const APackageName : String);
+
+begin
+  // A check needs to be implemented here.
+  Log(vldebug,'Unresolved external dependency : %s',[APackageName]);
+end;
+
+procedure TBuildEngine.FixDependencies(APackage: TPackage);
+
+Var
+  I : Integer;
+  P : TPackage;
+
+begin
+  if APackage.HasDependencies then
+    For I:=0 to APAckage.Dependencies.Count-1 do
+      begin
+      P:=TPackage(Apackage.Dependencies.Objects[i]);
+      If Assigned(P) then
+        Compile(P) // If it already was compiled, then State<>tsNeutral, and it won't be compiled again.
+      else
+        CheckExternalPackage(Apackage.Dependencies[i]);
+      end;
+end;
+
+Procedure TBuildEngine.InstallPackageFiles(APAckage : TPackage; tt : TTargetType; Const Src,Dest : String);
+
+Var
+  List : TStringList;
+
+begin
+  List:=TStringList.Create;
+  Try
+    APackage.GetInstallFiles(List,[tt],Src,Defaults.OS);
+    if (List.Count>0) then
+      CmdCopyFiles(List,Dest);
+  Finally
+    List.Free;
+  end;
+end;
+
+procedure TBuildEngine.DoBeforeInstall(APackage: TPackage);
+begin
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caBeforeInstall);
+  If Assigned(APackage.BeforeInstall) then
+    APackage.BeforeInstall(APackage);
+end;
+
+procedure TBuildEngine.DoAfterInstall(APackage: TPackage);
+begin
+  If Assigned(APackage.AfterInstall) then
+    APackage.AfterInstall(APackage);
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caAfterInstall);
+end;
+
+
+procedure TBuildEngine.Install(APackage: TPackage);
+
+
+Var
+  PD,D,O : String;
+
+begin
+  If (Apackage.State<>tsCompiled) then
+    Compile(APackage);
+  Log(vlInfo,SLogInstallingPackage,[APackage.Name]);
+  DoBeforeInstall(APackage);
+  O:=IncludeTrailingPathDelimiter(GetOutputDir(APAckage));
+  PD:=IncludeTrailingPathDelimiter(GetPackageDir(APackage));
+  // units
+  D:=IncludeTrailingPathDelimiter(Defaults.UnitInstallDir)+APackage.Name;
+  InstallPackageFiles(APAckage,ttUnit,O,D);
+  // Programs
+  D:=IncludeTrailingPathDelimiter(Defaults.BinInstallDir);
+  InstallPackageFiles(APAckage,ttProgram,PD,D);
+  // Done.
+  APackage.FTargetState:=tsInstalled;
+  DoAfterInstall(APackage);
+end;
+
+procedure TBuildEngine.DoBeforeArchive(APackage: TPackage);
+begin
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caBeforeArchive);
+  If Assigned(APackage.BeforeArchive) then
+    APackage.BeforeArchive(APackage);
+end;
+
+procedure TBuildEngine.DoAfterArchive(APackage: TPackage);
+begin
+  If Assigned(APackage.AfterArchive) then
+    APackage.AfterArchive(APackage);
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caAfterArchive);
+end;
+
+
+procedure TBuildEngine.Archive(APackage: TPackage);
+
+Var
+  L : TStrings;
+  A : String;
+
+begin
+  Log(vlInfo,SLogArchivingPackage,[APackage.Name]);
+  DoBeforeArchive(Apackage);
+  L:=TStringList.Create;
+  Try
+    APackage.GetInstallFiles(L,[ttUnit],TargetDir,Defaults.OS);
+    A:=APackage.Name+ZipExt;
+    CmdArchiveFiles(L,A);
+  Finally
+    L.Free;
+  end;
+  Writeln('Archiving : ',APackage.Name);
+  DoAfterArchive(Apackage);
+end;
+
+procedure TBuildEngine.DoBeforeClean(APackage: TPackage);
+begin
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caBeforeClean);
+  If Assigned(APackage.BeforeClean) then
+    APackage.BeforeClean(APackage);
+end;
+
+procedure TBuildEngine.DoAfterClean(APackage: TPackage);
+begin
+  If Assigned(APackage.AfterClean) then
+    APackage.AfterClean(APackage);
+  If APackage.HasCommands then
+    ExecuteCommands(APackage.Commands,caAfterClean);
+end;
+
+procedure TBuildEngine.Clean(APackage: TPackage);
+
+Var
+  O : String;
+  List : TStringList;
+
+begin
+  Log(vlInfo,SLogCleaningPackage,[APackage.Name]);
+  DoBeforeClean(Apackage);
+  O:=IncludeTrailingPathDelimiter(GetOutputDir(APAckage));
+  List:=TStringList.Create;
+  try
+    APackage.GetCleanFiles(List,O,Defaults.OS);
+    if (List.Count>0) then
+      CmdDeleteFiles(List);
+  Finally
+    List.Free;
+  end;
+  DoAfterClean(Apackage);
+end;
+
+function TBuildEngine.NeedsCompile(APackage: TPackage): Boolean;
+
+Var
+  I : Integer;
+  P : TPackage;
+
+begin
+  ResolveDependencies(APackage.Dependencies,(APackage.Collection as TPackages));
+  Result:=False;
+  I:=0;
+  While (Not Result) and (I<APAckage.Dependencies.Count) do
+    begin
+    P:=TPackage(APAckage.Dependencies.Objects[i]);
+    // I'm not sure whether the target dir is OK here ??
+    Result:=Assigned(P) and NeedsCompile(P);
+    Inc(I);
+    end;
+  If Not Result then
+    begin
+    I:=0;
+    While (Not Result) and (I<APackage.Targets.Count) do
+      begin
+      Result:=NeedsCompile(APackage.Targets.TargetItems[i]);
+      Inc(I);
+      end;
+    end;
+end;
+
+Procedure TBuildEngine.GetSourceFiles(APackage : TPackage; List : TStrings);
+var
+  L : TStrings;
+  i : integer;
+begin
+  try
+    L:=TStringList.Create;
+    APackage.GetSourceFiles(L);
+    List.Add(Format('<sources packagename=%s>',[APackage.Name]));
+    for i:=0 to L.Count-1 do
+      List.Add(Format('<source>%s</source>',[L[i]]));
+    List.Add('</sources>');
+  finally
+    L.Free;
+  end;
+end;
+
+
+Procedure TBuildEngine.GetManifest(APackage : TPackage; Manifest : TStrings);
+
+begin
+  APackage.GetManifest(Manifest);
+end;
+
+
+procedure TBuildEngine.Compile(Packages: TPackages);
+
+Var
+  I : Integer;
+  P : TPackage;
+
+begin
+  If Assigned(BeforeCompile) then
+    BeforeCompile(Self);
+  For I:=0 to Packages.Count-1 do
+    begin
+    P:=Packages.PackageItems[i];
+    If PackageOK(P) then
+      If (P.State=tsNeutral) then
+        begin
+        If (FForceCompile or NeedsCompile(P)) then
+          begin
+          P.FTargetState:=tsCompiling;
+          FixDependencies(P);
+          Compile(P);
+          end;
+        P.FTargetState:=tsCompiled;
+        end;
+    end;
+  If Assigned(AfterCompile) then
+    AfterCompile(Self);
+end;
+
+procedure TBuildEngine.Install(Packages: TPackages);
+
+Var
+  I : Integer;
+  P : TPackage;
+
+begin
+  If Assigned(BeforeInstall) then
+    BeforeInstall(Self);
+  For I:=0 to Packages.Count-1 do
+    begin
+    P:=Packages.PackageItems[i];
+    If PackageOK(P) then
+      Install(P);
+    end;
+  If Assigned(AfterInstall) then
+    AfterInstall(Self);
+end;
+
+procedure TBuildEngine.Archive(Packages: TPackages);
+
+Var
+  I : Integer;
+  P : TPackage;
+
+begin
+  If Assigned(BeforeArchive) then
+    BeforeArchive(Self);
+  Log(vlDebug,'Build engine archiving.');
+  For I:=0 to Packages.Count-1 do
+    begin
+    P:=Packages.PackageItems[i];
+    If PackageOK(P) then
+      Archive(P);
+    end;
+  If Assigned(AfterArchive) then
+    AfterArchive(Self);
+end;
+
+procedure TBuildEngine.Clean(Packages: TPackages);
+
+Var
+  I : Integer;
+  P : TPackage;
+
+begin
+  If Assigned(BeforeClean) then
+    BeforeClean(Self);
+  Log(vldebug,'Build engine cleaning.');
+  For I:=0 to Packages.Count-1 do
+    begin
+    P:=Packages.PackageItems[i];
+    If PackageOK(P) then
+      Clean(P);
+    end;
+  If Assigned(AfterClean) then
+    AfterClean(Self);
+end;
+
+Procedure TBuildEngine.GetManifest(Packages : TPackages; Manifest : TStrings);
+
+Var
+  I : Integer;
+
+begin
+  If Assigned(BeforeManifest) then
+    BeforeManifest(Self);
+  Manifest.Add('<packages>');
+  For I:=0 to Packages.Count-1 do
+    GetManifest(Packages.PackageItems[i],Manifest);
+  Manifest.Add('</packages>');
+  If Assigned(AfterManifest) then
+    AfterManifest(Self);
+end;
+
+
+Procedure TBuildEngine.GetSourceFiles(Packages : TPackages; List : TStrings);
+
+Var
+  I : Integer;
+
+begin
+  List.Add('<packages>');
+  For I:=0 to Packages.Count-1 do
+    GetSourceFiles(Packages.PackageItems[i],List);
+  List.Add('</packages>');
+end;
+
+
+{ TTarget }
+
+function TTarget.GetHasStrings(AIndex: integer): Boolean;
+begin
+  Result:=False;
+  Case AIndex Of
+    0 : Result:=FUnitPath<>Nil;
+    1 : Result:=FObjectPath<>Nil;
+    2 : Result:=FIncludePath<>Nil;
+    3 : Result:=FDependencies<>Nil;
+  end;
+end;
+
+function TTarget.GetCommands: TCommands;
+begin
+  If FCommands=Nil then
+    FCommands:=TCommands.Create(TCommand);
+  Result:=FCommands;
+end;
+
+function TTarget.GetHasCommands: Boolean;
+begin
+  Result:=(FCommands<>Nil);
+end;
+
+function TTarget.GetStrings(AIndex: integer): TStrings;
+
+  Function EnsureStrings(Var S : TStrings) : TStrings;
+
+  begin
+    If (S=Nil) then
+      S:=TStringList.Create;
+    Result:=S;
+  end;
+
+begin
+  Result:=Nil;
+  Case AIndex Of
+    0 : Result:=EnsureStrings(FUnitPath);
+    1 : Result:=EnsureStrings(FObjectPath);
+    2 : Result:=EnsureStrings(FIncludePath);
+    3 : Result:=EnsureStrings(FDependencies);
+  end;
+end;
+
+procedure TTarget.SetCommands(const AValue: TCommands);
+begin
+
+end;
+
+procedure TTarget.SetStrings(AIndex: integer; const AValue: TStrings);
+begin
+  GetStrings(AIndex).Assign(AValue);
+end;
+
+
+function TTarget.GetSourceFileName: String;
+begin
+  Result:=Name+FExtension;
+end;
+
+function TTarget.GetUnitFileName: String;
+begin
+  Result:=Name+UnitExt;
+end;
+
+function TTarget.GetObjectFileName: String;
+begin
+  Result:=Name+ObjExt;
+end;
+
+function TTarget.GetRSTFileName: String;
+begin
+  Result:=Name+RSText;
+end;
+
+function TTarget.GetProgramFileName(AnOS : TOS): String;
+begin
+  if AnOS in [Go32v2,Win32,Win64,OS2] then
+    Result:=Name+ExeExt
+  else
+    Result:=Name;
+end;
+
+constructor TTarget.Create(ACollection: TCollection);
+begin
+  inherited Create(ACollection);
+  FInstall:=True;
+end;
+
+destructor TTarget.Destroy;
+begin
+  FreeAndNil(FUnitPath);
+  FreeAndNil(FObjectPath);
+  FreeAndNil(FIncludePath);
+  FreeAndNil(FDependencies);
+  inherited Destroy;
+end;
+
+function TTarget.GetOutputFileName(AOs: TOS): String;
+begin
+  if TargetType in UnitTargets then
+    Result:=GetUnitFileName
+  else
+    Result:=GetProgramFileName(AOs);
+end;
+
+
+procedure TTarget.SetName(const AValue: String);
+
+Var
+  D,N,E : String;
+
+begin
+  N:=FixPath(AValue);
+  D:=ExtractFilePath(N);
+  E:=ExtractFileExt(N);
+  N:=ExtractFileName(N);
+  If (E<>'') then
+    N:=Copy(N,1,Length(N)-Length(E));
+  inherited SetName(N);
+  FExtension:=E;
+  FDirectory:=D;
+end;
+
+procedure TTarget.GetCleanFiles(List: TStrings; APrefix : String; AnOS : TOS);
+begin
+  If (OS=[]) or (AnOS in OS) then
+    begin
+    List.Add(APrefix+ObjectFileName);
+    If (TargetType in [ttUnit,ttExampleUnit]) then
+      List.Add(APrefix+UnitFileName)
+    else If (TargetType in [ttProgram,ttExampleProgram]) then
+      List.Add(APrefix+GetProgramFileName(AnOS));
+    If ResourceStrings then
+      List.Add(APrefix+RSTFileName);
+    // Maybe add later ?  AddStrings(List,CleanFiles);
+    end;
+end;
+
+procedure TTarget.GetSourceFiles(List: TStrings; APrefix : String; AnOS : TOS);
+begin
+  If (OS=[]) or (AnOS in OS) then
+    begin
+    List.Add(APrefix+ObjectFileName);
+    If (TargetType in [ttUnit,ttExampleUnit]) then
+      List.Add(APrefix+UnitFileName)
+    else If (TargetType in [ttProgram,ttExampleProgram]) then
+      List.Add(APrefix+GetProgramFileName(AnOS));
+    If ResourceStrings then
+      List.Add(APrefix+RSTFileName);
+    // Maybe add later ?  AddStrings(List,CleanFiles);
+    end;
+end;
+
+procedure TTarget.GetInstallFiles(List: TStrings; APrefix : String; AnOS : TOS);
+begin
+  If (OS=[]) or (AnOS in OS) then
+    begin
+    If Not (TargetType in [ttProgram,ttExampleProgram]) then
+      List.Add(APrefix+ObjectFileName);
+    If (TargetType in [ttUnit,ttExampleUnit]) then
+      List.Add(APrefix+UnitFileName)
+    else If (TargetType in [ttProgram,ttExampleProgram]) then
+      List.Add(APrefix+GetProgramFileName(AnOS));
+    If ResourceStrings then
+      List.Add(APrefix+RSTFileName);
+    // Maybe add later ?  AddStrings(List,InstallFiles);
+    end;
+end;
+
+procedure TTarget.GetArchiveFiles(List: TStrings; APrefix : String; AnOS : TOS);
+begin
+  If (OS=[]) or (AnOS in OS) then
+    begin
+    List.Add(APrefix+SourceFileName);
+    // Maybe add later ?  AddStrings(List,ArchiveFiles);
+    end;
+end;
+
+
+{ TSource }
+
+constructor TSource.Create(ACollection: TCollection);
+begin
+  inherited Create(ACollection);
+end;
+
+destructor TSource.Destroy;
+begin
+  inherited Destroy;
+end;
+
+procedure TSource.GetSourceFiles(List: TStrings);
+begin
+  List.Add(Name);
+end;
+
+
+{ TCommands }
+
+function TCommands.GetCommand(Dest : String): TCommand;
+
+begin
+  Result:=TCommand(ItemByName(Dest));
+end;
+
+function TCommands.GetCommandItem(Index : Integer): TCommand;
+begin
+  Result:=TCommand(Items[Index]);
+end;
+
+procedure TCommands.SetCommandItem(Index : Integer; const AValue: TCommand);
+begin
+  Items[Index]:=AValue;
+end;
+
+Function TCommands.AddCommand(const Cmd: String) : TCommand;
+begin
+  Result:=AddCommand(fdefaultAt,Cmd,'','','');
+end;
+
+function TCommands.AddCommand(const Cmd, Options: String): TCommand;
+begin
+  Result:=AddCommand(fdefaultAt,Cmd,Options,'','');
+end;
+
+function TCommands.AddCommand(const Cmd, Options, Dest, Source: String
+  ): TCommand;
+begin
+  Result:=AddCommand(fdefaultAt,Cmd,options,Dest,Source);
+end;
+
+Function TCommands.AddCommand(At: TCommandAt; const Cmd: String) : TCommand;
+begin
+  Result:=AddCommand(At,Cmd,'','','');
+end;
+
+function TCommands.AddCommand(At: TCommandAt; const Cmd, Options: String
+  ): TCommand;
+begin
+  Result:=AddCommand(At,Cmd,Options,'','');
+end;
+
+function TCommands.AddCommand(At: TCommandAt; const Cmd, Options, Dest,
+  Source: String): TCommand;
+begin
+  Result:=Add as TCommand;
+  Result.Command:=Cmd;
+  Result.Options:=Options;
+  Result.At:=At;
+  Result.SourceFile:=Source;
+  Result.DestFile:=Dest;
+end;
+
+Var
+  DefInstaller : TInstaller = Nil;
+  DefDictionary : TDictionary = Nil;
+
+Function Installer : TInstaller;
+
+begin
+  If Not Assigned(DefInstaller) then
+    DefInstaller:=InstallerClass.Create(Nil);
+  Result:=DefInstaller;
+end;
+
+Function Defaults : TDefaults;
+
+begin
+  Result:=Installer.Defaults;
+end;
+
+
+function Dictionary : TDictionary;
+begin
+  If Not Assigned(DefDictionary) then
+    DefDictionary:=DictionaryClass.Create(Nil);
+  Result:=DefDictionary;
+end;
+
+{ TValueItem }
+
+constructor TValueItem.Create(AValue: String);
+begin
+  FValue:=AValue;
+end;
+
+{ TFunctionItem }
+
+constructor TFunctionItem.Create(AFunc: TReplaceFunction);
+begin
+  FFunc:=AFunc;
+end;
+
+{ TDictionary }
+
+constructor TDictionary.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FList:=TStringList.Create;
+  FList.Sorted:=True;
+  FList.Duplicates:=dupError;
+end;
+
+destructor TDictionary.Destroy;
+
+Var
+  I : Integer;
+
+begin
+  For I:=0 to Flist.Count-1 do
+    FList.Objects[i].Free;
+  FreeAndNil(FList);
+  inherited Destroy;
+end;
+
+procedure TDictionary.AddVariable(const AName, Value: String);
+
+Var
+  I : Integer;
+
+begin
+  I:=Flist.IndexOf(AName);
+  If I=-1 then
+    I:=FList.Add(Aname)
+  else
+    Flist.Objects[i].Free;
+  Flist.Objects[i]:=TValueItem.Create(Value);
+end;
+
+procedure TDictionary.AddFunction(const AName: String;
+  FReplacement: TReplaceFunction);
+
+Var
+  I : Integer;
+
+begin
+  I:=Flist.IndexOf(AName);
+  If I=-1 then
+    I:=Flist.Add(AName)
+  else
+    Flist.Objects[i].Free;
+  Flist.Objects[i]:=TFunctionItem.Create(FReplacement);
+end;
+
+procedure TDictionary.RemoveItem(const AName: String);
+
+Var
+  I : Integer;
+
+begin
+  I:=Flist.IndexOf(AName);
+  If (I<>-1) then
+    begin
+    FList.Objects[i].Free;
+    FList.Delete(I);
+    end;
+end;
+
+function TDictionary.GetValue(const AName: String): String;
+
+begin
+  Result:=GetValue(AName,'');
+end;
+
+
+function TDictionary.GetValue(const AName,Args: String): String;
+
+Var
+  O : TObject;
+  I : Integer;
+
+begin
+  I:=Flist.IndexOf(AName);
+  If (I=-1) then
+    Raise EDictionaryError.CreateFmt(SErrNoDictionaryItem,[AName]);
+  O:=Flist.Objects[I];
+  If O is TValueItem then
+    Result:=Result+TValueItem(O).FValue
+  else
+    Result:=Result+TFunctionItem(O).FFunc(AName,Args);
+end;
+
+function TDictionary.ReplaceStrings(Const ASource: String): String;
+
+
+Var
+  S,FN,FV : String;
+  P: Integer;
+
+begin
+  Result:='';
+  S:=ASource;
+  P:=Pos('$(',S);
+  While (P<>0) do
+    begin
+    Result:=Result+Copy(S,1,P-1);
+    Delete(S,1,P+1);
+    P:=Pos(')',S);
+    FN:=Copy(S,1,P-1);
+    Delete(S,1,P);
+    P:=Pos(' ',FN);
+    If (P<>0) then // function arguments ?
+      begin
+      FV:=FN;
+      FN:=Copy(FN,1,P);
+      System.Delete(FV,1,P);
+      end
+    else
+      FV:='';
+    Result:=Result+GetValue(FN,FV);
+    P:=Pos('$(',S);
+    end;
+  Result:=Result+S;
+end;
+
+Function Substitute(Const Source : String; Macros : Array of string) : String;
+
+Var
+  I : Integer;
+
+begin
+  I:=0;
+  While I<High(Macros) do
+    begin
+    Dictionary.AddVariable(Macros[i],Macros[I+1]);
+    Inc(I,2);
+    end;
+  Result:=Dictionary.ReplaceStrings(Source);
+  While I<High(Macros) do
+    begin
+    Dictionary.RemoveItem(Macros[i]);
+    Inc(I,2);
+    end;
+end;
+
+Initialization
+  OnGetApplicationName:=@GetFPMakeName;
+
+Finalization
+  FreeAndNil(DefInstaller);
+  FreeAndNil(DefDictionary);
+end.