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 you can compile Godot for iOS anytime you want.

Disclaimer

While it is possible to compile for iOS on a Linux environment, Apple is very restrictive about the tools to be used (especially hardware-wise), allowing pretty much only their products to be used for development. So this is 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, for newer versions a xip file is going to be downloaded.)

  • Clang >= 3.5 for your development machine installed and in the PATH. It has to be version >= 3.5 to target arm64 architecture.

  • Fuse for mounting and unmounting the dmg image.

  • darling-dmg, which needs to be built from source. The procedure for that is explained below.

    • For newer versions you should download xar and pbzx.

    • For building darling-dmg, you'll need the development packages of the following libraries: fuse, icu, openssl, zlib, bzip2.

    • For building xar and pbzx you may want to follow this guide.

  • cctools-port for the needed build tools. The procedure for building is quite peculiar and is described below.

    • This also has some extra dependencies: automake, autogen, libtool.

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

For newer versions you should extract the xip file:

$ mkdir xcode
$ xar -xf /path/to/Xcode_X.x.xip -C xcode
$ pbzx -n Content | cpio -i
[...]
######### Blocks

Note that for the commands below, you may need to replace the version (X.x) with whatever iOS SDK version you're using.

Extract the iOS SDK:

$ # If you don't know your iPhone SDK version you can see the json file inside of Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
$ mkdir -p iPhoneSDK/iPhoneOSX.x.sdk
$ cp -r xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/* iPhoneSDK/iPhoneOSX.x.sdk
$ cp -r xcode/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOSX.x.sdk/usr/include/c++
$ fusermount -u xcode  # unmount the image

Pack the SDK:

$ cd iPhoneSDK
$ tar -cf -