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