LINUX.ORG.RU

Как указать cmake нужную сборку qt5?

 , ,


0

1

Есть кросплатформенная софтина, которая зависит от qt5 и собирается с помощью cmake.
Все работает просто отлично, но захотелось мне собрать эту софтину в линухе но под винду. В качестве виндового тулчейна использую MXE. Все нужные компиляторы, библиотеки и т д и т п собраны и работают. Ясен пень, что подсовываю cmake нужный CMAKE_TOOLCHAIN_FILE. Но эта хрень с маниакальной настойчивостью юзает cmake-модули из хоста!
Собсно вопрос - как cmake указать, какой билд qt5 мне нужен?

Пока захардкодил пути вида:
set(Qt5Core_DIR «/bla-bla-bla/mxe/usr/i686-w64-mingw32.shared/qt5/lib/cmake/Qt5Core»)

Может есть ли другой, более кошерный метод?

Dendy




★★★

Ответ на: комментарий от pon4ik

Но для кросскомпиляции тебе видимо придётся таки играться с префиксом.

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

Ага, я вначале тоже CMAKE_MODULE_PATH крутил.
Увы, результат отрицательный

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

Не, это совсем не то. Эти переменные для поиска хидеров, библиотек, программ. Они у меня установлены и есть не просят.

Вот, к примеру, для поиска Qt4 я устанавливаю всего лишь одну переменную - QT_QMAKE_EXECUTABLE. По этой переменной cmake-модули из системного cmake находят билд Qt, на который я указал. Точнее находят заданный qmake и с его помощью узнают все остальное. Все легко и просто. А вот такой простой конфигурации для qt5 я чето не нахожу.

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

Не, это совсем не то. Эти переменные для поиска хидеров, библиотек, программ.

Почему? Qt 4 и Qt 5 ведь ищутся через find_package, а она как раз юзает эти переменные.

Вот, к примеру, для поиска Qt4 я устанавливаю всего лишь одну переменную - QT_QMAKE_EXECUTABLE.

You're doing it wrong. Для поиска культей 4 кошерно использовать find_package, предварительно выставив нужный префикс в CMAKE_PREFIX_PATH или CMAKE_FIND_ROOT_PATH. Для поиска используется стандартный модуль FindQt4.cmake, идущий в комплекте с CMake. Это первый режим find_package, т.н. Module Mode. FindQt4.cmake сам находит bin/qmake относительно заданного префикса и конфигурирует все пути автоматом. QT_QMAKE_EXECUTABLE задавать руками не нужно.

Культи 5 используют второй режим find_package (Config Mode). В этом режиме find_package ищет файлы вида <name>Config.cmake, опять же используя CMAKE_PREFIX_PATH/CMAKE_FIND_ROOT_PATH в качестве префикса. Кросскомпилировать я не пробовал, на на самой винде у меня все отлично ищется через CMAKE_PREFIX_PATH. А тебе по идее нужно все либы накомпилять в единый каталог с плоской структурой bin, include, lib, share и прописать его в CMAKE_FIND_ROOT_PATH. Тогда все операции поиска будут проводиться относительно нового корня.

archie ()

Для начала собрать Qt5 из исходников с mingw:

./configure -prefix $HOME/qt5-mingw -xplatform win32-g++ -device-option CROSS_COMPILE=i686-w64-mingw32-
make install

Префикс i686-w64-mingw32- может быть другим в зависимости от дистрибутива.

Мой тулчейн-файл для CMake:

set(CMAKE_SYSTEM_NAME Windows)

set(CMAKE_C_COMPILER   i686-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)

set(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)

Собираем свой проект:

cmake -D CMAKE_TOOLCHAIN_FILE=/path/to/toolchain-file -D Qt5_DIR=$HOME/qt5-mingw/lib/cmake/Qt5 /path/to/your/project
make
Dendy ★★★★★ ()
Ответ на: комментарий от Dendy

Спасибо -D Qt5_DIR=$HOME/qt5-mingw/lib/cmake/Qt5 - это именно то, чего нехватало.

Правда пришлось еще вместо стопки

find_package(Qt5Core)
find_package(Qt5Gui)
Написать более по модному find_package(Qt5 REQUIRED Core Gui)

Шо интерсно, в мануалах про такой вариант чето помалкивают. А в старых так вообще, пишут, что так нельзя.

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

find_package(Qt5Core) это вообще очень древний стиль со времён CMake 2.8.9, когда ещё был костыль qt5_use_modules(). С тех пор как в CMake добавили возможность подхватывать опции сборки из импортируемых модулей линковать Qt нужно через стандартный target_link_libraries(myapp Qt5::Core Qt5::Gui).

Кстати, есть ещё одна проблема с Qt5_DIR, она не запоминается в кеше, потому что нигде не фигурирует в find_path(). Поэтому советую делать так:

set(Qt5_DIR "" CACHE PATH "")
find_package(Qt5 REQUIRED Core Gui)

Иначе после неявной реконфигурации ругнётся, что снова не может найти Qt. Надо бы багрепорт троллям написать.

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

Хм, у меня сейчас по факту find_package(Qt5 REQUIRED Core Gui) и qt5_use_modules() уживаются в одном файле )

Вообще с qt5+cmake бардак получается. Существует дофигища способов все это юзать и какбэ не очевидно, какой из них правильный. Надеюсь, что уже ничего переписывать не будут.

Я себе Qt5_DIR в тулчейн-файл засунул. У меня в рамках тулчейна всего один qt5. Так что пусть там валяется.

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

Вообще с qt5+cmake бардак получается.

Давно уже всё причесали. Просто смотрите свежие примеры, а не двухлетней давности. И забудьте про qt5_use_modules(), только target_link_libraries(). И Qt5_DIR в тулчейн не стоит засовывать, с этого бардак и начинается.

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

Ну да, ну да, захожу сюда - http://doc.qt.io/qt-5/cmake-manual.html
И вижу

# Find the QtWidgets library
find_package(Qt5Widgets)
Хотя в заголовке бодро так - Qt-5.4

И Qt5_DIR в тулчейн не стоит засовывать, с этого бардак и начинается

А чего там плохого может случится?
Я так в тулчейн и для Qt4 путь к qmake прописал. Ни разу проблем небыло.
Может у нас задачи разные?

ОФФ: А у тебя получалось собрать QtWebEngine под mingw?

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

find_package(Qt5Widgets) — по идее это то же, что и find_package(Qt5 Widgets). Разница только в том, что теперь нужно -D Qt5Widgets_DIR=..., и так для каждого модуля, что не есть удобно.

А чего там плохого может случится?

Тулчейн он как бы связан с sysroot, если нужна своя библиотека, указывать её отдельно в конфигурации. Тогда тулчейн файл получится универсальным. Но если нужна ровно одна библиотека Qt5, без возможности подмены, то сгодится.

ОФФ: А у тебя получалось собрать QtWebEngine под mingw?

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

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

Но если нужна ровно одна библиотека Qt5, без возможности подмены, то сгодится.

Ага, как раз мой случай. Для меня тулчейн - это не только компилятор, но и стопка библиотек, которые я не ковыряю. Типа стейбл.

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

Имхо для десктопа разницы особо нет. Все работает вменяемо.
А вот для ембедщины как не крутись - тормозит. Новый WebEngine вообще 65метров+ занимает. И как его на девайс с 512оперативы пихать?

AF ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.