[Из песочницы] Адаптируем RoboVM для компиляции под iOS из Windows/Linux

habr.png

Прошло полтора года как Microsoft закрыл случайно оказавшийся в корзине с Xamarin-ом RoboVM. Уже и официальный robovm.com канул в лету. Последняя opensource версия 1.8 была форкнута группой MobiVM и поддерживается на искусственном дыхании в рабочем состоянии и сейчас.


Сам RoboVM (тут и далее MobiVM форк я буду называть так) тесно переплетен с MacOSX и в оригинальном виде, будучи запущенным в Windows/Linux встречает сообщением, что код писать можно, компилировать нельзя. Встречая в cmake файлах/сети упоминании о Windows, принял вызов и решил довести дело к какому-либо результату.


Понадобится:


  • linux/windows версия библиотеки llvm;
  • linux/windows версия библиотеки libimobiledevice;
  • линкер;
  • iOS sdk;
  • codesign;
  • суррогатный набор утилит идентичный такому из Xcode;


С первыми четырьмя пунктами особых вопросов не возникло:


  • сборка llvm и libimobiledevice уже присутствовала в репозитории RoboVM, и после адаптации cmake файлов были получены рабочие библиотеки;
  • линкер был взят в проекте tpoechtrager/cctools-port и был изначально в рабочем состоянии. Однако собирался только в cygwin;
  • iOS sdk для академических целей был получен методом backup папки Xcode из MacOSX;


Для proof of concept (или скорейшего облома) исходный код грубо рубился, кросскомпилировалось все на коленке и еще в августе был слинкован первый исполняемый файл из Windows. С подписанием кода так весело не пошло. Попытка подписать все так же на скорую используя saucelabs/isign к успеху не привела: утилита могла переподписать только уже подписанные приложение (с выделенной LC_CODE_SIGNATURE), тащила в зависимостях openssl и в целом была написана в лучших традициях питона. Стоит отметить, что исходный код codesign от Apple не закрыт, но сборка его не под Мак платформу сложна и полна нерешенных зависимостей.
Решение проблемы пришло само-собой: был написал собственный велосипед codesign на Java. За основу взят isign. Для лучшего понимания сначала был написан верификатор подписи, а далее, развернув его на 180 градусов получен signer.


Первый успех! Простое приложение, которое не требует утилит из Xcode (так же все мешающие части кода были безжалостно выпилены) было запущено на устройстве. Заканчивался октябрь.


Далее началась рутина: приведение исходного кода в чувство, вынос платформо-зависимого кода за фасад, формирование суррогатного набора утилит (аналогичного Xcode), боль и слезы кросскомпиляции и долгие часы сборки. Рутину разбавил своеобразно: портировал линковщик с cygwin на сборку под MinGW известным методом — заменяя posix функционал доступным суррогатом, что добавило новых побочных эффектов, например, притащило ограничение пути в 260 символов. Но теперь весь бестиарий собирался в одном месте, из-под Linux.


В результате получился такой набор:


  • actool из facebook/xcbuild
  • plutil из facebook/xcbuild
  • xib2nib (аналог ibtool) с большим скрипом из нерабочего Microsoft/WinObjC (вероятно, в большинстве случаев работать не будет)
  • codesign_allocate, lipo, nm, otool, strip из проекта линковщика tpoechtrager/cctools-port
  • dsymutil из LLVM5, пришлось отдельно собирать, т.к. получаемый dsymutil во время компиляции libllvm для RoboVM оказался устаревшим и несовместимым (v3.6)
  • утилита file, для Windows. В коде RoboVM используется для определения типа библиотек. Оказалось, проще собрать под Windows, чем менять логику.


В итоге получился забавный проект, в данный момент ограничен лицензией на использования iOS SDK за пределами оборудования Apple. Но можно же поставить Windows на мак и полноценно кросскомпилировать из-под него!


Ссылки:


  • исходный код RoboVM
  • сборщик toolchain
  • линковщик для сборки (mingw)
  • собранные бинарники и инструкция по установке

© Habrahabr.ru