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
24
25
26
27
28
cmake_minimum_required(VERSION 3.16)
project(helloworld)

find_package(ECM REQUIRED NO_MODULE)
set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})

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

find_package(Qt${QT_MAJOR_VERSION} REQUIRED NO_MODULE COMPONENTS
    Core
    Quick
    Test
    Gui
    QuickControls2
    Widgets
)

find_package(KF${QT_MAJOR_VERSION} REQUIRED COMPONENTS
    Kirigami2
    I18n
    CoreAddons
)

add_subdirectory(src)

feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)

Prva vrstica, cmake_minimum_required(VERSION 3.16) nastavi različico CMake, ki jo bomo klicali.

Po tem project(helloworld) določa ime projekta.

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, ker določa, katere odvisnosti bomo vnesli med prevajanjem. Poglejmo prvega:

11
12
13
14
15
16
17
18
find_package(Qt${QT_MAJOR_VERSION} REQUIRED NO_MODULE COMPONENTS
    Core
    Quick
    Test
    Gui
    QuickControls2
    Widgets
)
  • find_package() najde in naloži zunanjo komponento.
  • Prva beseda je okvir Qt. ${QT_MAJOR_VERSION} je priročna spremenljivka, ki jo zagotavljajo moduli extra-cmake-modules, ki nam omogoča izbiro uporabljene različice Qt 5 ali 6, odvisno od tega, ali uporabljamo zastavico CMake -DBUILD_WITH_QT6=ON.
  • REQUIRED pove CMake, da so te odvisnosti res zahtevane in da bo končal delo z napako, če paketa ni mogoče najti.
  • NO_MODULE preklopi CMake v način konfiguracije. Za to nam trenutno ni treba skrbeti.
  • 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.

Zadnja vrstica omogoča, da CMake natisne, katere pakete je našel. In nad tem add_subdirectory(src) usmeri CMake v imenik src/, kjer najde drugo datoteko CMakeLists.txt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
add_executable(helloworld)

target_sources(helloworld PRIVATE
    main.cpp
    resources.qrc
)

target_link_libraries(helloworld
    Qt${QT_MAJOR_VERSION}::Quick
    Qt${QT_MAJOR_VERSION}::Qml
    Qt${QT_MAJOR_VERSION}::Gui
    Qt${QT_MAJOR_VERSION}::QuickControls2
    Qt${QT_MAJOR_VERSION}::Widgets
    KF${QT_MAJOR_VERSION}::I18n
)

install(TARGETS helloworld ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})

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

  • add_executable() skrbi za generiranje naše izvršljive datoteke.
  • target_sources() nam omogoča dodajanje datotek, ki jih bo uporabljala naša nova izvršljiva datoteka.
  • target_link_libraries() dinamično povezuje knjižnice, uporabljene v naši kodi, z našo izvršljivo datoteko. Kirigami tukaj ni vključen, ker uporabljamo samo njegov modul QML.
  • install() postavi našo izvršljivo datoteko na pravo mesto z uporabo ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}, priročne spremenljivke, ki jo zagotavlja KDEInstallDirs v extra-cmake-modules, ki namesti izvedljive datoteke in knjižnice na svoje pravo mesto namesto vas, ne da bi morali določiti absolutno pot, podobno kot GNUInstallDirs.

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