Razumevanje CMakeLists

Kako se spoprijeti z delovanjem datotek CMakeLists.txt

CMake

V naši uvodni vaji smo uporabili CMake](https://cmake.org/) kot sistem gradnje za našo aplikacijo, vendar smo bili le resnično pozorni na eno od naših datotek CMakeLists.txt. Tukaj bomo podrobneje preučili, kako to deluje.

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

CMakeLists.txt

Morda se spomnite datoteke CMakeLists.txt 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.16) 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 z uporabo extra-cmake-modules. 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 je pred posebnimi sestavnimi deli 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 imenik 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 potrebne 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.