在 Linux 上為 iOS 進行交叉編譯

為 iOS 交叉編譯的步驟有點複雜,並需要許多步驟。但正確設定好環境後,便能隨時輕鬆為 iOS 編譯 Godot。

免責聲明

雖然可以在 Linux 上為 iOS 平台編譯,但 Apple 對於使用的工具有嚴格的限制 (特別是硬體方面),幾乎只允許使用 Apple 自家產品進行開發。因此,這裡提到的方法 並非官方的 。但是,依據 Apple 在 2010 年發表的一篇聲明 提到,Apple 放寬了一些 App Store 審查方針 ,只要最終產生的二進位檔不會下載任何程式碼,就可以使用任何的工具。這表示,依照本頁的說明來交叉編譯二進位執行檔應該沒什麼問題。

系統需求

  • 包含 iOS SDK 的 XCode (DMG 映像檔)

  • Clang >= 3.5 ,安裝於用於開發的機器上,並且需放置於 PATH 內。版本必須 >= 3.5 才能處理 arm64 架構的建置目標。

  • Fuse ,用於掛載與取消掛載 DMG 映像。

  • darling-dmg ,必須從原始碼編譯。編譯方法會在稍後說明。

    • 要建置 darling-dmg,則必須要有下列幾個函式庫的開發套件:fuse, icu, openssl, zlib, bzip2。

  • cctools-port 用於所需的建置工具。編譯的過程很特別,會在稍後說明。

    • 還有一些額外的相依性套件:automake, autogen, libtool。

設定環境

darling-dmg

將儲存庫 Clone 到機器上:

$ git clone https://github.com/darlinghq/darling-dmg.git

建置:

$ 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 ../..

準備 SDK

掛載 XCode 映像:

$ mkdir xcode
$ ./darling-dmg/build/darling-dmg /path/to/Xcode_7.1.1.dmg xcode
[...]
Everything looks OK, disk mounted

解壓縮 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

打包 SDK:

$ cd iPhoneSDK
$ tar -cf - * | xz -9 -c - > iPhoneOS9.1.sdk.tar.xz

Toolchain

建置 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

複製該工具至適當的地方。請注意,用於建置的 SCons 腳本會在所提供的 Toolchain 二進位檔資料夾中的 usr/bin 中搜尋,因此必須複製到這樣的子資料夾中,如下列指令:

$ mkdir -p /home/user/iostoolchain/usr
$ cp -r target/bin /home/user/iostoolchain/usr/

現在 iOS Toolchain 二進位檔應該放在 /home/user/iostoolchain/usr/bin 中。

為 iPhone 編譯 Godot

完成上述步驟後,需要將兩樣東西保留在開發環境中:建置 Toolchain 以及 iPhoneOS SDK 資料夾。因為儲存路徑需要在建置時主動提供給 SCons,所以這兩樣東西可以放在任何地方。

為了能偵測到 iPhone 平台,必須定義 OSXCROSS_IOS 環境變數,內容不拘。

$ export OSXCROSS_IOS=anything

現在可以通過與一般編譯 Godot 相同的方法來用 SCons 為 iPhone 進行編譯,但需要在一些額外的引數中提供正確路徑:

$ 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-"

建置 Fat Binary

Apple 要求必須要在單一執行檔內包含 Fat Binary,即包含兩種架構 (armv7arm64)。要製作 Fat Binary,請使用 arm-apple-darwin11-lipo 執行檔。下列範例假設已在 Godot 原始碼根目錄中:

$ /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

接著 iOS 的 Fat Binary 應位於 bin 資料夾中。