LINUX.ORG.RU

Научите кросскомпилять Qt6

 , ,


0

3

Пилю мобильную аппликуху, естественно выбрал культи и кумээл. В общем-то с запуском в эмуляторе проблем нет, но хочется без лишних прослоек конпелять и запускать сразу на хосте.

При добавлении десктопа в сборку мобильного проекта воткнулся в https://forum.qt.io/topic/137551/cmake-finds-cross-compiled-qt6-config-files-....

Если я правильно понял, то кросскомпиляция из коробки не поддерживается и придется докидывать переменные для симейка.

Проблема в том, что от этого кошмара я всегда старался держаться как можно дальше, и не очень понимаю куда именно должен указывать, например, CMAKE_TOOLCHAIN_FILE и прочее.

Кубээс, как единственный вменяемый сборщик, к сожалению в кьюткераторе поддерживается по инерции и билд для мобилки через него я пока ниасилил.

Update.

Короче в шестых культях троли напилили какой-то фигни в симейки, которые кладут в инсталлер и вся эта фигня нормально не работает.

Проблему решил переездом на QBS, благо QtCreator его до сих пор поддерживает, правда кубеесные файлы там тоже не без проблем (пути до андройдных джарок резолвит неверно), но от него у меня хотя бы не взрывается мозг в отличие от симейка и я нашёл куда пихнуть симлинк.

★★★★★

Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

ну там просто в профайлах «добавить платформу» или как-то так, при этом возможно надо иметь собранные под целевую платформу кути в том числе если это кросс-компиляция с mingw

Syncro ★★★★★
()
Ответ на: комментарий от Syncro

Там симейковые скрипты, которые генерит куюткреатор не срабатывают нормально. Если создавать отдельный десктопный проект то всё норм. А вот один на две платформы - нет.

ya-betmen ★★★★★
() автор топика
Последнее исправление: ya-betmen (всего исправлений: 1)

не очень понимаю куда именно должен указывать, например, CMAKE_TOOLCHAIN_FILE и прочее.

например в опции cmake, когда конфигурируешь проект.

cmake -DCMAKE_TOOLCHAIN_FILE=...

можно в preset закинуть, чтобы потом руками не писать.

А вообще, надо читать инструкции и действовать по ним.

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от ya-betmen

Под андроид я ничего не собирал, но кросскомпиляция у меня выглядит так:

cmake -S /path/to/project -B /tmp/build -DCMAKE_TOOLCHAIN_FILE=/path/to/sysroot/usr/share/cmake/toolchain.cmake -DCMAKE_BUILD_TYPE=Release

toolchain.cmake выглядит так:

set(CMAKE_SYSTEM_NAME Linux)    
set(CMAKE_SYSTEM_PROCESSOR aarch64)    
    
set(CMAKE_SYSROOT /path/to/sysroot)    
set(CMAKE_FIND_ROOT_PATH /path/to/sysroot)    
    
set(CMAKE_C_COMPILER /path/to/sysroot/bin/sysroot-gcc)       
set(CMAKE_C_COMPILER_TARGET aarch64-linux-gnu)    
    
set(CMAKE_CXX_COMPILER /path/to/sysroot/bin/sysroot-g++)       
set(CMAKE_CXX_COMPILER_TARGET aarch64-linux-gnu)    
    
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)    
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)    
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)    
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)    
    
set(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES SYSTEM /path/to/sysroot/usr/include/c++/10    
/path/to/sysroot/usr/include/aarch64-linux-gnu/c++/10    
/path/to/sysroot/usr/include    
/path/to/sysroot/usr/include/aarch64-linux-gnu)    
    
set(CMAKE_C_STANDARD_INCLUDE_DIRECTORIES SYSTEM /path/to/sysroot/usr/include/c++/10    
/path/to/sysroot/usr/include/aarch64-linux-gnu/c++/10    
/path/to/sysroot/usr/include    
/path/to/sysroot/usr/include/aarch64-linux-gnu)    

sysroot-gcc и sysroot-g++ - это просто обёртка над компилятором с указанием доп. опций. Она не обязательна, но мне так было удобнее:

#!/bin/bash    
    
/usr/bin/aarch64-linux-gnu-gcc -isystem /path/to/sysroot/usr/include/c++/10 -isystem /path/to/sysroot/usr/include/aarch64-linux-gnu/c++/10 -isystem /path/to/sysroot/usr/include
 -isystem /path/to/sysroot/usr/include/aarch64-linux-gnu --sysroot=/path/to/sysroot $@

В общем случае, чтобы что-то кросскомпилить тебе нужно указать компилятор, которым собирать и указать компилятору, чтобы он использовал инклюды и библиотеки из конкретного buildroot. Ну и специфичные опции если нужны. В остальном точно такой же cmake.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Для qt я ещё утилиты в sysroot менял на хостовые и конфиги. Но это для qt5, впрочем для qt6 должно быть не много отличий.

Наверняка есть более изящное решение, но я решил не запариваться с этим.

def conf_qt5(root: str, wrapped_cc: str, wrapped_cxx: str):    
    """Создаёт qmake, указывающий на qt5 из root, задаёт компиляторы для кросс-компиляции."""    
    with pushd(root):    
        # Заменяем собранные по args.arch утилиты на собранные под x86_64, т.к. их надо запускать на хосте.    
        for tool in ['qmake', 'moc', 'rcc', 'uic', 'lrelease']:    
            host_path = f'/usr/bin/{tool}-qt5'    
            if exists(host_path):    
                cmd('ln -svf {} {}', host_path, f'{root}/usr/lib64/qt5/bin/{tool}')    
    
        qtconf = f'{root}/usr/lib64/qt5/qt.conf'    
        with open(qtconf, 'w') as cfg:    
            cfg.write(f"""[Paths]    
Prefix={root}/usr    
ArchData=lib64/qt5    
Binaries=lib64/qt5/bin    
Data=share/qt5    
Documentation=share/qt5/doc    
Examples=lib64/qt5/examples    
Headers=include/qt5    
HostBinaries=lib64/qt5/bin    
HostData=lib64/qt5    
HostLibraries=lib64    
Imports=lib64/qt5/imports    
Libraries=lib64    
LibraryExecutables=lib64/qt5/libexec    
Plugins=lib64/qt5/plugins    
Qml2Imports=lib64/qt5/qml    
Settings=/etc/xdg    
Translations=share/qt5/translations    
""")    
    
        qmake_file = f'{root}/bin/qmake'    
        with open(qmake_file, 'w') as qmake:    
            qmake.write(f"""#!/bin/bash\n\n{root}/usr/lib64/qt5/bin/qmake $@ -qtconf {qtconf}\n""")    
        chmod(qmake_file, 0o755)    
        qmake_spec = f'{root}/usr/lib64/qt5/mkspecs/common/g++-base.conf'    
        if exists(qmake_spec):    
            cmd("sed -i 's|$${{CROSS_COMPILE}}gcc|{}|g' {}", wrapped_cc, qmake_spec)    
            cmd("sed -i 's|$${{CROSS_COMPILE}}g++|{}|g' {}", wrapped_cxx, qmake_spec)    
Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

Под андроид я ничего не собирал, но кросскомпиляция у меня выглядит так

под андроид ровно то же самое - файл тулчейна там идет в комплекте с NDK, плюс нужно указать пару опций вроде ANDROID_ABI, которые указаны в доке https://developer.android.com/ndk/guides/cmake#command-line

Lrrr ★★★★★
()
Ответ на: комментарий от Xintrea

ОП апдейтнул а не культи же. На QBS переехал, у них там кривые конфиги (возможно потому что я не в дефолтный путь ставил) но тут я хотя бы понял что ему не понравилось.

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

ОП апдейтнул а не культи же.

Блин, ты нормально можешь выражаться? Что в твоем случае ОП? Это Qt, QtCreator, Cmake, Linux, ядро, что-то еще? Что, с какой на какую версию ты апдейтнул?

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

OP – Original Post, стартовый пост темы.

Он отредактировал (обновил) стартовый пост темы, добавив в него решение проблемы – переезд с угрёбищного и кривого CMake на QBS.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Да вроде норм написал, всегда считал ТС, ОП и прочее достаточно устаканившейся форумной терминологией.

ya-betmen ★★★★★
() автор топика
Последнее исправление: ya-betmen (всего исправлений: 1)
Ответ на: комментарий от Xintrea

На деле когда у тебя есть декларативная система типа кубээса то нужно научить её всем приседаниям и прыжкам в сторону которые нужны проекту.

Когда у тебя есть скриптовая система типа симейка то вся сложность переезжает в сами скрипты.

Отсюда закономерный результат 1.5 человека пилившие кубээс ниасили всего многообразия культей за разумное время. Ну и теперь разгребать эти симейковские портянки, которые в каждом проекте разные - никакого желания нет.

ya-betmen ★★★★★
() автор топика
Ответ на: комментарий от ya-betmen

Хорошая система сборки должна быть незаметной для разработчика, а её документация должна быть внятной и понятной, а ты с ней три дня ковырялся и так и не разобрался.

Вывод: хорошую систему сборки CMake не назовут.

EXL ★★★★★
()
Ответ на: комментарий от EXL

То, что на систему сборки ругаются ещё не означает, что она хорошая. Это означает, что ей кто-то пользуется.

Но что-то я ругани в адрес autotools давно не видел, она, благо, уже отмирает.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от Ivan_qrt

И CMake отомрёт, благо Meson его достаточно интенсивно и успешно выдавливает из Linux-аффилированных проектов.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

Как только meson станет популярным, и его начнут совать в каждый новый проект, окажется что эта система сборки полное говно. Потому что пользователи лепят сборочный сценарий из кусков от SO и советов ChatGPT.

Negorro
()
Ответ на: комментарий от EXL

И CMake отомрёт, благо Meson его достаточно интенсивно и успешно выдавливает

Но ведь Meson не может работать без Cmake, потому что через него делает поиск установленных библиотек.

Xintrea ★★★★★
()
Ответ на: комментарий от Xintrea

Но ведь Meson не может работать без Cmake, потому что через него делает поиск установленных библиотек.

Прежде чем делать голословные утверждения предлагаю прочитать: https://mesonbuild.com/Dependencies.html#dependency-detection-method

EXL ★★★★★
()
Ответ на: комментарий от Xintrea

Meson по умолчанию использует pkg-config, затем cmake. Но для некоторых пакетов лучше указать способ поиска вручную. Такой приятный инструмент для лёгкой сборки.

Negorro
()
Последнее исправление: Negorro (всего исправлений: 1)
Ответ на: комментарий от EXL

Meson

На мелких проектах лакониченее симейка с его башеобразным синтаксисом. Но больших такая же каша из set_variable, get_variable, if/else и прочего ad-hoc треша.

ya-betmen ★★★★★
() автор топика