Кросс компиляция, посоветуйте best practice
От: SaZ  
Дата: 22.09.25 11:09
Оценка:
Всем привет.

У меня есть пет проект, небольшая консольная утилита которая считает рейтинг детишкам для одной спортивной организации. Берёт на вход текстовые файлы с результатами соревнований, обрабатывает их в соответствии с правилами и ведёт учёт рейтинга. Но не суть.
Стек технологий такой: 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 где запускается линуксовая версия моей тулзы. Но у людей в этой спортивной организации очень слабые компы и они еле тянут всё это дело, поэтому хочется нативное решение.
Re: Кросс компиляция, посоветуйте best practice
От: comm Россия http://bipulse.ru
Дата: 23.09.25 21:54
Оценка: 4 (1)
Здравствуйте, SaZ, Вы писали:


SaZ>Вопрос: как завезти кросс-компиляцию на моём стеке с минимальной головной болью?


1. https://github.com/mstorsjo/msvc-wine/ Мы вот эту зверушку нашли для сборки MSVC на линухе. Будет ли работать с ARM не знаю

2. Можно поднять https://github.com/dockur/windows — это реально винды в Qemu , и выполнить сборку в нём.

3. Если утилита консольная, то менять компилер под платформу, это самое надежное.

4. Можно купить VDS с виндой на неделю, и на нем развернуть сборку. После 3 установки появится батник автоматической настройки окружения.

5. Можно купить VDS с линухом на постоянку в качестве CI/CD сервера (1Гиг памяти) понять на нем Laminar CI/CD и с с него стартовать дорогие сервера на ServerSpace по API (32 памяти 8 ядер) для время сборки (стартовал сервер — собрал — потушил). Но нужно организовать быструю доставку окружения. Мы применяем для интеграционных тестов, поднятие сервера 2 минуты из 20 всего прогона. MSVC будет дольше ехать. (сборка для виндов по рецепту 1)


Итого: вместо "как собрать на моем стеке" перейти к "Где купить стек для сборки дешёво".
С уважением, Алексей Васильев. http://bipulse.ru
Re: Кросс компиляция, посоветуйте best practice
От: bnk СССР http://unmanagedvisio.com/
Дата: 23.09.25 22:09
Оценка: 4 (1) +1
Здравствуйте, SaZ, Вы писали:

SaZ>Пока что, как временное решение на стороне клиента — WSL где запускается линуксовая версия моей тулзы. Но у людей в этой спортивной организации очень слабые компы и они еле тянут всё это дело, поэтому хочется нативное решение.


Я бы не заморачивался и сделал через CI/CD через Azure Devops (бесплатно до 5 человек и 1800 минут сборки в месяц).
Можно выбрать хост (агнета) — винда, linux, macos.
Можно соединить с GitHub например (в т.ч. приватным репозиторием), чтобы собиралось оттуда (или напрямую пушить из локального через git)
Отредактировано 30.09.2025 15:06 bnk . Предыдущая версия . Еще …
Отредактировано 23.09.2025 22:10 bnk . Предыдущая версия .
Re: Кросс компиляция, посоветуйте best practice
От: kov_serg Россия  
Дата: 24.09.25 12:30
Оценка: +1
Здравствуйте, 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
От: SaZ  
Дата: 24.09.25 21:04
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>...

_>У вас кроме русского языка других нет? Если нет выкидывайте ICU и сделайте сортировку utf-8 без ICU там всё очень просто.

Пока нет, но как я писал выше — не работает сортировка. Некорректно сравниваются буквы е и ё когда строки в utf-8, я только из-за этого и прикрутил icu. Я понимаю, что можно принудительно выставить локаль и перегнать всё в ascii, но я не ищу костылей.


_>А нахрена людям вообще собирать у себя вашу прогу? Тем более если это "небольшая консольная утилита"? Вам не кажется что вы сильно переусложняете. Скачал, распаковал и алга.


Потому что я хочу отдать исходники и отказаться от сопровождения по причине того что я не могу это делать оперативно. Но я не люблю отдавать недоделанные вещи. Мне надо так чтобы джун без опыта работы в пол тычка смог всё собрать. А без поддержки никак, потому что каждый год уточняются формулы расчёта, плюс периодически вылазят баги.

И главное, я в целом хочу получить опыт в кросс-компиляции.
Отредактировано 24.09.2025 21:29 SaZ . Предыдущая версия . Еще …
Отредактировано 24.09.2025 21:06 SaZ . Предыдущая версия .
Отредактировано 24.09.2025 21:05 SaZ . Предыдущая версия .
Re[3]: Кросс компиляция, посоветуйте best practice
От: pilgrim_ Россия  
Дата: 26.09.25 19:58
Оценка: 2 (1)
Здравствуйте, SaZ, Вы писали:

SaZ>Здравствуйте, kov_serg, Вы писали:


_>>...

_>>У вас кроме русского языка других нет? Если нет выкидывайте ICU и сделайте сортировку utf-8 без ICU там всё очень просто.

SaZ>Пока нет, но как я писал выше — не работает сортировка. Некорректно сравниваются буквы е и ё когда строки в utf-8, я только из-за этого и прикрутил icu. Я понимаю, что можно принудительно выставить локаль и перегнать всё в ascii, но я не ищу костылей.


Ну вот попробовал (msvc/gcc linux), setlocale/strcoll (сравнение строк с учётом локали), всё норм, без всяких доп. преобразований
Re[4]: Кросс компиляция, посоветуйте best practice
От: SaZ  
Дата: 26.09.25 20:07
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>...

_>Ну вот попробовал (msvc/gcc linux), setlocale/strcoll (сравнение строк с учётом локали), всё норм, без всяких доп. преобразований

Интересно, большое спасибо за то что поковырялись. Как вернусь из командировки — попробую и отпишусь. Может воспроизведу свою исходную проблему. Но я точно помню, что у меня на маке и на винде результаты отличались. Правда я не пробовал хардкодить строки, а читал из текстовых файлов. Но судя по префиксу не должно быть разницы.

Update: тут внезапно вспомнил, что просили делать такую сортировку, чтобы е и ё трактовались как е. Если что, вот примерно так выглядит выхлоп.
Отредактировано 26.09.2025 20:10 SaZ . Предыдущая версия .
Re[5]: Кросс компиляция, посоветуйте best practice
От: pilgrim_ Россия  
Дата: 26.09.25 21:20
Оценка: 4 (1)
Здравствуйте, SaZ, Вы писали:

SaZ>Update: тут внезапно вспомнил, что просили делать такую сортировку, чтобы е и ё трактовались как е. Если что, вот примерно так выглядит выхлоп.


Ну тут имхо и спец. локали не нужны, в функции сравнения заменяем у строк все "ё"/"Ё" на "е"/"Е" и используем сравнение по умолчанию, может не совсем оптимально, но просто: https://coliru.stacked-crooked.com/a/59a76854420c9dc4

ps: для замены подстрок для наглядности заюзал boost, результат в точности как у тебя
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.