mafulechka
Сәуір 23, 2020, 2:56 Т.Қ.

Нұсқасыз CMake мақсаттары (Qt 5.15)

Разработчики Qt работают над тем, чтобы портировать Qt 6 на CMake в качестве внутренней системы сборки. Хотя до Qt 6 еще несколько месяцев, вы уже можете увидеть некоторые преимущества этой работы в Qt 5.15. Кристиан Адам (Cristian Adam) уже писал в блоге об улучшениях в CMake 3.17 и о том, как, например, улучшился AUTOMOC в QT 5.15. Эта статья о том, как вы можете подготовиться к Qt 6 в своих проектах CMake.


Оглядываясь назад: с Qt 4 по Qt 5

Хотя Qt 4 - Qt 5 были в значительной степени совместимы с исходным кодом с точки зрения C++, к сожалению, это не относится к самой интеграции CMake. Иногда вам приходилось адаптировать большую часть кода CMake, в случае интеграции Qt.

В настоящее время CMake гораздо чаще используется в проектах Qt, а сама поддержка CMake значительно повзрослела. Следовательно, разработчики не планируют вносить какие-либо радикальные изменения в интеграцию, а вместо этого стараются сделать переход, как можно более плавным.

Проблема: версионные цели и команды

Одна очевидная проблема заключается в том, что в основном все CMake API (цели, переменные, команды), которые предоставляет Qt, содержат в названии основную версию Qt. Это верно даже для очень простых примеров:

cmake_minimum_required(VERSION 3.5)
project(hellotr LANGUAGES CXX)

find_package(Qt5 COMPONENTS Widgets LinguistTools REQUIRED)
qt5_add_translation(QM_FILES hellotr_en.ts)
add_executable(hellotr
  main.cpp
  ${QM_FILES}
)
target_link_libraries(hellotr Qt5::Widgets)

Теперь вы можете утверждать, что, при условии, что фактическая семантика не изменяется, замена всех вызовов Qt5::, qt5_ в вашем файле CMake на Qt6::, qt6_ достаточно проста. Однако это не поможет вам, если вы хотите какое-то время поддерживать Qt 5 и Qt 6.

Безверсионные цели и команды

Итак, позвольте вам представить новые безверсионные цели и команды в Qt 5.15. Приведенный выше пример можно записать так:

cmake_minimum_required(VERSION 3.5)
project(hellotr LANGUAGES CXX)

find_package(Qt5 5.15 COMPONENTS Widgets LinguistTools REQUIRED)
qt_add_translation(QM_FILES hellotr_en.ts)
add_executable(hellotr
  main.cpp
  ${QM_FILES}
)
target_link_libraries(hellotr Qt::Widgets)

За исключением вызова find_package это должно работать и для Qt 6.

Если вас интересует дополнительный аргумент 5.15 для find_package: это позволяет CMake вывести ошибку с соответствующим сообщением об ошибке, если ваша версия Qt старше Qt 5.15.

Вы можете отказаться от этих новых целей и команд, установив переменные QT_NO_CREATE_VERSIONLESS_TARGETS или QT_NO_CREATE_VERSIONLESS_FUNCTIONS перед find_package. Это полезно, например, если вы уже определили их сами или, если вы все ещё хотите получить доступ к qt_wrap_cpp в Qt 3.

Смешивание Qt 5 и Qt 6

Позвольте начать с большой оговорки: Qt не поддерживает смешивание разных версий Qt в одном приложении! В любом случае, существуют расширенные варианты использования, в которых вы можете создать отдельные артефакты, используя Qt 5 и Qt 6 в одном проекте.

Для этих случаев вы можете задать для новой переменной QT_DEFAULT_MAJOR_VERSION значение 5 или 6. Если эта переменная установлена перед вызовом find_package, загружающим Qt 5 или Qt 6, безверсионные функции будут использовать логику из соответствующей версии Qt.

Перспективы на будущее

С приближением первого выпуска Qt 5.15 разработчики будут все более и более консервативно касаться существующей инфраструктуры CMake в этой версии. В любом случае, планируется еще улучшить документацию о том, продуктивнее использовать CMake с Qt.

В Qt 6 увидим гораздо больше API, чтобы не только использовать модули Qt, но также и то, как определять ваши собственные модули Qt и плагины.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз