Информация
- В рейтинге
- Не участвует
- Откуда
- Москва, Москва и Московская обл., Россия
- Работает в
- Дата рождения
- Зарегистрирован
- Активность
Специализация
Software Developer, Mobile Application Developer
Senior
От 400 000 ₽
iOS development
SWIFT
Fastlane
Objective-C
C++
Qt
QML
Cmake
У нас уже лет 5 через дженкинс собирается по 1-4 проекта параллельно на одной машине без сучка и задоринки. Какая у вас была проблема?
Вообще-то можем, если сделать это в C/C++/ObjC коде, т.к. сишные макросы позволяют задавать им произвольные значения, в т.ч. и строковые.
Для этого в настройку
GCC_PREPROCESSOR_DEFINITIONSзаписываетсяSERVER_URL=\"$(SERVER_URL)\"(имя макроса с левой стороны можно выбрать любое), что делает доступным макросSERVER_URLв C коде, который превратится в строковый литерал.Далее создаем пару .h/.m файлов, в которые поместим функцию (или класс, как душе угодно), возвращающую наш макрос в виде подходящего ObjC объекта:
В принципе,
@можно поместить и прямо в определение макроса. Также можно добавить_NonNullдля возвращаемого типа либо просто обернуть объявления вNS_ASSUME_NONNULL_BEGIN/NS_ASSUME_NONNULL_ENDв заголовочном файле.Осталось поместить созданный заголовочный файл в bridging header — и Свифт код сможет увидеть функцию
serverURL().если надо чисто построить проект, то в принципе можно брать любой генератор. Visual Studio генератор пригодится, если хочется использовать Visual Studio IDE (например, для правки или отладки).
Возможно, надо использовать
CMAKE_EXE_LINKER_FLAGS.есть полностью «наша» статья, которая, как мне кажется, на порядок лучше: https://book.etudes.ru/articles/a4/
Могу рассказать об iOS опыте: как раз закончил портировать VCMI под iOS (правда, пулл реквест ещё не приняли). В процессе как раз и более-менее разобрался как надо пользоваться CMake, особенно для iOS проектов.
Для сборки зависимостей пока что создан отдельный скрипт, который выполняет условный
make installкаждой библиотеки в определенную папку (у меня отдельные папки для симулятора и устройства), что гарантирует стандартную структуру папок (include, lib и т.д.). После этого эта папка просто подается в переменнойCMAKE_PREFIX_PATHпри конфигурировании проекта — и все зависимости находятся «из коробки» (при условии, что FindXXX написаны адекватно). В принципе, никто не мешает класть зависимости и в разные папки, тогда надо каждую из них подавать вCMAKE_PREFIX_PATHкак список (через точку с запятой).Единственная проблема, с которой я столкнулся, была невозможность отыскать Boost — пришлось принудительно добавить
чтоб избавить пользователя указывать
CMAKE_FIND_ROOT_PATHна ту же папку вручную. Толком я так и не понял почему Boost хочет именно ее.Репозиторий со скриптом: https://github.com/kambala-decapitator/vcmi-ios-depends. В дальнейшем хочу попробовать перевести всё это на conan / vcpkg, сейчас как раз щупаю оба для macOS сборки на CI.
Кстати, достаточно хороший iOS toolchain уже существует, я использую его для сборки некоторых зависимостей. Сначала я его использовал и для приложения, но т.к. приложение собирается лишь Xcode генератором, оказалось, что достаточно лишь несколько нужных для кросс-компиляции переменных указать, что описано в документации.
в документации достаточно хорошо расписаны основные способы интеграции: https://doc.qt.io/qt-6/qtqml-index.html#integrating-qml-with-c-applications
на этой странице даже есть удобная диаграмма выбора оптимального способа: https://doc.qt.io/qt-6/qtqml-cppintegration-overview.html
я в этой ситуации пошел в НМУ, первый семестр пока идет плюс-минус нормально
Значит, это все-таки была верная рекомендация? Или особой разницы нет?