Sign in Join
Wiki copytemporary

iPhone/iPod development: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11*(iOS only)*
22
33## Installation
44
55Requirements:
66
77- Intel Mac (iPhone SDK requirement)
88- Leopard 10.5.5 or later (iPhone SDK requirement)
99- iPhone SDK 3.x or later installed (tested with 2.2 - 5.1). **Warning:** there is a bug in the iPhone SDK 3.0 linker. See below for more information.
1010
1111Some features:
1212
1313- Simulator support
1414- the Xcode template transparently supports (requires, actually) integrating Pascal and Objective-C source files into a single application
1515- Pascal translation of the OpenGL ES 1.1 C-header from the SDK (this one we can distribute, because it's licensed under an SGI open source license), available in the gles11 unit
1616
1717Please read the entire ReadMe.rtf on the installer disk image before asking for help. It contains quite a bit of information on things to watch out for (especially when using the Simulator), and how to change the included template when adding extra Pascal source files.
1818
1919Note that unlike other FPC releases, this installer will install the FPC sources and a script, and will then launch this script in order to compile FPC (after you tell it where you installed the iPhone SDK, so it can generate a Pascal version of some required C headers). This modus operandi is necessary to comply with the iPhone SDK agreement's stipulation that no derived works of the SDK may be distributed. If the script aborts for some reason, you can find it at `/Developer/FreePascalCompiler/2.6.0/InstallScript/finish_fpc_iphone_install.command` to relaunch it. You can download it from the official [download page](http://www.freepascal.org/down/i386/macosx.var).
2020
2121If you encounter problems with the script that is launched when the installer finishes the installation, please always provide the entire contents of the Terminal window in which the script was executed when asking for help.
2222
2323(Xcode 4 compatibility: the Xcode templates only work in Xcode 3 only, not in Xcode 4.)
2424
2525### iPhone SDK 3.0
2626
2727The linker included with the iPhone SDK 3.0 contains a bug that is triggered by the Xcode template included with FPC. You can work around this bug by adding -Wl,-no_order_inits to the "Other Linker" flags in the Build settings of the project. This is already done for the Xcode templates included in the 2.4.0rc1 download above, but you may have to do this manually if you are using a project based on a template from a previous snapshot.
2828
2929The linker bug has been reported to Apple ([rdar://problem/7120987](http://openradar.appspot.com/7120987)). This problem has been fixed in the Xcode 4 linker.
3030
3131### Xcode 4, iOS SDK 5.0, Objective-Pascal
3232
3333For Xcode 4 templates and programming in Objective-Pascal on iOS, see <http://dl.dropbox.com/u/28343282/ObjP/index.html>
3434
3535## Apple's Licence limitations
3636
3737### Signing up to the Apple Developer Program
3838
3939You will eventually need to sign up to Apple's iPhone Developer program (\$99/year) to distribute your programs through the Apple store. This applies to any iPhone application, compiled with FPC or not.
4040
4141You *do not need to pay the fee* to run applications on your own physical iPhone device. A free developer account will be enough for this, if you use the new XCode versions.
4242
4343Without a developer certificate, you can only run programs on the simulator. (Possibly you can also workaround this if you have a jailbroken iPhone/iPod Touch, but in that case you are on your own.)
4444
4545Read more about Apple's iPhone development program here: <http://developer.apple.com/iphone/program/>
4646
4747### Pascal headers required for developing
4848
4949It is against the iPhone SDK agreement to distribute derivative works of this SDK, and this includes Pascal translations of framework headers. So it would be quite a challenge (if possible at all) to create and distribute the sources of a pure Pascal program with a GUI that does not violate the iPhone SDK agreement terms at this time. See the ReadMe.rtf (included in the .dmg above) file for more information
5050
5151## Technical Development Limitations
5252
5353At this time is not known whether and if so how it is possible to copy an application to an iPhone/iPod Touch and to execute it without using Xcode. It's of course possible to write the application using any IDE available (Lazarus, Lightweight IDE, etc) and it should also be possible to make any of them work with the Simulator. However, any application has to be built by Xcode for it to be uploaded to the Device and to debug it.
5454
5555### iPhone Simulator is not iPhone
5656
5757The iPhone Simulator makes the iPhone OS API in available to regular Mac applications, thereby mimicking the environment that the devices provide. By allowing you to run your applications in macOS, the simulator provides a way to quickly test your application’s functionality without the need for an actual device. However, running applications on the simulator is not the same as running them on devices.
5858
5959The simulator uses macOS versions of the low-level iPhone OS frameworks instead of the versions that run on devices. In general, the simulator is a good tool for performing initial testing of your application. Keep however in mind that, because the simulator does not emulate device functionality, you must always perform final testing and performance analysis of your application on actual devices. The main reason is that programs running under the simulator can also transparently use any other frameworks/functionality used by the host macOS operating system, which may not be available on the device.
6060
6161## Compiling and running pure Pascal applications on an iPhone/iPod Touch
6262
6363Plain command line applications work fine on the iPhone/iPod Touch, except that the output will only be visible in the gdb console (if run or debugged from Xcode; press cmd-shift-r, or select Run-\>Console) or in the device's console log (if started from the iPhone/iPod Touch itself). In case of GUI applications, you will probably require non-distributable header translations due to licensing restrictions as outlined above. You can however still use your own private Pascal header translations (possible generated by an automated tool).
6464
6565#### Using only Xcode
6666
67671. Create a new project based on the template
68682. Remove all files except for *Prefix.pch, Info.plist, Frameworks and Products from the project
69693. Add your own Pascal sources (Project-\>Add to Project...)
70704. Double-click on the project icon at the top left in the Xcode file list, go to the `Build` tab, and change the `FPC_MAIN_FILE` setting to the name of the test program you added (for all configurations).
71715. Build the program
7272
7373#### Combining command-line compilation and Xcode
7474
7575If you compile a program on the command line (for Darwin/ARM) and copy it over the built binary in an Xcode project, then if you "run" the program in Xcode, it will code sign and run the binary that you copied over rather than the original program (just make sure that the binary in Xcode has been compiled recently so there are no changes that trigger Xcode to relink it). You can do this using a project based on the default template, without changing anything to the project.
7676
7777You can find the Xcode binary's location by opening the `Products` folder in the project overview, right-clicking (ctrl-clicking) on the .app file and selecting "Reveal in Finder". The binary's location is then in program.app/Contents/MacOS (replace `program.app` with the actual name of the folder selected in the finder). Just overwrite whatever file is in this `MacOS` folder with the program you compiled (e.g. using the command line `cp` program).
7878
7979To compile for Darwin/ARM on the command line (replace "Developer" with the directory in which you installed the SDK):
8080
8181**for FPC 2.6.0:**
8282
8383```text
8484 ppcarm -Cparmv6 -Cfvfpv2 -FD/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin -XR/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk program.pas
8585```
8686
8787for iPhoneSimulator ( OS_TARGET has been introduced)
8888
8989```text
9090 ppc386 -Tiphonesim -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk program.pas
9191```
9292
9393**prior to FPC 2.6.0:**
9494
9595```text
9696 ppcarm -FD/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin -XR/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk program.pas
9797```
9898
9999for iPhoneSimulator
100100
101101```text
102102 ppc386 -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.2.sdk program.pas
103103```
104104
105105## Compiling and running pure Pascal applications on iPhone simulator
106106
107107Compiling and linking requires a regular ppc386 compiler. There is little difference between an iPhone Simulator and a regular macOS application, except that iPhoneSim applications are linked to different frameworks compared to regular macOS applications.
108108
109109Starting with FPC 2.6.0 **iphonesim** target has been introduced. For SDKs 3.2 and higher fpc packages needs to be compiled for iphonesim target ([see \#17470](http://bugs.freepascal.org/view.php?id=17470)). Reasoning: while FPC compile is still pretty much the same (i386 target), different Objective-C ABI is used. For darwin-i386 FPC is using ObjC1 (to be compatible with OSX 10.4 and earlier), while iphonesim-i386 required ObjC2 only. (It seems like previous versions of iPhoneSim SDK 2.x and 3.0 allows ObjC1)
110110
111111Some frameworks are iPhone-specific (UIKit), other frameworks exist for both macOS and the iOS (CoreFoundation, CoreGraphics, etc). The iPhoneSim SDK provides its own versions of these frameworks. In order to ensure that the SDK's versions of these frameworks are used, you have to to tell the compiler to use appropriate SDK (just like when compiling applications for a real device):
112112
113-` fpc simtest.pas -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk`
113+```text
114+ fpc simtest.pas -XR/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk
115+```
114116
115117where */Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.0.sdk* is the root of an iPhoneSim SDK folder. This directory can vary depending on where you have installed the iPhone SDK.
116118
117119There are a at least 3 versions of iPhone SDK available: 2.2.1, 3.0, 3.1. Depending on the version you need, the path changes:
118120
119121- SDK version 2.2.1: */Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator2.2.1.sdk*
120122- SDK version 3.0: */Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk*
121123
122124etc.
123125
124126## Building an ARM Cross-compiler
125127
126128The downloadable FPC/iPhone package contains a *ppcarm* cross-compiler to build iPhone applications. Should you wish to compile a newer version of the compiler and units from the latest svn sources later on, you can follow these steps:
127129
128130**Requirements:** The iOS SDK must be installed via a standard Xcode developer tools installation and the path to the SDK must contain no spaces.
129131
1301321\) copy */Developer/FreePascalCompiler/2.6.0/Source/rtl/darwin/arm/sig_cpu.inc* to the *rtl/darwin/arm* directory of your svn checkout (that file was generated when you installed the FPC iPhone SDK integration kit)
131133
1321342\) in the top level fpc directory of your checkout, execute the following commands (in the first line, replace */Developer* with the name of the actual directory where you installed the iPhone SDK, and in the second like replace *iPhoneOS4.2.sdk* with the actual SDK you want to target)
133135
134-` export IPHONEPLATFORMBASEDIR=/Developer/Platforms/iPhoneOS.platform/Developer`\
135-` make FPC=/usr/local/lib/fpc/2.6/0/ppc386 CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS4.2.sdk/ -ap -Cfvfpv2" all`
136+```text
137+ export IPHONEPLATFORMBASEDIR=/Developer/Platforms/iPhoneOS.platform/Developer
138+ make FPC=/usr/local/lib/fpc/2.6/0/ppc386 CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS4.2.sdk/ -ap -Cfvfpv2" all
139+```
136140
1371413\) to install it afterwards (again, replace the SDK path as appropriate):
138142
139-``  sudo make FPC=`pwd`/compiler/ppcrossarm OPT="-ap" CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS4.2.sdk/ -ap" install CROSSINSTALL=1 ``\
140-` sudo ln -sf ../lib/fpc/2.5.1/ppcrossarm /usr/local/bin/ppcarm`
143+```text
144+ sudo make FPC=`pwd`/compiler/ppcrossarm OPT="-ap" CPU_TARGET=arm CROSSOPT="-FD${IPHONEPLATFORMBASEDIR}/usr/bin -XR${IPHONEPLATFORMBASEDIR}/SDKs/iPhoneOS4.2.sdk/ -ap" install CROSSINSTALL=1
145+ sudo ln -sf ../lib/fpc/2.5.1/ppcrossarm /usr/local/bin/ppcarm
146+```
141147
142148(possibly with an INSTALL_PREFIX=xyz at the end of the "sudo make" line to install it under "xyz" rather than under /usr/local -- in that case, also adjust the "ln" command afterwards)
143149
144150## iOS 8.0 and later
145151
146152Apple requires everyone to use 64-bit applications for iOS 8.0 (and later). Also iPhone Simulator for iOS 8.0 is 64-bit only.
147153
148154Whenever you compile a project you'll need to use the proper SDK and proper bin utilities. Note that for iPhone Simulator, there's also its own set of bin utilities, not compatible with default macOS bin utilities.
149155
150156Example
151157
152-`export SDK_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk `\
153-`export BIN_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/`\
154-` `\
155-`ppcx64 -Tiphonesim -Px86_64 -Scghi -O1 -va -XR$SDK_PATH -FD$BIN_PATH iphoneproj.pas `
158+```text
159+export SDK_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk
160+export BIN_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/
161+
162+ppcx64 -Tiphonesim -Px86_64 -Scghi -O1 -va -XR$SDK_PATH -FD$BIN_PATH iphoneproj.pas
163+```
156164
157165Note that using "-va" parameter (show all messages) which helps to know whether you're using the right path for bin utilities and SDK. The desired result is that ctrl.o library and ld tool are found in a proper target platform, similar to shown below.
158166
159-`[0.437] Linking iphoneproj`\
160-`[0.481] Searching file /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/crt1.o... found`\
161-`[0.481] Searching file /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ld... found`
167+```text
168+[0.437] Linking iphoneproj
169+[0.481] Searching file /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/crt1.o... found
170+[0.481] Searching file /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/ld... found
171+```
162172
163173If the path is not found then FPC will fallback to system-wide defaults (macOS target) and the linking is likely to fail.
164174
165175## More information
166176
167177- [Simple iPhone example using FreePascal and SDL](http://freeze-dev.de/blog/?p=492)
168178
169179## See Also
170180
171181- [[iPhone headers translator]]
172182
173183## External Links
174184
175185- [Simon Choi's Basic Tutorial for Clean Installation for iOS 8.2](https://blog.naver.com/simonsayz/220305479793)
176186- [Simon Choi's Basic Tutorial for Clean Installation for iOS 11.2.5](https://blog.naver.com/simonsayz/221209784815)
177187- [The primary Apple frameworks headers parser (used for FPC package)](https://github.com/genericptr/Framework-Parser)
178188- [Tips for Castle game engine project compilation for iOS](https://github.com/castle-engine/castle-engine/wiki/iOS)
179189
180190---
181191*From the Free Pascal wiki, page "iPhone/iPod development", as it stood on 2020-08-01 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history