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 进行编译是可行的,但苹果对开发所使用的工具(尤其是硬件方面)限制非常严格,基本上只允许使用自家的产品进行开发。因此,这种做法是 非官方 的。不过,苹果在 2010 年曾表示,他们放宽了一些 App Store review guidelines 的限制,允许使用任何工具进行开发,只要最终生成的二进制文件不下载任何代码即可。这意味着,使用这里描述的流程并交叉编译生成的二进制文件,理论上应该是没问题的。

需求

  • XCode 及 iOS SDK(登入 Apple ID 才能下载 Xcode)。

  • 你的开发电脑上需要安装好 Clang 3.5 或更高版本( Clang >= 3.5 ),并且要确保它已经添加到了系统的 PATH 环境变量中。另外,为了能顺利编译出 arm64 架构的程序,Clang 的版本必须不低于 3.5。

  • xarpbzx (这两个工具是用来解压 Xcode 所在的 .xip 压缩包的)。

    • 如果要编译 xar 和 pbzx,你可以参考这份 指南:

  • cctools-port 用于所需的构建工具. 构建过程非常特殊, 下面将进行描述.

    • 这也有一些额外的依赖:automake,autogen,libtool.

配置环境

准备 SDK

解压你从苹果开发者网站下载的那个 .xip 文件:

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

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

请注意,在运行下面的命令时,你需要把版本号(x.x)替换成你实际正在使用的 iOS SDK 版本。如果你不确定自己的 iPhone 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 工具链的二进制文件了。

为 iPhone 编译 Godot

完成上述步骤后, 应在环境中保留两件事: 构建的工具链和iPhoneOS SDK目录. 那些可以留在你想要的任何地方, 因此你必须提供它们的路径给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-"