Как стать автором
Обновить

Адаптируем RoboVM для компиляции под iOS из Windows/Linux

Время на прочтение3 мин
Количество просмотров5K

Прошло полтора года как 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 на мак и полноценно кросскомпилировать из-под него!


Ссылки:


Теги:
Хабы:
Всего голосов 14: ↑11 и ↓3+8
Комментарии2

Публикации

Истории

Работа

iOS разработчик
17 вакансий
Swift разработчик
27 вакансий

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
19 сентября
CDI Conf 2024
Москва
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн