У меня есть пет проект, небольшая консольная утилита которая считает рейтинг детишкам для одной спортивной организации. Берёт на вход текстовые файлы с результатами соревнований, обрабатывает их в соответствии с правилами и ведёт учёт рейтинга. Но не суть.
Стек технологий такой: C++23, boost with ICU, fmt, sqlite_orm.
Сборка: в корне проекта есть vcpkg.json на который натравливается vcpkg и собирает в папку third_party все зависимости. Далее в CMakeLists.txt я просто передаю путь к этой папке и всё прекрасно разруливается через find_package (иногда в режиме CONFIG, иногда нет). Соответственно для винды/мака/линукса я написал простенькие bootstrap.bat/bootstrap.sh которые при необходимости выкачивают vcpkg и собирают зависимости.
Основная платформа разработки: macos, clang21.
ICU нужен потому что приходится делать всякие выборки/сортировки русских имён и фамилий в utf-8, а обработка буквы Ë без icu ведёт себя по разному на разных платформах. Ну то есть если я хочу правильно отсортировать вектор не ascii utf-8 строк по алфавиту то тут без icu никак.
Никакого CI я не настраивал, нет на это ресурсов, просто собирал под маком версию для мака, потом загружался в винду и собирал версию для винды.
Сейчас мне стало лень заморачиваться с виндой, ибо я переехал на армовский мак. И хочу завезти кросс компиляцию.
Вопрос: как завезти кросс-компиляцию на моём стеке с минимальной головной болью?
Что я пробовал: dockcross + mingw64. Но возникла проблема с кросс-компиляцией ICU (где-то внутри скриптов сборки самого ICU он не понимает разницы между хостом в лице докер контейнера и таргетом — виндой). На отладку и патч сборки ICU недостаточно свободного времени.
У меня есть стойкое чувство, что я что-то делаю не так. Поиск в интернете по кросс компиляции ICU мне ничего особого не дал.
Пока что, как временное решение на стороне клиента — WSL где запускается линуксовая версия моей тулзы. Но у людей в этой спортивной организации очень слабые компы и они еле тянут всё это дело, поэтому хочется нативное решение.
3. Если утилита консольная, то менять компилер под платформу, это самое надежное.
4. Можно купить VDS с виндой на неделю, и на нем развернуть сборку. После 3 установки появится батник автоматической настройки окружения.
5. Можно купить VDS с линухом на постоянку в качестве CI/CD сервера (1Гиг памяти) понять на нем Laminar CI/CD и с с него стартовать дорогие сервера на ServerSpace по API (32 памяти 8 ядер) для время сборки (стартовал сервер — собрал — потушил). Но нужно организовать быструю доставку окружения. Мы применяем для интеграционных тестов, поднятие сервера 2 минуты из 20 всего прогона. MSVC будет дольше ехать. (сборка для виндов по рецепту 1)
Итого: вместо "как собрать на моем стеке" перейти к "Где купить стек для сборки дешёво".
Здравствуйте, SaZ, Вы писали:
SaZ>Пока что, как временное решение на стороне клиента — WSL где запускается линуксовая версия моей тулзы. Но у людей в этой спортивной организации очень слабые компы и они еле тянут всё это дело, поэтому хочется нативное решение.
Я бы не заморачивался и сделал через CI/CD через Azure Devops (бесплатно до 5 человек и 1800 минут сборки в месяц).
Можно выбрать хост (агнета) — винда, linux, macos.
Можно соединить с GitHub например (в т.ч. приватным репозиторием), чтобы собиралось оттуда (или напрямую пушить из локального через git)
Здравствуйте, SaZ, Вы писали:
SaZ>ICU нужен потому что приходится делать всякие выборки/сортировки русских имён и фамилий в utf-8, а обработка буквы Ë без icu ведёт себя по разному на разных платформах. Ну то есть если я хочу правильно отсортировать вектор не ascii utf-8 строк по алфавиту то тут без icu никак.
У вас кроме русского языка других нет? Если нет выкидывайте ICU и сделайте сортировку utf-8 без ICU там всё очень просто.
SaZ>Никакого CI я не настраивал, нет на это ресурсов, просто собирал под маком версию для мака, потом загружался в винду и собирал версию для винды. SaZ>Сейчас мне стало лень заморачиваться с виндой, ибо я переехал на армовский мак. И хочу завезти кросс компиляцию.
SaZ>Вопрос: как завезти кросс-компиляцию на моём стеке с минимальной головной болью?
SaZ>Что я пробовал: dockcross + mingw64. Но возникла проблема с кросс-компиляцией ICU (где-то внутри скриптов сборки самого ICU он не понимает разницы между хостом в лице докер контейнера и таргетом — виндой). На отладку и патч сборки ICU недостаточно свободного времени. SaZ>У меня есть стойкое чувство, что я что-то делаю не так. Поиск в интернете по кросс компиляции ICU мне ничего особого не дал.
SaZ>Пока что, как временное решение на стороне клиента — WSL где запускается линуксовая версия моей тулзы. Но у людей в этой спортивной организации очень слабые компы и они еле тянут всё это дело, поэтому хочется нативное решение.
А нахрена людям вообще собирать у себя вашу прогу? Тем более если это "небольшая консольная утилита"? Вам не кажется что вы сильно переусложняете. Скачал, распаковал и алга.
Re[2]: Кросс компиляция, посоветуйте best practice
Здравствуйте, kov_serg, Вы писали:
_>... _>У вас кроме русского языка других нет? Если нет выкидывайте ICU и сделайте сортировку utf-8 без ICU там всё очень просто.
Пока нет, но как я писал выше — не работает сортировка. Некорректно сравниваются буквы е и ё когда строки в utf-8, я только из-за этого и прикрутил icu. Я понимаю, что можно принудительно выставить локаль и перегнать всё в ascii, но я не ищу костылей.
_>А нахрена людям вообще собирать у себя вашу прогу? Тем более если это "небольшая консольная утилита"? Вам не кажется что вы сильно переусложняете. Скачал, распаковал и алга.
Потому что я хочу отдать исходники и отказаться от сопровождения по причине того что я не могу это делать оперативно. Но я не люблю отдавать недоделанные вещи. Мне надо так чтобы джун без опыта работы в пол тычка смог всё собрать. А без поддержки никак, потому что каждый год уточняются формулы расчёта, плюс периодически вылазят баги.
И главное, я в целом хочу получить опыт в кросс-компиляции.
Здравствуйте, SaZ, Вы писали:
SaZ>Здравствуйте, kov_serg, Вы писали:
_>>... _>>У вас кроме русского языка других нет? Если нет выкидывайте ICU и сделайте сортировку utf-8 без ICU там всё очень просто.
SaZ>Пока нет, но как я писал выше — не работает сортировка. Некорректно сравниваются буквы е и ё когда строки в utf-8, я только из-за этого и прикрутил icu. Я понимаю, что можно принудительно выставить локаль и перегнать всё в ascii, но я не ищу костылей.
Ну вот попробовал (msvc/gcc linux), setlocale/strcoll (сравнение строк с учётом локали), всё норм, без всяких доп. преобразований
Re[4]: Кросс компиляция, посоветуйте best practice
Здравствуйте, pilgrim_, Вы писали:
_>... _>Ну вот попробовал (msvc/gcc linux), setlocale/strcoll (сравнение строк с учётом локали), всё норм, без всяких доп. преобразований
Интересно, большое спасибо за то что поковырялись. Как вернусь из командировки — попробую и отпишусь. Может воспроизведу свою исходную проблему. Но я точно помню, что у меня на маке и на винде результаты отличались. Правда я не пробовал хардкодить строки, а читал из текстовых файлов. Но судя по префиксу не должно быть разницы.
Update: тут внезапно вспомнил, что просили делать такую сортировку, чтобы е и ё трактовались как е. Если что, вот примерно так выглядит выхлоп.
Здравствуйте, SaZ, Вы писали:
SaZ>Update: тут внезапно вспомнил, что просили делать такую сортировку, чтобы е и ё трактовались как е. Если что, вот примерно так выглядит выхлоп.
Ну тут имхо и спец. локали не нужны, в функции сравнения заменяем у строк все "ё"/"Ё" на "е"/"Е" и используем сравнение по умолчанию, может не совсем оптимально, но просто: https://coliru.stacked-crooked.com/a/59a76854420c9dc4
ps: для замены подстрок для наглядности заюзал boost, результат в точности как у тебя