在Linux平台上为iOS做交叉编译
此过程有些复杂,需要很多步骤,但只要您正确配置了环境,就可以随时随地轻松为iOS编译Godot。
免责声明
尽管可以在Linux环境上为iOS进行编译,但是Apple对要使用的工具(特别是硬件方面)有严格的限制,几乎只允许将其产品用于开发。因此,这是 非官方的。然而,2010年苹果公司的声明 表示放宽了一些 应用程序商店审查指南 以允许使用任何工具,只要生成的二进制文件不下载任何代码 ,这意味着可以使用此处描述的过程并交叉编译二进制文件。
需求
- 带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
在您的计算机上克隆存储库:
$ 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需要一个胖二进制文件,即两个架构(armv7
和 arm64
)在一个文件中。为此,请使用 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
Then you will have iOS fat binaries in bin
directory.