Entendre les CMakeLists

Familiaritzant-nos amb com funcionen els fitxers CMakeLists.txt

CMake

En la nostra guia d'aprenentatge introductòria, emprem el CMake com el sistema de compilació per a la nostra aplicació, però només parem molta atenció a un dels nostres fitxers CMakeLists.txt. Aquí, repassarem com funcionen amb una mica més de detall.

El CMake és útil perquè ens permet automatitzar gran part de les coses que s'han de fer abans de la compilació.

CMakeLists.txt

És possible que recordeu aquest fitxer CMakeLists.txt de la primera guia d'aprenentatge:

 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 primera línia, cmake_minimum_required(VERSION 3.16) estableix la versió del CMake que es cridarà.

Després d'això, project(helloworld) defineix el nom del projecte.

Després arribem a una secció on incloem una sèrie de paràmetres necessaris de CMake i del KDE fent servir extra-cmake-modules. Per ara no heu de preocupar-vos massa per aquestes línies i no necessitarem canviar-les en aquesta guia d'aprenentatge.

La secció següent és important, perquè especifica quines dependències portarem en temps de compilació. Vegem el primer:

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() cerca i carrega el component extern.
  • La primera paraula és l'entorn de treball, les Qt. ${QT_MAJOR_VERSION} és una variable d'utilitat proporcionada per «extra-cmake-modules» que ens permet triar la versió de les Qt a usar, 5 o 6, depenent de si usem l'indicador de CMake -DBUILD_WITH_QT6=ON.
  • REQUIRED fa saber al CMake que aquestes dependencies són necessàries i que hauria de sortir amb un error si no s'ha pogut trobar el paquet.
  • NO_MODULE canvia el CMake en el mode Config. De moment, això no ens ha de preocupar.
  • COMPONENTS és un paràmetre que precedeix als components específics del marc de treball que incloem.
  • Cada paraula després de COMPONENTS es refereix a un component específic.

La línia final permet que el CMake imprimeixi els paquets que ha trobat. I a sobre d'això, add_subdirectory(src) a punta el CMake en el directori src/, a on troba un altre fitxer 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})

Atès que la major part de la feina pesada es realitza amb la primera llima, aquesta és molt més curta.

  • add_executable() s'encarrega de generar el nostre executable.
  • target_sources() ens permet afegir fitxers que s'utilitzarà el nostre executable nou.
  • target_link_libraries() enllaça dinàmicament les biblioteques utilitzades en el nostre codi amb el nostre executable. El Kirigami no s'inclou aquí perquè només estem utilitzant el seu mòdul QML.
  • install() posa el nostre executable en el seu lloc correcte utilitzant ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}, una variable d'utilitat proporcionada per KDEInstallDirs en extra-cmake-modules que instal·len executables i biblioteques en el seu lloc correcte, sense necessitat d'especificar el camí absolut, de manera similar a GNUInstallDirs.

Aquesta configuració serà útil en desenvolupar la majoria de les aplicacions escrites amb el Kirigami.