Razumevanje CMakeLists

Kako se spoprijeti z delovanjem datotek CMakeLists.txt

CMake

V naši uvodni vaji smo uporabili CMake kot sistem gradnje za našo aplikacijo, vendar smo bili le resnično pozorni na enega od naših CMakeLists. Tukaj bomo podrobneje preučili, kako delujejo CMakeLists.

CMake je uporaben, ker nam omogoča avtomatizacijo veliko stvari, ki jih je treba storiti pred prevajanjem.

CMakeLists.txt

Morda se spomnite datoteke CMakeLists iz prve vaje:

 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)

Prva vrstica, »project(helloworld)«, določa ime projekta.

Zatem nastavljamo različice zahtevanih orodij. »cmake_minimum_required(VERSION 3.10)« določa različico CMake, ki jo bomo klicali. Nato uporabimo »set« za določanje spremenljivk (»KF5_MIN_VERSION« in »QT_MIN_VERSION«), ki vsebujejo različice Ogrodja KDE in Qt.

Nato pridemo do odseka, kjer vključujemo številne potrebne nastavitve CMake in KDE. Naj vas ne skrbi preveč glede teh vrstic za zdaj, ne bomo jih spreminjali v tej vaji.

Naslednji razdelek je pomemben, saj določa, katere odvisnosti bomo vključili v času prevajanja. Poglejmo prvo vrstico:

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

  • »find_package# najde in naloži zunanjo komponento.
  • Prva beseda je ogrodje (»KF5«).
  • Potem kličemo spremenljivko z različicami, ki smo jih nastavili v drugi vrstici.
  • »COMPONENTS« je parameter, ki predhaja posebne sestavne dele ogrodja, ki ga bomo vključili.
  • Vsaka beseda za »COMPONENTS« se nanaša na določeno komponento.

Končna vrstica, »add_subdirectory(src)«, kaže CMake v mapo »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)

Ker večino težkega dela opravi prva datoteka, je ta precej krajša.

  • »set« se uporablja za nastavitev »helloworld_SRCS« na »main.cpp« in »resources.qrc« (če se odločimo za ustvarjanje dodatnih datotek C++, jih bomo morali dodati tudi tukaj)
  • »add_executable« skrbi za poimenovanje naše izvršilne datoteke in pridobivanje datotek, ki so potrebna za njeno izdelavo
  • »target_link_libraries« dinamično povezuje knjižnice, uporabljene v naši kodi, z našo izvršitveno datoteko.

Ta nastavitev bo uporabna pri razvoju večine programov oz. aplikacij Kirigami.