Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

在 Linux 上為 iOS 進行交叉編譯

這個流程相當複雜,需要多個步驟,但只要正確設定好環境,就能隨時為 iOS 編譯 Godot。

免責聲明

雖然可以在 Linux 環境下為 iOS 編譯,但 Apple 對於所使用工具(特別是硬體)極為嚴格,幾乎只允許使用自家產品開發,因此此流程 並非官方方式。不過,Apple 在 2010 年曾表示,已放寬部分 App Store 審查方針,只要產生的二進位檔不會下載任何程式碼,即可使用任何工具。這代表本頁介紹的交叉編譯流程原則上可行。

系統需求

  • iOS SDK 版 Xcode (需登入 Apple ID 才能下載)。

  • Clang >= 3.5 ,安裝於開發主機並設定於 PATH 中,版本需為 3.5 或以上才能支援 arm64 架構。

  • xarpbzx (用於解壓 Xcode 的 .xip 封裝檔)。

  • cctools-port (建置所需的工具)。建置流程較特別,說明如下。

    • 此外還需額外安裝:automake、autogen、libtool。

設定開發環境

準備 SDK

請將從 Apple 開發者網站下載的 Xcode .xip 檔解壓縮:

mkdir xcode
xar -xf /path/to/Xcode_X.x.xip -C xcode
pbzx -n Content | cpio -i

[...]
######### Blocks

請注意,下方指令中的 x.x 需替換為你所使用的 iOS SDK 版本。如果不確定 SDK 版本,可於 Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs 目錄下查看 JSON 檔案以獲得資訊。

解壓縮 iOS SDK:

export IOS_SDK_VERSION="x.x"
mkdir -p iPhoneSDK/iPhoneOS${IOS_SDK_VERSION}.sdk
cp -r xcode/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/* iPhoneSDK/iPhoneOS${IOS_SDK_VERSION}.sdk
cp -r xcode/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/* iPhoneSDK/iPhoneOS${IOS_SDK_VERSION}.sdk/usr/include/c++
fusermount -u xcode

將 SDK 打包,讓 cctools 可以使用:

cd iPhoneSDK
tar -cf - * | xz -9 -c - > iPhoneOS${IOS_SDK_VERSION}.sdk.tar.xz

工具鏈

建置 cctools:

git clone https://github.com/tpoechtrager/cctools-port.git
cd cctools-port/usage_examples/ios_toolchain
./build.sh /path/iPhoneOS${IOS_SDK_VERSION}.sdk.tar.xz arm64

將工具複製到適當的資料夾。請注意,SCons 建置腳本會在你指定的工具鏈目錄下的 usr/bin 子目錄尋找二進位檔,因此必須照下列指令將檔案複製到對應子目錄:

mkdir -p "$HOME/iostoolchain/usr"
cp -r target/bin "$HOME/iostoolchain/usr/"

現在你應該已在 $HOME/iostoolchain/usr/bin 目錄下取得 iOS 工具鏈的二進位檔。

編譯 Godot 為 iPhone 版本

完成上述步驟後,請將已建置好的工具鏈與 iPhoneOS SDK 資料夾保存在開發環境中。這兩者可任意放置,只要在 SCons 編譯時提供正確路徑即可。

為讓 SCons 能正確偵測到 iPhone 平台,需設置 OSXCROSS_IOS 環境變數(內容可任意設)。

export OSXCROSS_IOS="anything"

現在你可以使用 SCons 以標準 Godot 方式編譯 iPhone 版本,只需額外傳入正確路徑參數即可:

scons platform=ios arch=arm64 target=template_release IOS_SDK_PATH="/path/to/iPhoneSDK" IOS_TOOLCHAIN_PATH="/path/to/iostoolchain" ios_triple="arm-apple-darwin11-"