在 Linux 平台上为 iOS 做交叉编译

此过程有些复杂, 需要很多步骤, 但只要你正确配置了环境, 就可以随时随地轻松为iOS编译Godot.

免责声明

尽管可以在 Linux 环境上为 iOS 进行编译,但是 Apple 对要使用的工具有严格的限制(特别是硬件方面),几乎只允许将其产品用于开发。因此,这是非官方的。然而,2010 年 Apple 的声明表示放宽了一些App Store 审核指南,允许使用任何工具,只要生成的二进制文件不下载任何代码,这意味着可以使用此处描述的过程并交叉编译二进制文件。

需求

  • 带iOS SDK的XCode (dmg镜像)

  • Clang >= 3.5 用于已安装的开发机器并位于 PATH 中. 它的版本必须是 >= 3.5 , 才能用于 arm64 体系结构.

  • Fuse for mounting and umounting the dmg image.

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

    • 要构建darling-dmg, 你需要以下库的开发包:fuse,icu,openssl,zlib,bzip2.

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

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

配置环境

darling-dmg

在你的机器上克隆该仓库:

$ 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

工具链

构建 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脚本将在你为工具链二进制文件提供的目录中的 usr/bin 下查找, 因此, 你必须复制到这样的子目录, 类似于以下命令:

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

现在你应该在 /home/user/iostoolchain/usr/bin 中拥有iOS工具链二进制文件.

为 iPhone 编译 Godot

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

为了检测iPhone平台, 你需要将 OSXCROSS_IOS 环境变量定义为 anything.

$ export OSXCROSS_IOS=anything

现在你可以使用SCons像标准Godot方式一样编译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-"

制作胖二进制文件

Apple需要一个胖二进制文件, 即两个架构(armv7arm64)在一个文件中. 为此, 请使用 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

然后你将在 bin 目录下有iOS大的二进制文件.