Compilación cruzada pra IOS en Linux

El procedimiento para esto es algo complejo y requiere muchos pasos, pero una vez que tengas el entorno configurado correctamente, será fácil compilar Godot para iOS cada vez que lo desees.

Descargo de responsabilidad

Aunque es posible compilar para iOS en un entorno Linux, Apple es muy restrictivo con las herramientas que se pueden utilizar (especialmente en términos de hardware), permitiendo prácticamente solo el uso de sus productos para el desarrollo. Por lo tanto, esto no es oficial. Sin embargo, un comunicado de Apple en 2010 dice que relajaron algunas de las pautas de revisión de la App Store para permitir el uso de cualquier herramienta, siempre que el binario resultante no descargue ningún código, lo que significa que debería estar permitido utilizar el procedimiento descrito aquí y la compilación cruzada del binario.

Requerimientos

  • XCode con el iOS SDK (una imagen dmg)

  • Clang >= 3.5 debe estar instalado en tu máquina de desarrollo y disponible en la variable de entorno PATH. Debe ser una versión >= 3.5 para poder apuntar a la arquitectura arm64.

  • Fuse para montar y desmontar la imagen dmg.

  • darling-dmg, el cual debe ser construido desde el código fuente. El procedimiento para hacerlo se explica a continuación.

    • Para compilar darling-dmg, necesitarás los paquetes de desarrollo de las siguientes bibliotecas: fuse, icu, openssl, zlib, bzip2.

  • cctools-port para las herramientas de construcción necesarias. El procedimiento de construcción es bastante particular y se describe a continuación.

    • Esto también tiene algunas dependencias adicionales: automake, autogen, libtool.

Configurando el entorno

darling-dmg

Clona el repositorio en tu máquina:

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

Compilalo:

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

Preparando el SDK

Montando la Imagen XCode:

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

Extrayendo el SDK de iOS:

$ 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

Enpaqueta el SDK:

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

Cadena de herramientas

Compila los 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

Copia las herramientas a un lugar más organizado. Ten en cuenta que los scripts de SCons para la construcción buscarán dentro de usr/bin en el directorio que proporciones para los binarios del conjunto de herramientas, por lo que debes copiar a un subdirectorio de esa forma, similar a los siguientes comandos:

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

Ahora deberías tener los binarios del conjunto de herramientas para iOS en /home/user/iostoolchain/usr/bin.

Compilando Godot para iPhone

Una vez que hayas realizado los pasos anteriores, debes mantener dos cosas en tu entorno: el conjunto de herramientas construido y el directorio del SDK de iPhoneOS. Puedes ubicarlos donde desees, ya que deberás proporcionar las rutas de estos al comando de construcción de SCons.

Para que se detecte la plataforma de iPhone, es necesario que la variable de entorno OSXCROSS_IOS esté definida como cualquier valor.

$ export OSXCROSS_IOS=anything

Ahora puedes compilar para iPhone utilizando SCons de la misma manera que lo haces para Godot estándar, pero con algunos argumentos adicionales para proporcionar las rutas correctas:

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

Produciendo binarios universales

Apple requiere un binario universal con ambas arquitecturas (armv7 y arm64) en un solo archivo. Para lograr esto, utiliza el ejecutable arm-apple-darwin11-lipo. El siguiente ejemplo asume que estás en el directorio raíz del código fuente de 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

Entonces tendrás los binarios universales de iOS en el directorio bin.