Разработчики 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 и плагины.