From cb03e9c9442e0890ffa6872bf6f5f76227746afb Mon Sep 17 00:00:00 2001 From: jonas Date: Sat, 9 May 2009 20:24:21 +0000 Subject: + 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 --- packages/objcrtl/Makefile | 2350 +++++++++++++++++++++++++++++ packages/objcrtl/Makefile.fpc | 23 + packages/objcrtl/Package.fpc | 57 + packages/objcrtl/examples/objcrtltest.pas | 191 +++ packages/objcrtl/fpmake.pp | 41 + packages/objcrtl/src/objcrtl.pas | 408 +++++ packages/objcrtl/src/objcrtl10.pas | 833 ++++++++++ packages/objcrtl/src/objcrtl20.pas | 160 ++ packages/objcrtl/src/objcrtliphoneos.pas | 26 + packages/objcrtl/src/objcrtlmacosx.pas | 54 + packages/objcrtl/src/objcrtlutils.pas | 75 + 11 files changed, 4218 insertions(+) create mode 100644 packages/objcrtl/Makefile create mode 100755 packages/objcrtl/Makefile.fpc create mode 100644 packages/objcrtl/Package.fpc create mode 100755 packages/objcrtl/examples/objcrtltest.pas create mode 100755 packages/objcrtl/fpmake.pp create mode 100755 packages/objcrtl/src/objcrtl.pas create mode 100755 packages/objcrtl/src/objcrtl10.pas create mode 100755 packages/objcrtl/src/objcrtl20.pas create mode 100755 packages/objcrtl/src/objcrtliphoneos.pas create mode 100755 packages/objcrtl/src/objcrtlmacosx.pas create mode 100755 packages/objcrtl/src/objcrtlutils.pas (limited to 'packages/objcrtl') 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. + -- cgit v1.2.1