Кросс-компиляция для iOS на Linux

Процедура для этого довольно сложная и требует множества шагов, но как только вы правильно настроите среду, вы сможете скомпилировать Godot для iOS в любое время.

Отказ от ответственности

Хотя компиляция для iOS в среде Linux возможна, Apple накладывает очень строгие ограничения на используемые инструменты (особенно в плане оборудования), позволяя использовать для разработки практически только свои продукты. Так что это неофициально. Однако в 2010 году Apple заявила, что смягчила некоторые правила проверки в App Store, разрешив использование любых инструментов, при условии, что полученный двоичный файл не загружает никакого кода. Это означает, что можно использовать описанную здесь процедуру и кросс-компилировать двоичный файл.

Требования

  • XCode с iOS SDK (для загрузки Xcode необходимо войти в учетную запись Apple ID).

  • Clang >= 3.5 для вашей машины разработки установлен и прописан в PATH. Для архитектуры arm64 версия должна быть >= 3.5.

  • xar и pbzx (требуются для извлечения архива .xip, входящего в комплект Xcode).

  • cctools-port для необходимых инструментов сборки. Процедура сборки довольно необычна и описана ниже.

    • Также есть некоторые дополнительные зависимости: automake, autogen, libtool.

Настройка среды

Подготовка SDK

Извлеките файл Xcode .xip, загруженный с сайта разработчиков Apple:

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

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

Обратите внимание, что в приведенных ниже командах вам нужно заменить версию (x.x) на используемую вами версию iOS SDK. Если вы не знаете версию вашего iPhone SDK, вы можете найти JSON-файл в папке Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs.

Распакуйте 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/"

Теперь у вас должны быть двоичные файлы iOS toolchain в $HOME/iostoolchain/usr/bin.

Компиляция Godot для iPhone

После выполнения вышеперечисленных шагов вам необходимо сохранить в своей среде два элемента: собранный набор инструментов и каталог iPhoneOS SDK. Они могут располагаться где угодно, поскольку вам необходимо указать пути к ним в команде сборки SCons.

Для определения платформы iPhone необходимо, чтобы переменная среды OSXCROSS_IOS была определена как что-то конкретное.

export OSXCROSS_IOS="anything"

Теперь вы можете выполнить компиляцию для iPhone с использованием SCons, как стандартным способом Godot, с некоторыми дополнительными аргументами для указания правильных путей:

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