mafulechka
23 квітня 2020 р. 14: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 та плагіни.

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up