summaryrefslogtreecommitdiff
path: root/packages/objcrtl
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-05-09 20:24:21 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-05-09 20:24:21 +0000
commitcb03e9c9442e0890ffa6872bf6f5f76227746afb (patch)
tree0a8cc2c2a43d99ab0c32a79527ef44e3092e4def /packages/objcrtl
parent786c3587995902673daeb2dc54062fc59913414b (diff)
downloadfpc-cb03e9c9442e0890ffa6872bf6f5f76227746afb.tar.gz
+ objcrtl package by Dmitry Boyarintsev: interface for the Mac OS X
Objective-C run time 1.0 and 2.0, for 32 bit platforms git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@13122 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/objcrtl')
-rw-r--r--packages/objcrtl/Makefile2350
-rwxr-xr-xpackages/objcrtl/Makefile.fpc23
-rw-r--r--packages/objcrtl/Package.fpc57
-rwxr-xr-xpackages/objcrtl/examples/objcrtltest.pas191
-rwxr-xr-xpackages/objcrtl/fpmake.pp41
-rwxr-xr-xpackages/objcrtl/src/objcrtl.pas408
-rwxr-xr-xpackages/objcrtl/src/objcrtl10.pas833
-rwxr-xr-xpackages/objcrtl/src/objcrtl20.pas160
-rwxr-xr-xpackages/objcrtl/src/objcrtliphoneos.pas26
-rwxr-xr-xpackages/objcrtl/src/objcrtlmacosx.pas54
-rwxr-xr-xpackages/objcrtl/src/objcrtlutils.pas75
11 files changed, 4218 insertions, 0 deletions
diff --git a/packages/objcrtl/Makefile b/packages/objcrtl/Makefile
new file mode 100644
index 0000000000..a21c9238b1
--- /dev/null
+++ b/packages/objcrtl/Makefile
@@ -0,0 +1,2350 @@
+#
+# Don't edit, this file is generated by FPCMake Version 2.0.0 [2009/05/09]
+#
+default: all
+MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku 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-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded avr-embedded armeb-linux armeb-embedded
+BSDs = freebsd netbsd openbsd darwin
+UNIXs = linux $(BSDs) solaris qnx
+LIMIT83fs = go32v2 os2 emx watcom
+OSNeedsComspecToRunBatch = go32v2 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 COMSPEC
+ifneq ($(findstring $(OS_SOURCE),$(OSNeedsComspecToRunBatch)),)
+RUNBATCH=$(COMSPEC) /C
+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))
+ifneq ($(CPU_TARGET),)
+FPC:=$(shell $(FPCPROG) -P$(CPU_TARGET) -PB)
+else
+FPC:=$(shell $(FPCPROG) -PB)
+endif
+ifneq ($(findstring Error,$(FPC)),)
+override FPC=$(firstword $(strip $(wildcard $(addsuffix /ppc386$(SRCEXEEXT),$(SEARCHPATH)))))
+else
+ifeq ($(strip $(wildcard $(FPC))),)
+FPC:=$(firstword $(FPCPROG))
+endif
+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)
+ifeq ($(CPU_TARGET),armeb)
+ARCH=arm
+override FPCOPT+=-Cb
+else
+ifeq ($(CPU_TARGET),armel)
+ARCH=arm
+override FPCOPT+=-CaEABI
+else
+ARCH=$(CPU_TARGET)
+endif
+endif
+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 ARCH 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
+ifeq ($(OS_TARGET),darwin)
+ifeq ($(OS_SOURCE),darwin)
+DARWIN2DARWIN=1
+endif
+endif
+ifndef BINUTILSPREFIX
+ifndef CROSSBINDIR
+ifdef CROSSCOMPILE
+ifndef DARWIN2DARWIN
+BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
+endif
+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=obcjrtl
+override PACKAGE_VERSION=2.2.2
+ifeq ($(FULL_TARGET),i386-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-go32v2)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-win32)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-os2)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-freebsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-beos)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-haiku)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-netbsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-solaris)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-qnx)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-netware)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-openbsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-wdosx)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-darwin)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-emx)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-watcom)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-netwlibc)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-wince)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),i386-symbian)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-freebsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-netbsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-amiga)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-atari)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-openbsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-palmos)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),m68k-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-netbsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-amiga)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-macos)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-darwin)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-morphos)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),sparc-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),sparc-netbsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),sparc-solaris)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),sparc-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),x86_64-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),x86_64-freebsd)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),x86_64-darwin)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),x86_64-win64)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),x86_64-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-palmos)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-darwin)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-wince)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-gba)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-nds)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),arm-symbian)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc64-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc64-darwin)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),powerpc64-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),avr-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+endif
+ifeq ($(FULL_TARGET),armeb-embedded)
+override TARGET_UNITS+=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+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-haiku)
+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-darwin)
+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-darwin)
+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),avr-embedded)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_INCLUDEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-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-haiku)
+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-darwin)
+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-darwin)
+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
+ifeq ($(FULL_TARGET),avr-embedded)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+override COMPILER_SOURCEDIR+=src
+endif
+ifeq ($(FULL_TARGET),armeb-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
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+OEXT=.obj
+ASMEXT=.asm
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+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
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),emx)
+BATCHEXT=.cmd
+AOUTEXT=.out
+STATICLIBPREFIX=
+SHAREDLIBEXT=.dll
+SHORTSUFFIX=emx
+ECHO=echo
+IMPORTLIBPREFIX=
+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),haiku)
+BATCHEXT=.sh
+EXEEXT=
+SHORTSUFFIX=hai
+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
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+EXEEXT=.nlm
+STATICLIBPREFIX=
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+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
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),go32v2)
+STATICLIBPREFIX=
+SHORTSUFFIX=dos
+IMPORTLIBPREFIX=
+endif
+ifeq ($(OS_TARGET),watcom)
+STATICLIBPREFIX=
+SHORTSUFFIX=wat
+IMPORTLIBPREFIX=
+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
+IMPORTLIBPREFIX=
+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
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),netwlibc)
+STATICLIBPREFIX=
+PPUEXT=.ppu
+OEXT=.o
+ASMEXT=.s
+SMARTEXT=.sl
+STATICLIBEXT=.a
+SHAREDLIBEXT=.nlm
+EXEEXT=.nlm
+SHORTSUFFIX=nwl
+IMPORTLIBPREFIX=imp
+endif
+ifeq ($(OS_TARGET),macos)
+BATCHEXT=
+PPUEXT=.ppu
+ASMEXT=.s
+OEXT=.o
+SMARTEXT=.sl
+STATICLIBEXT=.a
+EXEEXT=
+DEBUGSYMEXT=.xcoff
+SHORTSUFFIX=mac
+IMPORTLIBPREFIX=imp
+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-haiku)
+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-darwin)
+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-darwin)
+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
+ifeq ($(FULL_TARGET),avr-embedded)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-linux)
+REQUIRE_PACKAGES_RTL=1
+endif
+ifeq ($(FULL_TARGET),armeb-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=$(ARCH)
+endif
+ifneq ($(OS_TARGET),$(OS_SOURCE))
+override FPCOPT+=-T$(OS_TARGET)
+endif
+ifneq ($(CPU_TARGET),$(CPU_SOURCE))
+override FPCOPT+=-P$(ARCH)
+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))
+ifdef RUNBATCH
+EXECPPAS:=@$(RUNBATCH) $(PPAS)
+else
+EXECPPAS:=@$(PPAS)
+endif
+endif
+endif
+.PHONY: fpc_units
+ifneq ($(TARGET_UNITS)$(TARGET_IMPLICITUNITS),)
+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
+ifdef RUNBATCH
+ $(RUNBATCH) $(ZIPWRAPPER)
+else
+ $(ZIPWRAPPER)
+endif
+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:
diff --git a/packages/objcrtl/Makefile.fpc b/packages/objcrtl/Makefile.fpc
new file mode 100755
index 0000000000..48ddc6f343
--- /dev/null
+++ b/packages/objcrtl/Makefile.fpc
@@ -0,0 +1,23 @@
+#
+# Makefile.fpc for objective-c runtime library bindings
+#
+
+[package]
+name=obcjrtl
+version=2.2.2
+
+[target]
+units=objcrtl objcrtl10 objcrtl20 objcrtliphoneos objcrtlmacosx objcrtlutils
+
+[install]
+fpcpackage=y
+
+[default]
+fpcdir=../..
+
+[compiler]
+includedir=src
+sourcedir=src
+
+[rules]
+.NOTPARALLEL:
diff --git a/packages/objcrtl/Package.fpc b/packages/objcrtl/Package.fpc
new file mode 100644
index 0000000000..5d26410445
--- /dev/null
+++ b/packages/objcrtl/Package.fpc
@@ -0,0 +1,57 @@
+[package]
+name=obcjrtl
+version=2.2.2
+[require]
+packages=rtl
+packages_os2_i386=
+packages_emx_i386=
+packages_embedded_i386=
+packages_embedded_sparc=
+packages_linux_armeb=
+packages_freebsd_m68k=
+packages_amiga_m68k=
+packages_embedded_arm=
+packages_netbsd_powerpc=
+packages_macos_powerpc=
+packages_linux_powerpc64=
+packages_freebsd_i386=
+packages_beos_i386=
+packages_darwin_i386=
+packages_morphos_powerpc=
+packages_gba_arm=
+packages_solaris_i386=
+packages_symbian_i386=
+packages_win64_x86_64=
+packages_palmos_arm=
+packages_darwin_powerpc64=
+packages_netbsd_m68k=
+packages_netwlibc_i386=
+packages_linux_m68k=
+packages_nds_arm=
+packages_wince_i386=
+packages_linux_powerpc=
+packages_wince_arm=
+packages_netbsd_sparc=
+packages_embedded_x86_64=
+packages_embedded_powerpc=
+packages_linux_i386=
+packages_win32_i386=
+packages_embedded_m68k=
+packages_haiku_i386=
+packages_netware_i386=
+packages_darwin_powerpc=
+packages_linux_x86_64=
+packages_amiga_powerpc=
+packages_darwin_x86_64=
+packages_palmos_m68k=
+packages_linux_sparc=
+packages_solaris_sparc=
+packages_embeddedavr=
+packages_embedded_armeb=
+packages_linux_arm=
+packages_embedded_powerpc64=
+packages_symbian_arm=
+packages_go32v2_i386=
+packages_netbsd_i386=
+packages_freebsd_x86_64=
+packages_darwin_arm=
diff --git a/packages/objcrtl/examples/objcrtltest.pas b/packages/objcrtl/examples/objcrtltest.pas
new file mode 100755
index 0000000000..55681c34d7
--- /dev/null
+++ b/packages/objcrtl/examples/objcrtltest.pas
@@ -0,0 +1,191 @@
+{
+ Objective-C rtl Test application by dmitry boyarintsev
+
+ Should compile and run with no problems
+ program output should look like:
+
+ Objective-C runtime initialized successfuly
+ -init method
+ called newMethod1
+ called newMethod2, a = 5; b = 4
+ get double = 1.33300000000000E+000
+ get float = 3.12500000000000E+000
+ test successfully complete
+}
+
+program objcrtltest;
+
+{$mode objfpc}{$H+}
+
+uses
+ objcrtl20, objcrtl10, objcrtl, objcrtlutils;
+
+{.$linkframework AppKit}
+{$linkframework Foundation}
+
+type
+ TSubStructure = packed record
+ a,b,c,d: byte;
+ end;
+
+ PSmallRecord = ^TSmallRecord;
+ TSmallRecord = packed record
+ a,b,c: byte;
+ //d : Integer;
+ d: byte;
+ sub: TSubStructure;
+ end;
+
+const
+ newClassName = 'NSMyObject';
+ overrideMethod = 'init';
+ overrideMethodEnc = '@@:';
+
+ newMethod1 = 'newMethod1';
+ newMethod1Enc = 'v@:';
+
+ newMethod2 = 'newMethod2::';
+ newMethod2Enc = 'v@:ii';
+
+ newMethod3 = 'getDouble';
+ newMethod3Enc = 'd@:';
+
+ newMethod4 = 'getFloat';
+ newMethod4Enc = 'f@:';
+
+ newMethod5 = 'getSmallRecord';
+ newMethod5Enc = '{TSmallRecord=cccc{TSubStructure=cccc}}@:';
+
+ varName = 'myvar';
+
+function imp_init(self: id; _cmd: SEL): id; cdecl;
+var
+ sp : objc_super;
+begin
+ writeln('-init method');
+ sp := super(self);
+ Result := objc_msgSendSuper(@sp, selector(overrideMethod), []);
+end;
+
+procedure imp_newMethod1(self: id; _cmd: SEL); cdecl;
+begin
+ writeln('called newMethod1');
+end;
+procedure imp_newMethod2(self: id; _cmd: SEL; a, b: Integer); cdecl;
+begin
+ writeln('called newMethod2, a = ', a, '; b = ', b);
+end;
+
+function imp_newMethod3(self: id; _cmd: SEL): Double; cdecl;
+begin
+ Result := 1.333;
+end;
+
+function imp_newMethod4(self: id; _cmd: SEL): Single; cdecl;
+begin
+ Result := 3.125;
+end;
+
+function imp_getSmallRec(seld: id; _cmd: SEL): TSmallRecord; cdecl;
+begin
+ Result.a := 121;
+ Result.b := 68;
+ Result.c := 22;
+ Result.d := 5;
+end;
+
+
+procedure RegisterSubclass(NewClassName: PChar);
+var
+ cl : _Class;
+ b : Boolean;
+begin
+ cl := objc_allocateClassPair(objc_getClass('NSObject'), NewClassName, 0);
+ b := class_addMethod(cl, selector(OverrideMethod), @imp_init, overrideMethodEnc) and
+ class_addMethod(cl, selector(newMethod1), @imp_newMethod1, newMethod1Enc) and
+ class_addMethod(cl, selector(newMethod2), @imp_newMethod2, newMethod2Enc) and
+ class_addMethod(cl, selector(newMethod3), @imp_newMethod3, newMethod3Enc) and
+ class_addMethod(cl, selector(newMethod4), @imp_newMethod4, newMethod4Enc) and
+ class_addMethod(cl, selector(newMethod5), @imp_getSmallRec, newMethod5Enc);
+ if not b then
+ writeln('failed to add/override some method(s)');
+
+ if not class_addIvar(cl, varName, sizeof(TObject), 1, _C_PASOBJ) then
+ writeln('failed to add variable ', varName);
+
+ objc_registerClassPair(cl);
+end;
+
+var
+ obj : id;
+ objvar : Ivar;
+
+ stret : TSmallRecord;
+ varobj : TObject;
+
+{$WARNINGS OFF} // cdecl'ared functions have no high parameter
+type
+ TgetSmallRecord = function (obj: id; cmd: Sel; arg: array of const): TSmallRecord; cdecl;
+{$WARNINGS ON}
+
+begin
+ // if InitializeObjcRtl20(DefaultObjCLibName) then // should be used of OSX 10.5 and iPhoneOS
+
+ if InitializeObjcRtl10(DefaultObjCLibName) then // should be used of OSX 10.4 and lower
+ writeln('Objective-C runtime initialized successfuly')
+ else begin
+ writeln('failed to initialize Objective-C runtime');
+ Halt;
+ end;
+
+ RegisterSubclass(newClassName);
+ writeln('registered');
+
+ obj := AllocAndInit(newClassName);
+ {obj := alloc(newClassName);
+ objc_msgSend(obj, selector(overrideMethod), []);}
+
+ writeln('sizeof(TSmallRecord) = ', sizeof(TSmallRecord));
+
+ // this must be resolved at code-time (or compiler-time), not run-time
+ {$WARNINGS OFF} // unreachable code
+ if sizeof(TSmallRecord) in [1,2,4,8] then
+ stret := TgetSmallRecord(objc_msgSend_stretreg)(obj, selector(newMethod5), [])
+ else
+ stret := TgetSmallRecord(objc_msgSend_stret)(obj, selector(newMethod5), []);
+ {$WARNINGS ON}
+
+ //writeln('p = ', Integer(p));
+
+ //stret :=
+ writeln('stret.a = ', stret.a);
+ writeln('stret.b = ', stret.b);
+ writeln('stret.c = ', stret.c);
+ writeln('stret.d = ', stret.d);
+
+ objc_msgSend(obj, selector(newMethod1), []);
+ objc_msgSend(obj, selector(newMethod2), [5, 4]);
+
+ writeln('get double = ', objc_msgSend_fpret(obj, selector(newMethod3), []));
+ writeln('get float = ', objc_msgSend_fpret(obj, selector(newMethod4), []));
+
+ objvar := class_getInstanceVariable( object_getClass(obj), varName);
+ varobj := TObject.Create;
+
+ writeln('var Value = ', Integer(object_getIvar(obj, objvar)));
+ writeln('setting new Value = ', Integer(varobj));
+ object_setIvar(obj, objvar, varobj);
+ writeln('var Value = ', Integer(object_getIvar(obj, objvar)));
+
+ writeln('var offset = ', Integer(ivar_getOffset(objvar)));
+ writeln('var name = ', ivar_getName(objvar));
+ writeln('var type = ', ivar_getTypeEncoding(objvar));
+
+ release(obj);
+
+ varobj.Free;
+
+ writeln('test successfully complete');
+end.
+
+
diff --git a/packages/objcrtl/fpmake.pp b/packages/objcrtl/fpmake.pp
new file mode 100755
index 0000000000..aeb797dd47
--- /dev/null
+++ b/packages/objcrtl/fpmake.pp
@@ -0,0 +1,41 @@
+{$ifndef ALLPACKAGES}
+{$mode objfpc}{$H+}
+program fpmake;
+
+uses fpmkunit;
+
+Var
+ P : TPackage;
+begin
+ With Installer do
+ begin
+{$endif ALLPACKAGES}
+ P:=AddPackage('objcrtl');
+{$ifdef ALLPACKAGES}
+ P.Directory:='objcrtl';
+{$endif ALLPACKAGES}
+ P.Version:='2.2.2-0';
+ P.Author := 'Library: Apple, header: Dmitry "skalogryz" Boyarintsev';
+ P.License := 'Library: Apple, header: LGPL with modification, ';
+ P.HomepageURL := 'www.freepascal.org';
+ P.Email := '';
+ P.Description := 'Objective-C Runtime-Library.';
+ P.NeedLibC:= false; // true for headers that indirectly link to libc?
+
+ P.SourcePath.Add('src');
+
+ P.Targets.AddUnit('objcrtl.pas');
+ P.Targets.AddUnit('objcrtl10.pas');
+ P.Targets.AddUnit('objcrtl20.pas');
+ P.Targets.AddUnit('objcrtliphoneos.pas');
+ P.Targets.AddUnit('objcrtlmacosx.pas');
+ P.Targets.AddUnit('objcrtlutils.pas');
+
+ P.ExamplePath.Add('examples');
+ P.Targets.AddExampleProgram('examples/objcrtltest.pas');
+
+{$ifndef ALLPACKAGES}
+ Run;
+ end;
+end.
+{$endif ALLPACKAGES}
diff --git a/packages/objcrtl/src/objcrtl.pas b/packages/objcrtl/src/objcrtl.pas
new file mode 100755
index 0000000000..49c40d2397
--- /dev/null
+++ b/packages/objcrtl/src/objcrtl.pas
@@ -0,0 +1,408 @@
+{
+ objcrtl.pas
+
+ Copyright (C) 2009 Dmitry Boyarintsev
+
+ This unit is a pascal binding for dynamic Objective-C Run-time Library
+ headers included with XCode 3.1.2
+ The original copyright note of is kept on each include file
+}
+
+unit objcrtl;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ dynlibs;
+
+const
+ DefaultObjCLibName : AnsiString = 'libobjc.A.dylib';
+
+
+{ Overview
+ --------
+
+ This document describes the Mac OS X Objective-C 2.0 runtime library support
+ functions and data structures. The functions are implemented in the shared
+ library found at /usr/lib/libobjc.A.dylib. This shared library provides support
+ for the dynamic properties of the Objective-C language, and as such is linked
+ to by all Objective-C applications.
+
+ This reference is useful primarily for developing bridge layers between
+ Objective-C and other languages, or for low-level debugging. You typically do
+ not need to use the Objective-C runtime library directly when programming
+ in Objective-C.
+
+ The Mac OS X implementation of the Objective-C runtime library is unique
+ to the Mac OS X platform. For other platforms, the GNU Compiler Collection
+ provides a different implementation with a similar API. This document covers
+ only the Mac OS X implementation.
+
+ The low-level Objective-C runtime API is significantly updated in Mac OS X
+ version 10.5. Many functions and all existing data structures are replaced
+ with new functions. The old functions and structures are deprecated in 32-bit
+ and absent in 64-bit mode. The API constrains several values to 32-bit ints
+ even in 64-bit mode—class count, protocol count, methods per class, ivars
+ per class, arguments per method, sizeof(all arguments) per method, and
+ class version number. In addition, the new Objective-C ABI (not described here)
+ further constrains sizeof(anInstance) to 32 bits, and three other values
+ to 24 bits—methods per class, ivars per class, and sizeof(a single ivar).
+ Finally, the obsolete NXHashTable and NXMapTable are limited to 4 billion items.
+
+ “Deprecated” below means “deprecated in Mac OS X version 10.5 for 32-bit code,
+ and disallowed for 64-bit code.
+
+ Legacy and Modern Versions
+ --------------------------
+
+ There are two versions of the Objective-C runtime—“modern” and “legacy”.
+ The modern version was introduced with Objective-C 2.0 and includes a number
+ of new features. The programming interface for the legacy version of the runtime
+ is described in Objective-C 1 Runtime Reference; the programming interface
+ for the modern version of the runtime is described in Objective-C 2.0 Runtime
+ Reference.
+
+ The most notable new feature is that instance variables in the modern runtime are “non-fragile”:
+ * In the legacy runtime, if you change the layout of instance variables in a class,
+ you must recompile classes that inherit from it.
+ * In the modern runtime, if you change the layout of instance variables in a class,
+ you do not have to recompile classes that inherit from it.
+
+ In addition, the modern runtime supports instance variable synthesis
+ for declared properties (see Declared Properties in The Objective-C 2.0 Programming Language).
+
+ Platforms
+ ---------
+
+ iPhone applications and 64-bit programs on Mac OS X v10.5 and later use
+ the modern version of the runtime.
+
+ Other programs (32-bit programs on Mac OS X desktop) use the legacy version
+ of the runtime.
+}
+
+type
+ //todo: types MUST BE declared properly as 2.0 opaques
+ SEL = Pointer;
+ IMP = Pointer;
+ id = Pointer; //??
+ size_t = LongWord;
+ _Class = Pointer;
+ Ivar = Pointer;
+ PProtocol = Pointer;
+ PArrayPProtocol = Pointer;
+ BOOL = Boolean;
+ PIvar = Pointer;
+ Method = Pointer;
+ PMethod = Pointer;
+ Protocol = Pointer;
+ objc_property_t = Pointer;
+ Pobjc_property_t = Pointer;
+ uint8_t = byte;
+ Pobjc_method_description = Pointer;
+ ptrdiff_t = Pointer;
+ objc_method_description = Pointer;
+ TMutationHandlerProc = Pointer;
+
+ pobjc_super = ^objc_super;
+ objc_super = packed record
+ reciever : id;
+ class_ : _class;
+ end;
+
+var
+ sel_getName : function (sel: SEL): PChar; cdecl = nil;
+ sel_registerName : function (str: PChar): SEL; cdecl = nil;
+ object_getClassName : function (obj: id): PChar; cdecl = nil;
+ object_getIndexedIvars : function (obj: id ): Pointer; cdecl = nil;
+
+ sel_isMapped: function (sel: SEL): Boolean; cdecl = nil;
+ sel_getUid: function (const str: PChar): SEL; cdecl = nil;
+
+ object_copy : function (obj:id; size:size_t):id; cdecl = nil;
+ object_dispose : function (obj:id):id; cdecl = nil;
+
+ object_getClass : function (obj:id): _Class; cdecl = nil;
+ object_setClass : function (obj:id; cls: _Class):_Class; cdecl = nil;
+
+ object_getIvar : function (obj:id; ivar:Ivar):id; cdecl = nil;
+ object_setIvar : procedure (obj:id; ivar:Ivar; value:id); cdecl = nil;
+
+ object_setInstanceVariable : function (obj:id; name:pchar; value:pointer):Ivar; cdecl = nil;
+ object_getInstanceVariable : function (obj:id; name:pchar; var outValue: Pointer):Ivar; cdecl = nil;
+
+ objc_getClass : function (name:pchar):id; cdecl = nil;
+ objc_getMetaClass : function (name:pchar):id; cdecl = nil;
+ objc_lookUpClass : function (name:pchar):id; cdecl = nil;
+ objc_getRequiredClass : function (name:pchar):id; cdecl = nil;
+ objc_getFutureClass : function (name:pchar):_Class; cdecl = nil;
+ objc_setFutureClass : procedure (cls:_Class; name:pchar); cdecl = nil;
+ objc_getClassList : function (buffer:pClass; bufferCount:longint):longint; cdecl = nil;
+
+ objc_getProtocol : function (name:pchar): PProtocol; cdecl = nil;
+ objc_copyProtocolList : function (outCount:pdword):PArrayPProtocol; cdecl = nil;
+
+ class_getName : function (cls:_Class):PChar; cdecl = nil;
+ class_isMetaClass : function (cls:_Class):BOOL; cdecl = nil;
+ class_getSuperclass : function (cls:_Class):_Class; cdecl = nil;
+ class_setSuperclass : function (cls: _Class; newSuper: _Class): _Class; cdecl = nil;
+
+
+ class_getVersion : function (cls:_Class):longint; cdecl = nil;
+ class_setVersion : procedure (cls:_Class; version:longint); cdecl = nil;
+
+ class_getInstanceSize : function (cls:_Class):size_t; cdecl = nil;
+
+ class_getInstanceVariable : function (cls:_Class; name:pchar):Ivar; cdecl = nil;
+ class_getClassVariable : function (cls:_Class; name:pchar):Ivar; cdecl = nil;
+ class_copyIvarList : function (cls:_Class; outCount:pdword):PIvar; cdecl = nil;
+
+ class_getInstanceMethod : function (cls:_Class; name:SEL):Method; cdecl = nil;
+ class_getClassMethod : function (cls:_Class; name:SEL):Method; cdecl = nil;
+ class_getMethodImplementation : function (cls:_Class; name:SEL):IMP; cdecl = nil;
+ class_getMethodImplementation_stret : function (cls:_Class; name:SEL):IMP; cdecl = nil;
+ class_respondsToSelector : function (cls:_Class; sel:SEL):BOOL; cdecl = nil;
+ class_copyMethodList : function (cls:_Class; outCount:pdword):PMethod; cdecl = nil;
+
+ class_conformsToProtocol : function (cls:_Class; var protocol: Protocol):BOOL; cdecl = nil;
+ class_copyProtocolList : function (cls:_Class; var outCount: dword):PArrayPProtocol; cdecl = nil;
+
+ class_getProperty : function (cls:_Class; name: pchar): objc_property_t; cdecl = nil;
+ class_copyPropertyList : function (cls:_Class; var Count:dword):Pobjc_property_t; cdecl = nil;
+
+ class_getIvarLayout : function (cls:_Class):Pchar; cdecl = nil;
+ class_getWeakIvarLayout : function (cls:_Class):Pchar; cdecl = nil;
+
+ class_createInstance : function (cls:_Class; extraBytes:size_t):id; cdecl = nil;
+
+ objc_allocateClassPair : function (superclass:_Class; name:pchar; extraBytes:size_t):_Class; cdecl = nil;
+ objc_registerClassPair : procedure (cls:_Class); cdecl = nil;
+ objc_duplicateClass : function (original:_Class; name:pchar; extraBytes:size_t):_Class; cdecl = nil;
+ objc_disposeClassPair : procedure (cls:_Class); cdecl = nil;
+
+ class_addMethod : function (cls:_Class; name:SEL; imp:IMP; types:pchar):BOOL; cdecl = nil;
+ class_replaceMethod : function (cls:_Class; name:SEL; imp:IMP; types:pchar):IMP; cdecl = nil;
+ class_addIvar: function (cls:_Class; name:pchar; size:size_t; alignment:uint8_t; types:pchar):BOOL; cdecl = nil;
+ class_addProtocol : function (cls:_Class; protocol:pProtocol):BOOL; cdecl = nil;
+ class_setIvarLayout : procedure (cls:_Class; layout:pchar); cdecl = nil;
+ class_setWeakIvarLayout : procedure (cls:_Class; layout:pchar); cdecl = nil;
+
+ method_getName : function (m:Method):SEL; cdecl = nil;
+ method_getImplementation : function (m:Method):IMP; cdecl = nil;
+ method_getTypeEncoding : function (m:Method):Pchar; cdecl = nil;
+
+ method_getNumberOfArguments : function (m:Method):dword; cdecl = nil;
+ method_copyReturnType : function (m:Method):Pchar; cdecl = nil;
+ method_copyArgumentType : function (m:Method; index:dword):Pchar; cdecl = nil;
+ method_getReturnType : procedure (m:Method; dst:pchar; dst_len:size_t); cdecl = nil;
+ method_getArgumentType : procedure (m:Method; index:dword; dst:pchar; dst_len:size_t); cdecl = nil;
+ method_getDescription : function (m: Method) : Pobjc_method_description; cdecl = nil;
+
+ method_setImplementation: function (m:Method; imp:IMP):IMP; cdecl = nil;
+ method_exchangeImplementations : procedure (m1:Method; m2:Method); cdecl = nil;
+
+ ivar_getName : function (v:Ivar):Pchar; cdecl = nil;
+ ivar_getTypeEncoding : function (v:Ivar):Pchar; cdecl = nil;
+ ivar_getOffset : function (v:Ivar):ptrdiff_t; cdecl = nil;
+
+ property_getName :function (_property:objc_property_t):Pchar; cdecl = nil;
+ property_getAttributes : function (_property:objc_property_t):Pchar; cdecl = nil;
+
+
+ protocol_conformsToProtocol : function (proto:pProtocol; other:pProtocol):BOOL; cdecl = nil;
+ protocol_isEqual : function (proto:pProtocol; other:pProtocol):BOOL; cdecl = nil;
+ protocol_getMethodDescription : function (p: PProtocol; aSel: SEL; isRequiredMethod, isInstanceMethod: BOOL): objc_method_description; cdecl = nil;
+ protocol_copyMethodDescriptionList : function (p: PProtocol; isRequiredMethod, isInstanceMethod: BOOL ; var outCount: LongWord): Pobjc_method_description; cdecl = nil;
+ protocol_getProperty : function (proto:PProtocol; name:pchar; isRequiredProperty:BOOL; isInstanceProperty:BOOL):objc_property_t; cdecl = nil;
+ protocol_copyPropertyList : function (proto:PProtocol; outCount:pdword):Pobjc_property_t; cdecl = nil;
+ protocol_copyProtocolList : function (proto:PProtocol; outCount:pdword):PArrayPProtocol; cdecl = nil;
+
+ objc_copyImageNames : function (var outCount:dword): PPchar; cdecl = nil;
+ class_getImageName : function (cls:_Class):Pchar; cdecl = nil;
+ objc_copyClassNamesForImage : function (image:pchar; var outCount: Dword):PPchar; cdecl = nil;
+
+ sel_isEqual : function (lhs:SEL; rhs:SEL):BOOL; cdecl = nil;
+ objc_enumerationMutation : procedure (_para1:id); cdecl = nil;
+ objc_setEnumerationMutationHandler : procedure (handler:TMutationHandlerProc); cdecl = nil;
+ objc_setForwardHandler: procedure (fwd:pointer; fwd_stret:pointer); cdecl = nil;
+
+ {$WARNINGS OFF} // warning: cdecl'ared funtions have no high parameter
+ objc_msgSend : function (self: id; op: SEL; param3: array of const): id; cdecl = nil;
+ objc_msgSendSuper : function (super: pobjc_super; op: SEL; param3: array of const): id; cdecl = nil;
+ objc_msgSend_stret : procedure (stret: Pointer; self: id; op: SEL; param3: array of const); cdecl= nil;
+ objc_msgSend_stretreg : function (self: id; op: SEL; param3: array of const): id; cdecl= nil;
+ objc_msgSendSuper_stret : procedure (stret: Pointer; super: pobjc_super; op: SEL; param3: array of const); cdecl = nil;
+ objc_msgSend_fpret : function (self: id; op: SEL; param3: array of const): double; cdecl = nil;
+ {$WARNINGS ON}
+
+ method_invoke : function (receiver: id; m: Method {, ...}): id= nil;
+ method_invoke_stret : procedure (receiver: id; m: Method{ , ...})= nil;
+ objc_collect : procedure (options: LongWord); cdecl= nil;
+ objc_collectingEnabled : function : BOOL; cdecl= nil;
+
+const
+ _C_ID = '@';
+ _C_CLASS = '#';
+ _C_SEL = ':';
+ _C_CHR = 'c';
+ _C_UCHR = 'C';
+ _C_SHT = 's';
+ _C_USHT = 'S';
+ _C_INT = 'i';
+ _C_UINT = 'I';
+ _C_LNG = 'l';
+ _C_ULNG = 'L';
+ _C_FLT = 'f';
+ _C_DBL = 'd';
+ _C_BFLD = 'b';
+ _C_VOID = 'v';
+ _C_UNDEF = '?';
+ _C_PTR = '^';
+ _C_CHARPTR = '*';
+ _C_ARY_B = '[';
+ _C_ARY_E = ']';
+ _C_UNION_B = '(';
+ _C_UNION_E = ')';
+ _C_STRUCT_B = '{';
+ _C_STRUCT_E = '}';
+ _C_PASOBJ = _C_PTR + _C_VOID;
+ _C_SELF_AND_SEL = '@:';
+
+// objc-exception.h
+
+// compiler reserves a setjmp buffer + 4 words as localExceptionData
+
+type
+ Tobjc_exception_throw = procedure (exception: id); cdecl;
+ Tobjc_exception_try_enter = procedure (localExceptionData: Pointer); cdecl;
+ Tobjc_exception_try_exit = procedure (localExceptionData: Pointer); cdecl;
+ Tobjc_exception_extract = function (localExceptionData: Pointer): id; cdecl;
+ Tobjc_exception_match = function (exceptionClass:_Class; exception:id ): Integer; cdecl;
+
+var
+ objc_exception_throw : Tobjc_exception_throw = nil;
+ objc_exception_try_enter : Tobjc_exception_try_enter = nil;
+ objc_exception_try_exit : Tobjc_exception_try_exit = nil;
+ objc_exception_extract : Tobjc_exception_extract = nil;
+ objc_exception_match : Tobjc_exception_match = nil;
+
+type
+ pobjc_exception_functions_t = ^objc_exception_functions_t;
+ objc_exception_functions_t = packed record
+ version : Integer;
+ throw_exc : Tobjc_exception_throw; // version 0
+ try_enter : Tobjc_exception_try_enter; // version 0
+ try_exit : Tobjc_exception_try_exit; // version 0
+ extract : Tobjc_exception_extract; // version 0
+ match : Tobjc_exception_match; // version 0
+ end;
+
+// get table; version tells how many
+var
+ objc_exception_get_functions : procedure (var table: objc_exception_functions_t); cdecl = nil;
+ objc_exception_set_functions : procedure (table: pobjc_exception_functions_t); cdecl = nil;
+
+
+// __LP64__ // 64-bit only functions
+{
+typedef id (*objc_exception_preprocessor)(id exception);
+typedef int (*objc_exception_matcher)(Class catch_type, id exception);
+typedef void (*objc_uncaught_exception_handler)(id exception);
+typedef void (*objc_exception_handler)(id unused, void *context);
+
+OBJC_EXPORT void objc_exception_throw(id exception);
+OBJC_EXPORT void objc_exception_rethrow(void);
+OBJC_EXPORT id objc_begin_catch(void *exc_buf);
+OBJC_EXPORT void objc_end_catch(void);
+
+OBJC_EXPORT uintptr_t objc_addExceptionHandler(objc_exception_handler fn, void *context);
+OBJC_EXPORT void objc_removeExceptionHandler(uintptr_t token);
+
+OBJC_EXPORT objc_exception_preprocessor objc_setExceptionPreprocessor(objc_exception_preprocessor fn);
+OBJC_EXPORT objc_exception_matcher objc_setExceptionMatcher(objc_exception_matcher fn);
+OBJC_EXPORT objc_uncaught_exception_handler objc_setUncaughtExceptionHandler(objc_uncaught_exception_handler fn);
+}
+
+
+
+// objc-sync.h
+
+var
+ // Begin synchronizing on 'obj'.
+ // Allocates recursive pthread_mutex associated with 'obj' if needed.
+ // Returns OBJC_SYNC_SUCCESS once lock is acquired.
+ objc_sync_enter: function (obj: id): Integer; cdecl = nil;
+ // End synchronizing on 'obj'.
+ // Returns OBJC_SYNC_SUCCESS or OBJC_SYNC_NOT_OWNING_THREAD_ERROR
+ objc_sync_exit : function (obj: id) : Integer; cdecl = nil;
+ // Temporarily release lock on 'obj' and wait for another thread to notify on 'obj'
+ // Return OBJC_SYNC_SUCCESS, OBJC_SYNC_NOT_OWNING_THREAD_ERROR, OBJC_SYNC_TIMED_OUT
+ objc_sync_wait : function (obj: id; milliSecondsMaxWait: Int64): Integer; cdecl = nil;
+ // Wake up another thread waiting on 'obj'
+ // Return OBJC_SYNC_SUCCESS, OBJC_SYNC_NOT_OWNING_THREAD_ERROR
+ objc_sync_notify : function (obj: id): Integer; cdecl = nil;
+ // Wake up all threads waiting on 'obj'
+ // Return OBJC_SYNC_SUCCESS, OBJC_SYNC_NOT_OWNING_THREAD_ERROR
+ objc_sync_notifyAll : function (obj: id): Integer; cdecl = nil;
+
+const
+ OBJC_SYNC_SUCCESS = 0;
+ OBJC_SYNC_NOT_OWNING_THREAD_ERROR = -1;
+ OBJC_SYNC_TIMED_OUT = -2;
+ OBJC_SYNC_NOT_INITIALIZED = -3;
+
+// since exception handling does not change from version to version
+// it's nice to make a common RTL loading function for exception functions.
+// this proc, MUST BE called by run-time initialization proc!
+function LoadDefaultObjCExepction(hnd: TLibHandle): Boolean;
+function LoadDefaultObjCSync(hnd: TLibHandle): Boolean;
+function LoadDefaultObjCMessaging(hnd: TLibHandle): Boolean;
+
+implementation
+
+function LoadDefaultObjCExepction(hnd: TLibHandle): Boolean;
+begin
+ Result := hnd <> 0;
+ if not Result then Exit;
+
+ objc_exception_throw := Tobjc_exception_throw(GetProcedureAddress(hnd, 'objc_exception_throw'));
+ objc_exception_try_enter := Tobjc_exception_try_enter(GetProcedureAddress(hnd, 'objc_exception_try_enter'));
+ objc_exception_try_exit := Tobjc_exception_try_exit(GetProcedureAddress(hnd, 'objc_exception_try_exit'));
+ objc_exception_extract := Tobjc_exception_extract(GetProcedureAddress(hnd, 'objc_exception_extract'));
+ objc_exception_match := Tobjc_exception_match(GetProcedureAddress(hnd, 'objc_exception_match'));
+end;
+
+function LoadDefaultObjCSync(hnd: TLibHandle): Boolean;
+begin
+ Result := hnd <> 0;
+ if not Result then Exit;
+ Pointer(objc_sync_enter) := GetProcedureAddress(hnd, 'objc_sync_enter');
+ Pointer(objc_sync_exit) := GetProcedureAddress(hnd, 'objc_sync_exit');
+ Pointer(objc_sync_wait) := GetProcedureAddress(hnd, 'objc_sync_wait');
+ Pointer(objc_sync_notify) := GetProcedureAddress(hnd, 'objc_sync_notify');
+ Pointer(objc_sync_notifyAll) := GetProcedureAddress(hnd, 'objc_sync_notifyAll');
+end;
+
+function LoadDefaultObjCMessaging(hnd: TLibHandle): Boolean;
+begin
+ Pointer(objc_msgSend) := GetProcedureAddress(hnd, 'objc_msgSend');
+ Pointer(objc_msgSendSuper) := GetProcedureAddress(hnd, 'objc_msgSendSuper');
+ Pointer(objc_msgSend_stret) := GetProcedureAddress(hnd, 'objc_msgSend_stret');
+ Pointer(objc_msgSendSuper_stret) := GetProcedureAddress(hnd, 'objc_msgSendSuper_stret');
+
+ {$ifndef CPUPOWERPC} // arm also uses objc_msgSend_fpret?
+ Pointer(objc_msgSend_fpret) := GetProcedureAddress(hnd, 'objc_msgSend_fpret');
+ Pointer(objc_msgSend_stretreg) := GetProcedureAddress(hnd, 'objc_msgSend');
+ {$else}
+ Pointer(objc_msgSend_fpret) := GetProcedureAddress(hnd, 'objc_msgSend');
+ Pointer(objc_msgSend_stretreg) := GetProcedureAddress(hnd, 'objc_msgSend_stret');
+ {$endif}
+ Result := true;
+end;
+
+initialization
+
+end.
+
diff --git a/packages/objcrtl/src/objcrtl10.pas b/packages/objcrtl/src/objcrtl10.pas
new file mode 100755
index 0000000000..fecc680852
--- /dev/null
+++ b/packages/objcrtl/src/objcrtl10.pas
@@ -0,0 +1,833 @@
+{
+ objcrtl10.pas
+
+ Copyright (C) 2009 Dmitry Boyarintsev
+
+ This unit is implementation for dynamic Objective-C Run-time Library based on run-time version 1.0
+ headers included with XCode 3.1.2
+ The original copyright note of is kept on each include file
+}
+
+{.$DEFINE DEBUG}
+
+unit objcrtl10;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ ctypes, objcrtl, dynlibs;
+
+{
+ Mac OS X Version 10.5 Delta
+ ---------------------------
+
+ The low-level Objective-C runtime API is significantly updated
+ in Mac OS X version 10.5. Many functions and all existing data structures
+ are replaced with new functions. This document describes the differences
+ between the 10.5 version and previous versions.
+
+ http://developer.apple.com/documentation/Cocoa/Reference/ObjCRuntimeRef/Articles/ocr10_5delta.html#//apple_ref/doc/uid/TP40002981-TPXREF101
+}
+
+function InitializeObjCRtl10(const ObjCLibName: AnsiString): Boolean;
+
+implementation
+
+{$HINTS OFF} {.Parameter not used.}
+
+function ObjCAllocMem(size: Integer): Pointer;
+begin
+ //todo: store the mem pointers
+ // and release them at finalization section
+ // this must be thread safe, so allocating additional NsObject
+ // that can be used with objc_sync is recommended
+ Result := AllocMem(size);
+end;
+
+procedure ObjCFreeMem(p: Pointer);
+begin
+ //todo:
+ Freemem(p);
+end;
+
+
+function allocstr(const src: String): Pchar;
+begin
+ Result := ObjCAllocMem(length(src)+1);
+ if src <> '' then System.Move(src[1], Result^, length(src));
+end;
+
+
+const
+ CLS_CLASS = $1;
+ CLS_META = $2;
+ // CLS_INITIALIZED = $4;
+ // CLS_POSING = $8;
+ // CLS_MAPPED = $10;
+ // CLS_FLUSH_CACHE = $20;
+ // CLS_GROW_CACHE = $40;
+ // CLS_NEED_BIND = $80;
+ // CLS_METHOD_ARRAY = $100;
+ // the JavaBridge constructs classes with these markers
+ // CLS_JAVA_HYBRID = $200;
+ // CLS_JAVA_CLASS = $400;
+ // thread-safe +initialize
+ // CLS_INITIALIZING = $800;
+ // bundle unloading
+ // CLS_FROM_BUNDLE = $1000;
+ // C++ ivar support
+ // CLS_HAS_CXX_STRUCTORS = $2000;
+ // Lazy method list arrays
+ // CLS_NO_METHOD_ARRAY = $4000;//L
+ // +load implementation
+ // CLS_HAS_LOAD_METHOD = $8000;
+
+
+// all obj-c types are postfixed with 1, to avoid type name confilcts
+
+type
+ // P_Class = ^_Class;
+
+ Pobjc_class1 = ^objc_class1;
+
+ _Class1 = Pobjc_class1; // can be casted to _Class directly
+
+ Pobjc_object1 = ^objc_object1;
+
+ objc_object1 = record
+ isa: _Class1;
+ end;
+
+ Pid1 = ^id;
+ // id1 = Pobjc_object1;
+
+ Pobjc_selector1 = Pointer;
+
+ // PSEL1 = ^SEL1;
+
+ SEL1 = Pobjc_selector1;
+
+ {$WARNINGS OFF}
+
+ IMP1 = function (param1: id; param2: SEL; param3: array of const): id; cdecl;
+
+ Pobjc_ivar_list1 = ^objc_ivar_list1;
+ {$WARNINGS ON}
+
+ Pobjc_method_list1 = ^objc_method_list1;
+ PPobjc_method_list1 = ^Pobjc_method_list1;
+
+ Pobjc_cache1 = ^objc_cache1;
+
+ Pobjc_protocol_list1 = ^objc_protocol_list1;
+
+ objc_class1 = packed record
+ isa : Pobjc_class1;
+ super_class : Pobjc_class1;
+ name : PChar;
+ version : culong;
+ info : culong;
+ instance_size : culong;
+ ivars : Pobjc_ivar_list1;
+ methodLists : PPobjc_method_list1;
+ cache : Pobjc_cache1;
+ protocols : Pobjc_protocol_list1;
+ end;
+
+
+ {* Category Template}
+ //Pobjc_category1 = ^objc_category1;
+
+ //Category1 = Pobjc_category1;
+
+ //objc_category1 = packed record
+ // category_name : PChar;
+ // class_name : PChar;
+ // instance_methods : Pobjc_method_list1;
+ // class_methods : Pobjc_method_list1;
+ // protocols : Pobjc_protocol_list1;
+ //end;
+
+ {* Instance Variable Template}
+ Pobjc_ivar1 = ^objc_ivar1;
+
+ Ivar1 = Pobjc_ivar1;
+
+ objc_ivar1 = packed record
+ ivar_name : PChar;
+ ivar_type : PChar;
+ ivar_offset : cint;
+ {$ifdef __alpha__}
+ space: cint;
+ {$endif}
+ end;
+
+ objc_ivar_list1 = packed record
+ ivar_count: cint;
+ {$ifdef __alpha__}
+ space: cint;
+ {$endif}
+ ivar_list: array[0..0] of objc_ivar1; { variable length structure }
+ end;
+
+ {* Method Template }
+ Pobjc_method1 = ^objc_method1;
+ Method1 = Pobjc_method1;
+
+ objc_method1 = packed record
+ method_name : SEL1;
+ method_types : PChar;
+ method_imp : IMP1;
+ end;
+
+ objc_method_list1 = packed record
+ obsolete : Pobjc_method_list1;
+ method_count : cint;
+ {$ifdef __alpha__}
+ space: cint;
+ {$endif}
+ method_list1 : array[0..0] of objc_method1; { variable length structure }
+ end;
+
+ { Protocol support }
+
+ Protocol1 = objc_object1;
+
+ objc_protocol_list1 = record
+ next : Pobjc_protocol_list1;
+ count : cint;
+ list : array[0..0] of Protocol1;
+ end;
+
+ { Constants here moved down }
+
+ { Structure for method cache - allocated/sized at runtime }
+
+// Cache1 = Pobjc_cache1;
+
+ objc_cache1 = record
+ mask : cuint; { total = mask + 1 }
+ occupied : cuint;
+ buckets : array[0..0] of Method1;
+ end;
+
+// objective-c 1.0 runtime functions. They are obsolete, for 2.0
+// and no longer available as interface functions
+// these functions are used by wrapper-functions !
+
+var
+ objc_addClass : procedure (myClass: _Class); cdecl = nil;
+ //class_addMethods : procedure (myClass: _Class1; methodList : Pobjc_method_list1); cdecl;
+
+type
+
+ { TClassMethod1Reg }
+
+ TClassMethod1Reg = class(TObject)
+ private
+ methods : array of objc_method1;
+ count : Integer;
+ public
+ procedure AddMethod(name:SEL; imp:IMP; types:pchar);
+ function AllocMethodList: Pobjc_method_list1;
+ end;
+ //PClassMethod1Reg = ^TClassMethod1Reg;
+
+ TIVar1Reg = record
+ size : Integer;
+ types : String;
+ name : String;
+ alignment : Uint8_t;
+ end;
+
+ { TClassIVar1Reg }
+
+ TClassIVar1Reg = class(TObject)
+ private
+ ivarscount : Integer;
+ ivars : array of TIVar1Reg;
+ public
+ procedure AddIVar(name:pchar; size:size_t; alignment:uint8_t; types:pchar);
+ function AllocIVarsList(ivarOffset: Integer; out ivarssize: Integer): Pobjc_ivar_list1;
+ end;
+
+{ TClassMethod1Reg }
+
+procedure TClassMethod1Reg.AddMethod(name: SEL; imp: IMP; types: pchar);
+begin
+ if length(methods) = count then begin
+ if count = 0 then SetLength(methods, 4)
+ else begin
+ SetLength(methods, count * 2);
+ end;
+ end;
+ methods[count].method_imp := IMP1(imp);
+ methods[count].method_types := allocstr(types);
+ methods[count].method_name := name;
+ inc(count);
+end;
+
+function TClassMethod1Reg.AllocMethodList: Pobjc_method_list1;
+var
+ i : Integer;
+begin
+ if count = 0 then Result := nil
+ else begin
+ Result := ObjCAllocMem( sizeof(objc_method_list1) + (count-1)*sizeof(objc_method1) );
+ Pobjc_method_list1(Result)^.method_count := count;
+ for i := 0 to count - 1 do begin
+ Pobjc_method_list1(Result)^.method_list1[i].method_name := methods[i].method_name;
+ Pobjc_method_list1(Result)^.method_list1[i].method_types := methods[i].method_types;
+ Pobjc_method_list1(Result)^.method_list1[i].method_imp := methods[i].method_imp;
+ end;
+ end;
+end;
+
+procedure TClassIVar1Reg.AddIVar(name: pchar; size: size_t; alignment: uint8_t;
+ types: pchar);
+begin
+ if ivarscount = length(ivars) then begin
+ if ivarscount = 0 then SetLength(ivars, 4)
+ else setLength(ivars, ivarscount * 2);
+ end;
+ ivars[ivarscount].name := name;
+ ivars[ivarscount].size := size;
+ ivars[ivarscount].types := types;
+ ivars[ivarscount].alignment := alignment;
+ inc(ivarscount);
+end;
+
+function TClassIVar1Reg.AllocIVarsList(ivarOffset: Integer; out ivarssize: Integer): Pobjc_ivar_list1;
+var
+ i : Integer;
+begin
+ if ivarscount = 0 then begin
+ Result := nil;
+ ivarssize := 0;
+ end else begin
+ ivarssize := 0;
+ Result := ObjCAllocMem( sizeof(objc_ivar_list1) + (ivarscount-1)*sizeof(objc_ivar1) );
+ Result^.ivar_count := ivarscount;
+ for i := 0 to ivarscount - 1 do begin
+ Result^.ivar_list[i].ivar_name := allocstr(ivars[i].name);
+ Result^.ivar_list[i].ivar_offset := ivarOffset + ivarssize;
+ Result^.ivar_list[i].ivar_type := allocstr(ivars[i].types);
+ inc(ivarssize, ivars[i].size);
+ end;
+ end;
+end;
+
+function object_getClass10(obj:id): _Class; cdecl;
+begin
+ if obj = nil then Result := nil
+ else begin
+ Result := _Class(Pobjc_object1(obj)^.isa);
+ end;
+end;
+
+function object_setClass10(obj:id; cls: _Class): _Class; cdecl;
+begin
+ // can this be done in that way?
+ Result := _Class(Pobjc_object1(obj)^.isa);
+ Pobjc_object1(obj)^.isa := _Class1(cls);
+end;
+
+function object_getIvar10(obj:id; _ivar:Ivar):id; cdecl;
+begin
+ Result := nil;
+ if not Assigned(obj) or not Assigned(_ivar) then Exit;
+ Result := Pid1(PtrUInt(obj) + ivar_getOffset(_ivar))^;
+end;
+
+procedure object_setIvar10(obj:id; _ivar:Ivar; value:id); cdecl;
+begin
+ if not Assigned(obj) or not Assigned(_ivar) then Exit;
+ Pid1(PtrUInt(obj) + ivar_getOffset(_ivar))^ := value;
+end;
+
+function class_getName10(cls:_Class):PChar; cdecl;
+begin
+ Result := _Class1(cls)^.name;
+end;
+
+function class_getSuperclass10(cls:_Class):_Class; cdecl;
+begin
+ Result := _Class1(cls)^.super_class;
+end;
+
+function class_isMetaClass10(cls:_Class):BOOL; cdecl;
+begin
+ Result := Assigned(cls) and (_Class1(cls)^.Info = CLS_META);
+end;
+
+function class_copyMethodList10(cls:_Class; outCount: pdword):PMethod; cdecl;
+begin
+ //todo:
+ Result := nil; //todo: ??
+end;
+
+function class_getMethodImplementation10(cls:_Class; name:SEL):IMP; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function class_respondsToSelector10(cls:_Class; sel:SEL):BOOL; cdecl;
+begin
+ //todo:
+ Result := false;
+end;
+
+function class_conformsToProtocol10(cls:_Class; var protocol: Protocol):BOOL; cdecl;
+begin
+ //todo:
+ Result := false;
+end;
+
+function class_copyProtocolList10(cls:_Class; var outCount: dword):PArrayPProtocol; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function class_copyIvarList10(cls:_Class; outCount:pdword):PIvar; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function class_getMethodImplementation_stret10(cls:_Class; name:SEL):IMP; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function objc_allocateClassPair10(superclass:_Class; name:pchar; extraBytes:size_t):_Class; cdecl;
+var
+ super : _Class1;
+ root_class : _Class1;
+
+ new_class : _Class1;
+ meta_class : _Class1;
+ namelen : Integer;
+begin
+ Result := nil;
+ if (superclass = nil) or (_Class1(objc_lookUpClass(name)) <> nil) then begin
+ {$ifdef DEBUG}
+ if not Assigned(superclass) then
+ writeln('no super class!')
+ else begin
+ if Assigned(objc_lookUpClass(name)) then
+ writeln('the class ', name, ' already exists')
+ else
+ writeln('this situation is impossible!');
+ end;
+ {$endif}
+ Exit;
+ end;
+ super := _Class1(superclass);
+
+ // Find the root class
+ root_class := super;
+ while root_class^.super_class <> nil do
+ root_class := root_class^.super_class;
+
+ // Allocate space for the class and its metaclass
+ new_class := ObjCAllocMem(2 * SizeOf(objc_class1));
+ meta_class := @new_class[1];
+
+ // setup class
+ new_class^.isa := meta_class;
+ new_class^.info := CLS_CLASS;
+ meta_class^.info := CLS_META;
+
+ // Create a copy of the class name.
+ // For efficiency, we have the metaclass and the class itself
+ // to share this copy of the name, but this is not a requirement
+ // imposed by the runtime.
+ namelen := strlen(name);
+ new_class^.name := ObjCAllocMem(namelen + 1);
+ Move(name^, new_class^.name^, namelen);
+ meta_class^.name := new_class^.name;
+
+ // Allocate empty method lists.
+ // We can add methods later.
+ new_class^.methodLists := Pointer(TClassMethod1Reg.Create); // PPObjc_method_list1(AllocMethodReg); //AllocMem ( SizeOf(TClassMethod1Reg)) ;// SizeOf(Pobjc_method_list1));
+ meta_class^.methodLists := Pointer(TClassMethod1Reg.Create); //PPObjc_method_list1(AllocMethodReg);
+
+ // Connect the class definition to the class hierarchy:
+ // Connect the class to the superclass.
+ // Connect the metaclass to the metaclass of the superclass.
+ // Connect the metaclass of the metaclass to the metaclass of the root class.
+ new_class^.super_class := super;
+ meta_class^.super_class := super^.isa;
+ meta_class^.isa := Pointer(root_class^.isa);
+
+ // Set the sizes of the class and the metaclass.
+ new_class^.instance_size := super^.instance_size;
+ meta_class^.instance_size := meta_class^.super_class^.instance_size;
+ new_class^.ivars := Pointer(TClassIVar1Reg.Create);
+
+ Result := new_class;
+end;
+
+procedure objc_registerClassPair10(aClass:_Class); cdecl;
+var
+ meta_class : _Class1;
+ new_class : _Class1;
+
+ MethodReg : TClassMethod1Reg;
+
+ iVarReg : TClassIVar1Reg;
+ ivarslist : Pobjc_ivar_list1;
+ sz : Integer;
+
+ procedure RegisterMethodList(reg: TClassMethod1Reg; cls1: _Class1);
+ var
+ mtdlist : Pobjc_method_list1;
+ begin
+ if not Assigned(reg) then Exit;
+ cls1^.methodLists := ObjCAllocMem(sizeof(Pobjc_method_list1));
+ mtdList := reg.AllocMethodList;
+ if not Assigned(mtdlist)
+ then cls1^.methodLists^ := Pointer(-1)
+ else cls1^.methodLists^ := mtdlist;
+ end;
+
+begin
+ new_class := _Class1(aClass);
+ meta_class := _Class1(new_Class)^.isa;
+ // Finally, register the class with the runtime.
+
+ MethodReg := TClassMethod1Reg(new_class^.methodLists);
+ RegisterMethodList(MethodReg, new_class);
+ MethodReg.Free;
+
+ MethodReg := TClassMethod1Reg(meta_class^.methodLists);
+ RegisterMethodList(MethodReg, meta_class);
+ MethodReg.Free;
+
+ iVarReg := TClassIVar1Reg(new_class^.ivars);
+ ivarslist := iVarReg.AllocIVarsList(new_class^.instance_size, sz);
+ new_class^.ivars := ivarslist;
+ inc(new_class^.instance_size, sz);
+ iVarReg.Free;
+
+
+ if new_class <> nil then objc_addClass(new_class);
+end;
+
+function objc_duplicateClass10(original:_Class; name:pchar; extraBytes:size_t):_Class; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+procedure objc_disposeClassPair10(cls:_Class); cdecl;
+begin
+ //todo:
+end;
+
+function class_addMethod10(cls:_Class; name:SEL; _imp:IMP; types:pchar):BOOL; cdecl;
+begin
+ if not Assigned(cls) or not Assigned(name) or not Assigned(_imp) or not Assigned(types) then begin
+ {$IFDEF DEBUG}
+ write('* Bad params?: cls = ', Integer(cls));
+ write(' name = ', PChar(name));
+ write(' imp = ', Integer(_imp));
+ writeln(' type = ', types);
+ {$ENDIF}
+ Result := false;
+ Exit;
+ end;
+
+ {$IFDEF DEBUG}
+ write('* method list = ', Integer(_Class1(cls)^.methodLists));
+ if Assigned (TClassMethod1Reg(_Class1(cls)^.methodLists)) then
+ writeln(', ', TClassMethod1Reg(_Class1(cls)^.methodLists).ClassName)
+ else
+ writeln;
+ try
+ {$ENDIF}
+ TClassMethod1Reg(_Class1(cls)^.methodLists).AddMethod(name, _imp, types);
+ {$IFDEF DEBUG}
+ writeln('"',PChar(name), '" added successfully');
+ except
+ writeln('* exception while adding method');
+ end;
+ {$ENDIF}
+ Result := true;
+end;
+
+function class_addIvar10(cls:_Class; name:pchar; size:size_t; alignment:uint8_t; types:pchar):BOOL; cdecl;
+var
+ cls1 : _Class1;
+begin
+ if (alignment <> 1) or (class_isMetaClass10(cls)) then begin
+ Result := false;
+ Exit;
+ end;
+ cls1 := _Class1(cls);
+ TClassIVar1Reg(cls1^.ivars).AddIVar(name, size, alignment, types);
+ Result := true;
+end;
+
+function class_addProtocol10(cls:_Class; protocol:pProtocol):BOOL; cdecl;
+begin
+ //todo:
+ Result := false;
+end;
+
+
+function method_getName10(m:Method):SEL; cdecl;
+begin
+ Result := Method1(m)^.method_name;
+end;
+
+function method_getImplementation10(m:Method):IMP; cdecl;
+begin
+ Result := IMP(Method1(m)^.method_imp);
+end;
+
+function method_getTypeEncoding10(m:Method):Pchar; cdecl;
+begin
+ Result := IMP(Method1(m)^.method_types);
+end;
+
+function method_copyReturnType10(m:Method):Pchar; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function method_copyArgumentType10(m:Method; index:dword):Pchar; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function method_setImplementation10(m:Method; _imp:IMP):IMP; cdecl;
+begin
+ //todo:! ???? check!
+ Result := IMP(Method1(m)^.method_imp);
+ Method1(m)^.method_imp := IMP1(_imp);
+end;
+
+function ivar_getName10(v:Ivar):Pchar; cdecl;
+begin
+ Result := IVar1(v)^.ivar_name;
+end;
+
+function ivar_getTypeEncoding10(v:Ivar):Pchar; cdecl;
+begin
+ Result := IVar1(v)^.ivar_type;
+end;
+
+function ivar_getOffset10(v:Ivar):ptrdiff_t; cdecl;
+begin
+ Result := ptrdiff_t(IVar1(v)^.ivar_offset);
+end;
+
+function sel_isEqual10(lhs:SEL; rhs:SEL):BOOL; cdecl;
+begin
+ Result := lhs = rhs; //???
+end;
+
+function objc_getProtocol10(name:pchar): PProtocol; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function objc_copyProtocolList10(outCount:pdword):PArrayPProtocol; cdecl;
+begin
+ //todo:
+ Result := nil;
+end;
+
+function InitializeObjCRtl10(const ObjCLibName: AnsiString): Boolean;
+var
+ hnd : TLibHandle;
+begin
+ hnd := LoadLibrary(ObjCLibName);
+ Result := hnd <> 0;
+ if not Result then Exit;
+
+ //Exceptions - are unchanged:
+ LoadDefaultObjCExepction(hnd);
+ //Synchronization - unchanged:
+ LoadDefaultObjCSync(hnd);
+
+ // Instances
+
+ // The following functions are unchanged:
+ Pointer(object_dispose) := GetProcedureAddress(hnd, 'object_dispose');
+ Pointer(object_getClassName) := GetProcedureAddress(hnd, 'object_getClassName');
+ Pointer(object_getIndexedIvars) := GetProcedureAddress(hnd, 'object_getIndexedIvars');
+ Pointer(object_setInstanceVariable) := GetProcedureAddress(hnd, 'object_setInstanceVariable');
+ Pointer(object_getInstanceVariable) := GetProcedureAddress(hnd, 'object_getInstanceVariable');
+
+ //The following function is modified:
+ // needs wrapper?
+ // object_copy (The nBytes parameter is changed from unsigned to size_t.)
+ Pointer(object_copy) := GetProcedureAddress(hnd, 'object_copy');
+
+ //The following functions are added:
+ object_getClass := @object_getClass10;
+ object_setClass := @object_setClass10;
+ object_getIvar := @object_getIvar10;
+ object_setIvar := @object_setIVar10;
+
+ // The following functions are deprecated:
+ //object_copyFromZone: deprecated in favor of object_copy
+ //object_realloc
+ //object_reallocFromZone: no substitute
+ //_alloc: no substitute
+ //_copy: no substitute
+ //_realloc: no substitute
+ //_dealloc: no substitute
+ //_zoneAlloc: no substitute
+ //_zoneRealloc: no substitute
+ //_zoneCopy: no substitute
+ //_error: no substitute
+
+ //Class Inspection
+
+ //The following functions are unchanged:
+ Pointer(objc_getClassList) := GetProcedureAddress(hnd, 'objc_getClassList');
+ Pointer(objc_lookUpClass) := GetProcedureAddress(hnd, 'objc_lookUpClass');
+ Pointer(objc_getClass) := GetProcedureAddress(hnd, 'objc_getClass');
+ Pointer(objc_getMetaClass) := GetProcedureAddress(hnd, 'objc_getMetaClass');
+ Pointer(class_getVersion) := GetProcedureAddress(hnd, 'class_getVersion');
+ Pointer(class_getInstanceVariable) := GetProcedureAddress(hnd, 'class_getInstanceVariable');
+ Pointer(class_getInstanceMethod) := GetProcedureAddress(hnd, 'class_getInstanceMethod');
+ Pointer(class_getClassMethod) := GetProcedureAddress(hnd, 'class_getClassMethod');
+
+ // The following function is modified:
+ // needs wrapper?
+ // class_createInstance: idxIvars parameter Changed from unsigned to size_t
+ Pointer(class_createInstance) := GetProcedureAddress(hnd, 'class_createInstance');
+
+ // The following functions are added:
+ class_getName:=@class_getName10;
+ class_getSuperclass:=@class_getSuperclass10;
+ class_isMetaClass:=@class_isMetaClass10;
+ class_copyMethodList:=@class_copyMethodList10;
+ class_getMethodImplementation:=@class_getMethodImplementation10;
+ class_getMethodImplementation_stret:=@class_getMethodImplementation_stret10;
+ class_respondsToSelector:=@class_respondsToSelector10;
+ class_conformsToProtocol:=@class_conformsToProtocol10;
+ class_copyProtocolList:=@class_copyProtocolList10;
+ class_copyIvarList:=@class_copyIvarList10;
+
+ //The following functions are deprecated:
+ //objc_getClasses: deprecated in favor of objc_getClassList
+ //class_createInstanceFromZone: deprecated in favor of class_createInstance
+ //class_nextMethodList: deprecated in favor of new class_copyMethodList
+ //class_lookupMethod: deprecated in favor of class_getMethodImplementation
+ //class_respondsToMethod: deprecated in favor of class_respondsToSelector
+
+ //The following function is used only by ZeroLink:
+ //objc_getRequiredClass
+
+ // Class Manipulation
+
+ //The following function is unchanged:
+ Pointer(class_setVersion) := GetProcedureAddress(hnd, 'class_setVersion');
+
+ //The following functions are added:
+ objc_allocateClassPair := @objc_allocateClassPair10;
+ objc_registerClassPair := @objc_registerClassPair10;
+ objc_duplicateClass := @objc_duplicateClass10;
+ class_addMethod := @class_addMethod10;
+ class_addIvar := @class_addIvar10;
+ class_addProtocol := @class_addProtocol10;
+
+ //The following functions are deprecated:
+ //objc_addClass: deprecated in favor of objc_allocateClassPair and objc_registerClassPair
+ //class_addMethods: deprecated in favor of new class_addMethod
+ //class_removeMethods: deprecated with no substitute
+ //class_poseAs: deprecated in favor of categories and method_setImplementation
+
+
+ //Methods
+
+ //The following function is unchanged:
+ Pointer(method_getNumberOfArguments) := GetProcedureAddress(hnd, 'method_getNumberOfArguments');
+
+ //The following functions are added:
+ method_getName := @method_getName10;
+ method_getImplementation := @method_getImplementation10;
+ method_getTypeEncoding := @method_getTypeEncoding10;
+ method_copyReturnType := @method_copyReturnType10;
+ method_copyArgumentType := @method_copyArgumentType10;
+ method_setImplementation := @method_setImplementation10;
+
+ //The following functions are deprecated:
+ //method_getArgumentInfo
+ //method_getSizeOfArguments
+
+
+ //Instance Variables
+
+ //The following functions are added:
+ ivar_getName := @ivar_getName10;
+ ivar_getTypeEncoding := @ivar_getTypeEncoding10;
+ ivar_getOffset := @ivar_getOffset10;
+
+ //Selectors
+ //The following functions are unchanged:
+ Pointer(sel_getName) := GetProcedureAddress(hnd, 'sel_getName');
+ Pointer(sel_registerName) := GetProcedureAddress(hnd, 'sel_registerName');
+ Pointer(sel_getUid) := GetProcedureAddress(hnd, 'sel_getUid');
+
+ //The following function is added:
+ sel_isEqual := @sel_isEqual10;
+
+ //The following function is deprecated:
+ //sel_isMapped: deprecated with no substitute
+
+
+ //Runtime
+ //The following functions are deprecated favor of dyld:
+ //objc_loadModules
+ //objc_loadModule
+ //objc_unloadModules
+
+ //The following functions are deprecated:
+ //objc_setClassHandler: deprecated with no substitute
+ //objc_setMultithreaded: deprecated with no substitute
+
+ //The following previously undocumented functions are deprecated with no substitute:
+ //objc_getOrigClass, _objc_create_zone, _objc_error, _objc_flush_caches,
+ //_objc_resolve_categories_for_class, _objc_setClassLoader,_ objc_setNilReceiver,
+ //_objc_getNilReceiver,_ objcInit
+
+ //The following undocumented functions are unchanged:
+ //_objc_getFreedObjectClass, instrumentObjcMessageSends, _objc_debug_class_hash
+ //_class_printDuplicateCacheEntries, _class_printMethodCaches, _class_printMethodCacheStatistics
+
+
+ //Messaging
+ LoadDefaultObjCMessaging(hnd);
+
+
+ //The following functions are removed:objc_msgSendv Given an argument list, send a message with a simple return value.
+ //objc_msgSendv_stret Given an argument list, send a message with a data-structure return value.
+ //objc_msgSendv_fpret Given an argument list, send a message with a floating point return value.
+
+ //Protocols
+ //The following functions are added:
+ objc_getProtocol := @objc_getProtocol10;
+ objc_copyProtocolList := @objc_copyProtocolList10;
+
+ // Initializating additional objective-c runtime 1.0 functions
+
+ Pointer(objc_addClass) := GetProcedureAddress(hnd, 'objc_addClass');
+ //Pointer(class_addMethods) := GetProcedureAddress(hnd, 'objc_addMethods');
+
+end;
+
+end.
diff --git a/packages/objcrtl/src/objcrtl20.pas b/packages/objcrtl/src/objcrtl20.pas
new file mode 100755
index 0000000000..edb1ed1805
--- /dev/null
+++ b/packages/objcrtl/src/objcrtl20.pas
@@ -0,0 +1,160 @@
+{
+ objcrtl20.pas
+
+ Copyright (C) 2009 Dmitry Boyarintsev
+
+ This unit is implementation for dynamic Objective-C Run-time Library based on run-time version 2.0
+ headers included with XCode 3.1.2
+ The original copyright note of is kept on each include file
+}
+
+unit objcrtl20;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ objcrtl, dynlibs;
+
+function InitializeObjcRtl20(const ObjCLibName: AnsiString): Boolean;
+
+implementation
+
+function InitializeObjcRtl20(const ObjCLibName: AnsiString): Boolean;
+var
+ hnd : TLibHandle;
+begin
+ hnd := LoadLibrary(ObjCLibName);
+ Result := hnd <> 0;
+ if not Result then Exit;
+
+ LoadDefaultObjCExepction(hnd);
+ LoadDefaultObjCSync(hnd);
+
+ Pointer(sel_getName) := GetProcedureAddress(hnd, 'sel_getName');
+ Pointer(sel_registerName) := GetProcedureAddress(hnd, 'sel_registerName');
+ Pointer(object_getClassName) := GetProcedureAddress(hnd, 'object_getClassName');
+ Pointer(object_getIndexedIvars) := GetProcedureAddress(hnd, 'object_getIndexedIvars');
+
+ Pointer(sel_isMapped) := GetProcedureAddress(hnd, 'sel_isMapped');
+ Pointer(sel_getUid) := GetProcedureAddress(hnd, 'sel_getUid');
+
+ Pointer(object_copy) := GetProcedureAddress(hnd, 'object_copy');
+ Pointer(object_dispose) := GetProcedureAddress(hnd, 'object_dispose');
+
+ Pointer(object_getClass) := GetProcedureAddress(hnd, 'object_getClass');
+ Pointer(object_setClass) := GetProcedureAddress(hnd, 'object_setClass');
+
+ Pointer(object_getIvar) := GetProcedureAddress(hnd, 'object_getIvar');
+ Pointer(object_setIvar) := GetProcedureAddress(hnd, 'object_setIvar');
+
+ Pointer(object_setInstanceVariable) := GetProcedureAddress(hnd, 'object_setInstanceVariable');
+ Pointer(object_getInstanceVariable) := GetProcedureAddress(hnd, 'object_getInstanceVariable');
+
+ Pointer(objc_getClass) := GetProcedureAddress(hnd, 'objc_getClass');
+ Pointer(objc_getMetaClass) := GetProcedureAddress(hnd, 'objc_getMetaClass');
+ Pointer(objc_lookUpClass) := GetProcedureAddress(hnd, 'objc_lookUpClass');
+ Pointer(objc_getRequiredClass) := GetProcedureAddress(hnd, 'objc_getRequiredClass');
+ Pointer(objc_getFutureClass) := GetProcedureAddress(hnd, 'objc_getFutureClass');
+ Pointer(objc_setFutureClass) := GetProcedureAddress(hnd, 'objc_setFutureClass');
+ Pointer(objc_getClassList) := GetProcedureAddress(hnd, 'objc_getClassList');
+
+ Pointer(objc_getProtocol) := GetProcedureAddress(hnd, 'objc_getProtocol');
+ Pointer(objc_copyProtocolList) := GetProcedureAddress(hnd, 'objc_copyProtocolList');
+
+ Pointer(class_getName) := GetProcedureAddress(hnd, 'class_getName');
+ Pointer(class_isMetaClass) := GetProcedureAddress(hnd, 'class_isMetaClass');
+ Pointer(class_getSuperclass) := GetProcedureAddress(hnd, 'class_getSuperclass');
+ Pointer(class_setSuperclass) := GetProcedureAddress(hnd, 'class_setSuperclass');
+
+ Pointer(class_getVersion) := GetProcedureAddress(hnd, 'class_getVersion');
+ Pointer(class_setVersion) := GetProcedureAddress(hnd, 'class_setVersion');
+
+ Pointer(class_getInstanceSize) := GetProcedureAddress(hnd, 'class_getInstanceSize');
+
+ Pointer(class_getInstanceVariable) := GetProcedureAddress(hnd, 'class_getInstanceVariable');
+ Pointer(class_getClassVariable) := GetProcedureAddress(hnd, 'class_getClassVariable');
+ Pointer(class_copyIvarList) := GetProcedureAddress(hnd, 'class_copyIvarList');
+
+ Pointer(class_getInstanceMethod) := GetProcedureAddress(hnd, 'class_getInstanceMethod');
+ Pointer(class_getClassMethod) := GetProcedureAddress(hnd, 'class_getClassMethod');
+ Pointer(class_getMethodImplementation) := GetProcedureAddress(hnd, 'class_getMethodImplementation');
+ Pointer(class_getMethodImplementation_stret) := GetProcedureAddress(hnd, 'class_getMethodImplementation_stret');
+ Pointer(class_respondsToSelector) := GetProcedureAddress(hnd, 'class_respondsToSelector');
+ Pointer(class_copyMethodList) := GetProcedureAddress(hnd, 'class_copyMethodList');
+
+ Pointer(class_conformsToProtocol) := GetProcedureAddress(hnd, 'class_conformsToProtocol');
+ Pointer(class_copyProtocolList) := GetProcedureAddress(hnd, 'class_copyProtocolList');
+
+ Pointer(class_getProperty) := GetProcedureAddress(hnd, 'class_getProperty');
+ Pointer(class_copyPropertyList) := GetProcedureAddress(hnd, 'class_copyPropertyList');
+
+ Pointer(class_getIvarLayout) := GetProcedureAddress(hnd, 'class_getIvarLayout');
+ Pointer(class_getWeakIvarLayout) := GetProcedureAddress(hnd, 'class_getWeakIvarLayout');
+
+ Pointer(class_createInstance) := GetProcedureAddress(hnd, 'class_createInstance');
+
+ Pointer(objc_allocateClassPair) := GetProcedureAddress(hnd, 'objc_allocateClassPair');
+ Pointer(objc_registerClassPair) := GetProcedureAddress(hnd, 'objc_registerClassPair');
+ Pointer(objc_duplicateClass) := GetProcedureAddress(hnd, 'objc_duplicateClass');
+ Pointer(objc_disposeClassPair) := GetProcedureAddress(hnd, 'objc_disposeClassPair');
+
+ Pointer(class_addMethod) := GetProcedureAddress(hnd, 'class_addMethod');
+ Pointer(class_replaceMethod) := GetProcedureAddress(hnd, 'class_replaceMethod');
+ Pointer(class_addIvar) := GetProcedureAddress(hnd, 'class_addIvar');
+ Pointer(class_addProtocol) := GetProcedureAddress(hnd, 'class_addProtocol');
+ Pointer(class_setIvarLayout) := GetProcedureAddress(hnd, 'class_setIvarLayout');
+ Pointer(class_setWeakIvarLayout) := GetProcedureAddress(hnd, 'class_setWeakIvarLayout');
+
+ Pointer(method_getName) := GetProcedureAddress(hnd, 'method_getName');
+ Pointer(method_getImplementation) := GetProcedureAddress(hnd, 'method_getImplementation');
+ Pointer(method_getTypeEncoding) := GetProcedureAddress(hnd, 'method_getTypeEncoding');
+
+ Pointer(method_getNumberOfArguments) := GetProcedureAddress(hnd, 'method_getNumberOfArguments');
+ Pointer(method_copyReturnType) := GetProcedureAddress(hnd, 'method_copyReturnType');
+ Pointer(method_copyArgumentType) := GetProcedureAddress(hnd, 'method_copyArgumentType');
+ Pointer(method_getReturnType) := GetProcedureAddress(hnd, 'method_getReturnType');
+ Pointer(method_getArgumentType) := GetProcedureAddress(hnd, 'method_getArgumentType');
+ Pointer(method_getDescription) := GetProcedureAddress(hnd, 'method_getDescription');
+
+ Pointer(method_setImplementation) := GetProcedureAddress(hnd, 'method_setImplementation');
+ Pointer(method_exchangeImplementations) := GetProcedureAddress(hnd, 'method_exchangeImplementations');
+
+ Pointer(ivar_getName) := GetProcedureAddress(hnd, 'ivar_getName');
+ Pointer(ivar_getTypeEncoding) := GetProcedureAddress(hnd, 'ivar_getTypeEncoding');
+ Pointer(ivar_getOffset) := GetProcedureAddress(hnd, 'ivar_getOffset');
+
+ Pointer(property_getName) := GetProcedureAddress(hnd, 'property_getName');
+ Pointer(property_getAttributes) := GetProcedureAddress(hnd, 'property_getAttributes');
+
+ Pointer(protocol_conformsToProtocol) := GetProcedureAddress(hnd, 'protocol_conformsToProtocol');
+ Pointer(protocol_isEqual) := GetProcedureAddress(hnd, 'protocol_isEqual');
+ Pointer(protocol_getMethodDescription) := GetProcedureAddress(hnd, 'protocol_getMethodDescription');
+ Pointer(protocol_copyMethodDescriptionList) := GetProcedureAddress(hnd, 'protocol_copyMethodDescriptionList');
+ Pointer(protocol_getProperty) := GetProcedureAddress(hnd, 'protocol_getProperty');
+ Pointer(protocol_copyPropertyList) := GetProcedureAddress(hnd, 'protocol_copyPropertyList');
+ Pointer(protocol_copyProtocolList) := GetProcedureAddress(hnd, 'protocol_copyProtocolList');
+
+ Pointer(objc_copyImageNames) := GetProcedureAddress(hnd, 'objc_copyImageNames');
+ Pointer(class_getImageName) := GetProcedureAddress(hnd, 'class_getImageName');
+ Pointer(objc_copyClassNamesForImage) := GetProcedureAddress(hnd, 'objc_copyClassNamesForImage');
+
+ Pointer(sel_isEqual) := GetProcedureAddress(hnd, 'sel_isEqual');
+ Pointer(objc_enumerationMutation) := GetProcedureAddress(hnd, 'objc_enumerationMutation');
+ Pointer(objc_setEnumerationMutationHandler) := GetProcedureAddress(hnd, 'objc_setEnumerationMutationHandler');
+ Pointer(objc_setForwardHandler) := GetProcedureAddress(hnd, 'objc_setForwardHandler');
+
+ //Messaging
+ LoadDefaultObjCMessaging(hnd);
+
+ Pointer(method_invoke) := GetProcedureAddress(hnd, 'method_invoke');
+ Pointer(method_invoke_stret) := GetProcedureAddress(hnd, 'method_invoke_stret');
+ Pointer(objc_collect) := GetProcedureAddress(hnd, 'objc_collect');
+ Pointer(objc_collectingEnabled) := GetProcedureAddress(hnd, 'objc_collectingEnabled');
+
+end;
+
+
+end.
+
diff --git a/packages/objcrtl/src/objcrtliphoneos.pas b/packages/objcrtl/src/objcrtliphoneos.pas
new file mode 100755
index 0000000000..4fecf63c29
--- /dev/null
+++ b/packages/objcrtl/src/objcrtliphoneos.pas
@@ -0,0 +1,26 @@
+{
+ objcrtliPhoneOS.pas
+
+ Copyright (C) 2009 Dmitry Boyarintsev
+
+ This unit is implementation for dynamic Objective-C Run-time Library based on run-time version 2.0
+ headers included with XCode 3.1.2
+ The original copyright note of is kept on each include file
+}
+
+unit objcrtliPhoneOS;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ objcrtl, objcrtl20;
+
+implementation
+
+initialization
+ InitializeObjcRtl20(DefaultObjCLibName);
+
+end.
+
diff --git a/packages/objcrtl/src/objcrtlmacosx.pas b/packages/objcrtl/src/objcrtlmacosx.pas
new file mode 100755
index 0000000000..f970b41899
--- /dev/null
+++ b/packages/objcrtl/src/objcrtlmacosx.pas
@@ -0,0 +1,54 @@
+{
+ objcrtlmacosx.pas
+
+ Copyright (C) 2009 Dmitry Boyarintsev
+
+ This unit is implementation for dynamic Objective-C Run-time Library based on run-time version 2.0
+ headers included with XCode 3.1.2
+ The original copyright note of is kept on each include file
+}
+
+unit objcrtlMacOSX;
+
+{$linkframework CoreServices}
+{$mode macpas}
+
+interface
+
+uses
+ objcrtl, objcrtl10, objcrtl20;
+
+implementation
+
+type
+ SInt16 = Integer;
+ SInt32 = LongInt;
+ UInt32 = Longword;
+ FourCharCode = UInt32;
+ OSErr = SInt16;
+ OSType = FourCharCode;
+
+const
+ noErr = 0;
+ gestaltSystemVersionMinor = FourCharCode('sys2'); { The minor system version number; in 10.4.17 this would be the decimal value 4 }
+
+function Gestalt(selector: OSType; var response: SInt32): OSErr; mwpascal; external name '_Gestalt';
+
+procedure InitObjCRunTime;
+var
+ MacVersion : SInt32;
+begin
+ if (Gestalt(gestaltSystemVersionMinor, MacVersion) = noErr) then begin
+ if MacVersion >= 5
+ then InitializeObjcRtl20(DefaultObjCLibName)
+ else InitializeObjcRtl10(DefaultObjCLibName);
+ end else
+ InitializeObjcRtl20(DefaultObjCLibName);
+end;
+
+{initialization}
+begin
+ InitObjCRuntime;
+
+end.
+
diff --git a/packages/objcrtl/src/objcrtlutils.pas b/packages/objcrtl/src/objcrtlutils.pas
new file mode 100755
index 0000000000..19677370d1
--- /dev/null
+++ b/packages/objcrtl/src/objcrtlutils.pas
@@ -0,0 +1,75 @@
+{
+ objcrtlutils.pas
+
+ Copyright (C) 2009 Dmitry Boyarintsev
+
+ This unit is implementation for dynamic Objective-C Run-time Library based on run-time version 2.0
+ headers included with XCode 3.1.2
+ The original copyright note of is kept on each include file
+}
+
+unit objcrtlutils;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ objcrtl;
+
+function alloc(classname: PChar): id; inline;
+function allocex(classname: PChar; extraBytes: Integer): id; inline;
+function objcclass(classname: PChar): _class; inline;
+function selector(cmdname: PChar): SEL; inline;
+procedure release(objc: id); inline;
+function AllocAndInit(classname: PChar): id; inline;
+function AllocAndInitEx(classname: PChar; extraBytes: Integer): id; inline;
+function super(obj: id): objc_super;
+
+implementation
+
+function super(obj: id): objc_super;
+begin
+ Result.reciever := obj;
+ Result.class_ := class_getSuperclass(object_getClass(obj));
+end;
+
+function allocex(classname: PChar; extraBytes: Integer): id; inline;
+begin
+ Result := class_createInstance( objcclass(classname), extraBytes);
+end;
+
+function alloc(classname: PChar): id; inline;
+begin
+ Result := allocex(classname, 0);
+ // Result := objc_msgSend( objc_getClass(classname), selector('alloc'), []);
+end;
+
+function objcclass(classname: PChar): _class; inline;
+begin
+ Result := _class(objc_getClass(classname));
+end;
+
+function selector(cmdname: PChar): SEL; inline;
+begin
+ Result := sel_registerName(cmdname);
+end;
+
+procedure release(objc: id); inline;
+begin
+ objc_msgSend(objc, selector('release'), []);
+end;
+
+function AllocAndInit(classname: PChar): id; inline;
+begin
+ Result:= objc_msgSend( alloc( classname ), selector('init'), []);
+end;
+
+function AllocAndInitEx(classname: PChar; extraBytes: Integer): id; inline;
+begin
+ Result := objc_msgSend( allocEx( classname, extraBytes ), selector('init'), []);
+end;
+
+
+end.
+