Kompreni CMakeLists

Ekkompreni kiel funkcias CMakeLists.txt dosieroj

CMake

En nia enkonduka lernilo, ni uzis CMake kiel la konstrusistemon por nia aplikaĵo, sed ni nur tre atentis unu el niaj CMakeLists.txt dosieroj. Ĉi tie, ni iom pli detale trarigardos kiel ĝi funkcias.

CMake estas utila ĉar ĝi permesas al ni aŭtomatigi grandan parton de la aĵoj kiuj devas esti faritaj antaŭ kompilo.

CMakeLists.txt

Vi eble memoras ĉi tiun CMakeLists.txt dosieron de la unua lernilo:

 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)

La unua linio, cmake_minimum_required(VERSION 3.16) fiksas la version de CMake, kiun ni vokos.

Post tio, project(helloworld) difinas la nomon de la projekto.

Poste ni atingas sekcion, kie ni inkluzivas kelkajn necesajn agordojn de CMake kaj KDE uzante extra-cmake-modules. Vi ne devus zorgi tro multe pri ĉi tiuj linioj nuntempe kaj ni ne bezonos ŝanĝi ilin en ĉi tiu lernilo.

La sekva sekcio estas grava, ĉar ĝi specifas kiujn dependecojn ni alportos je kompilo. Ni rigardu la unuan:

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() trovas kaj ŝargas la eksteran komponanton.
  • La unua vorto estas la kadro, Qt. ${QT_MAJOR_VERSION} estas oportuna variablo provizita de ekstra-cmake-moduloj, kiu ebligas al ni elekti la Qt-version uzontan, 5 aŭ 6, depende ĉu ni uzas la CMake-flagon -DBUILD_WITH_QT6=ON.
  • REQUIRED diras al CMake, ke ĉi tiuj dependecoj ja estas postulataj kaj ke ĝi eliros kun eraro se la pakaĵo ne troveblas.
  • NO_MODULE ŝanĝas CMake al la Agorda reĝimo. Ni ne bezonas zorgi pri tio nuntempe.
  • `KOMPONENTOJ' estas parametro, kiu antaŭas la specifajn komponantojn de la kadro, kiun ni inkludos.
  • Ĉiu vorto post `KOPONENTOJ' rilatas al specifa komponanto.

La fina linio lasas CMake presi kiujn pakaĵojn ĝi trovis. Kaj super tio, add_subdirectory(src) indikas CMake en la dosierujon src/, kie ĝi trovas alian CMakeLists.txt dosieron:

 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})

Ĉar plejparto de la peza levado estas farita de la unua dosiero, ĉi tiu estas multe pli mallonga.

  • add_executable() zorgas pri generi nian ruleblan.
  • target_sources() permesas al ni aldoni dosierojn, kiuj estos uzataj de nia nova rulebla.
  • target_link_libraries() dinamike ligas la bibliotekojn uzatajn en nia kodo al nia rulebla. Kirigami ne estas inkluzivita ĉi tie ĉar ni uzas nur ĝian QML-modulon.
  • install() metas nian rulilon en ĝian ĝustan lokon uzante ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}, oportunan variablon provizitan de [KDEInstallDirs] (https://api.kde.org/ecm/manual/ecm-kde-modules.7.html) en ekstra-cmake-modules kiu instalas ruleblajn kaj bibliotekojn en ilia ĝusta loko por vi sen bezono specifi la absolutan vojon, simile al GNUInstallDirs.

Ĉi tiu aranĝo estos utila dum disvolvado de plej multaj Kirigami-aplikoj.