CMakeLists begrijpen

Grip krijgen op hoe bestanden CMakeLists.txt werken

CMake

In ons inleidende handboek gebruiken we CMake als het bouwsysteem voor onze toepassing, maar we hebben slechts alleen wat meer aandacht besteed aan een van onze bestanden CMakeLists.txt. Hier gaan we het in meer detail hebben over dit werkt.

CMake is nuttig omdat het ons is staat stelt om veel van de zaken die gedaan moeten worden alvorens te compileren te automatiseren.

CMakeLists.txt

Misschien herinnert u zich dit bestand CMakeLists.txt uit de eerste handleiding:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
cmake_minimum_required(VERSION 3.16)
project(helloworld)

set(KF_MIN_VERSION "5.68.0")
set(QT_MIN_VERSION "5.12.0")

find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)

set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})

include(KDEInstallDirs)
include(KDECMakeSettings)
include(KDECompilerSettings NO_POLICY_SCOPE)

find_package(Qt5 ${QT_MIN_VERSION} REQUIRED NO_MODULE COMPONENTS Core Quick Test Gui QuickControls2 Widgets)
find_package(KF5 ${KF_MIN_VERSION} REQUIRED COMPONENTS Kirigami2 I18n CoreAddons)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_subdirectory(src)

feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)

De eerste regel, project(helloworld) definieert de naam van het project.

Daarna stellen we de versies in van onze benodigde hulpmiddelen. cmake_minimum_required(VERSION 3.16) stelt de versie van CMake in die we zullen aanroepen. Daarna gebruiken we set() om variabelen te definiëren (KF5_MIN_VERSION en QT_MIN_VERSION) die de versies van KDE Frameworks en Qt bevatten.

Daarna krijgen we een sectie waar we een aantal noodzakelijke CMake en KDE-instellingen invoegen met gebruik van extra-cmake-modules. U zou zich nu niet te veel zorgen moeten maken over deze regels en we hoeven ze niet te wijzigen in deze handleiding.

De volgende sectie is belangrijk, omdat het specificeert welke afhankelijkheden we zullen inbrengen bij compileren. Laten we naar de eerste regel kijken:

find_package(KF5 ${KF5_MIN_VERSION} COMPONENTS Kirigami2 I18n CoreAddons WidgetsAddons)

  • find_package() zoekt en laadt de externe component.
  • Het eerste woord is het framework (KF5).
  • Daarna roepen we de variabele met de versies, die we instellen in de tweede regel, aan.
  • COMPONENTS is een parameter die vooraf gaat aan de specifieke componenten van het framework dat we zullen invoegen.
  • Elk woord na COMPONENTS refereert naar een specifieke component.

De laatste regel, add_subdirectory(src), wijst naar CMake in de map 'src/'.

1
2
add_executable(helloworld main.cpp resources.qrc)
target_link_libraries(helloworld Qt5::Quick Qt5::Qml Qt5::Gui Qt5::QuickControls2 Qt5::Widgets KF5::Kirigami2 KF5::I18n)

Omdat het zwaarste gedaan wordt door het eerste bestand, is deze heel wat korter.

  • [set()] (https://cmake.org/cmake/help/latest/command/set.html) wordt gebruikt om helloworld_SRCS in te stellen in main.cpp en resources.qrc (als we beslissen om extra C++ bestanden aan te maken, die we nodig zullen hebben om ze hier ook toe te voegen)
  • add_executable() zorgt voor het geven van een naam aan ons uitvoerbare bestand en het pakken van de bestanden nodig om het aan te maken
  • target_link_libraries koppelt dynamisch de bibliotheken, die gebruikt worden in onze code, aan ons uitvoerbare bestand.

Deze opzet zal bruikbaar zijn bij ontwikkelen van de meeste Kirigami toepassingen.