Cross-compiling for iOS on Linux
The procedure for this is somewhat complex and requires a lot of steps, but once you have the environment properly configured it will be easy to compile Godot for iOS anytime you want.
Disclaimer
not official. However, a statement from Apple in 2010 says they relaxed some of the App Store review guidelines to allow any tool to be used, as long as the resulting binary does not download any code, which means it should be OK to use the procedure described here and cross-compiling the binary.
Requirements
- XCode with the iOS SDK (a dmg image)
- Clang >= 3.5 for your development machine installed and in the
PATH. It has to be version >= 3.5 to targetarm64architecture. - Fuse for mounting and umounting the dmg image.
- darling-dmg, which needs to be built from source. The procedure for that is explained below.
-
- cctools-port for the needed build tools. The procedure for building is quite peculiar and is described below.
-
Configuring the environment
darling-dmg
Clone the repository on your machine:
$ git clone https://github.com/darlinghq/darling-dmg.git
Build it:
$ cd darling-dmg$ mkdir build$ cd build$ cmake .. -DCMAKE_BUILD_TYPE=Release$ make -j 4 # The number is the amount of cores your processor has, for faster build$ cd ../..
Preparing the SDK
Mount the XCode image:
$ mkdir xcode$ ./darling-dmg/build/darling-dmg /path/to/Xcode_7.1.1.dmg xcode[...]Everything looks OK, disk mounted
Extract the iOS SDK:
$ mkdir -p iPhoneSDK/iPhoneOS9.1.sdk$ cp -r xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/* iPhoneSDK/iPhoneOS9.1.sdk$ cp -r xcode/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOS9.1.sdk/usr/include/c++$ fusermount -u xcode # unmount the image
Pack the SDK:
$ cd iPhoneSDK$ tar -cf - * | xz -9 -c - > iPhoneOS9.1.sdk.tar.xz
Toolchain
Build cctools:
$ git clone https://github.com/tpoechtrager/cctools-port.git$ cd cctools-port/usage_examples/ios_toolchain$ ./build.sh /path/iPhoneOS9.1.sdk.tar.xz arm64
usr/bin inside the directory you provide for the toolchain binaries, so you must copy to such subdirectory, akin to the following commands:
$ mkdir -p /home/user/iostoolchain/usr$ cp -r target/bin /home/user/iostoolchain/usr/
/home/user/iostoolchain/usr/bin.
Compiling Godot for iPhone
Once you’ve done the above steps, you should keep two things in your environment: the built toolchain and the iPhoneOS SDK directory. Those can stay anywhere you want since you have to provide their paths to the SCons build command.
OSXCROSS_IOS environment variable defined to anything.
$ export OSXCROSS_IOS=anything
Now you can compile for iPhone using SCons like the standard Godot way, with some additional arguments to provide the correct paths:
$ scons -j 4 platform=iphone arch=arm target=release_debug IPHONESDK="/path/to/iPhoneSDK" IPHONEPATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-"$ scons -j 4 platform=iphone arch=arm64 target=release_debug IPHONESDK="/path/to/iPhoneSDK" IPHONEPATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-"
Producing fat binaries
armv7 and arm64) in a single file. To do this, use the arm-apple-darwin11-lipo executable. The following example assumes you are in the root Godot source directory:
$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot.iphone.opt.debug.arm.a bin/libgodot.iphone.opt.debug.arm64.a -output bin/libgodot.iphone.debug.fat.a$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot_camera_module.iphone.opt.debug.arm.a bin/libgodot_camera_module.iphone.opt.debug.arm64.a -output bin/libgodot_camera_module.iphone.debug.fat.a$ /path/to/iostoolchain/usr/bin/arm-apple-darwin11-lipo -create bin/libgodot_arkit_module.iphone.opt.debug.arm.a bin/libgodot_arkit_module.iphone.opt.debug.arm64.a -output bin/libgodot_arkit_module.iphone.debug.fat.a
bin directory.
