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

La primera línia, project(helloworld) defineix el nom del projecte.

Després d'això, establim les versions de les nostres eines necessàries. cmake_minimum_required(VERSION 3.16) estableix la versió de CMake que cridarem. Després utilitzem set() per a definir les variables (KF5_MIN_VERSION i QT_MIN_VERSION) que contenen les versions dels Frameworks del KDE i de les Qt.

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 la primera línia:

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

  • find_package() cerca i carrega el component extern.
  • La primera paraula és el marc de treball (KF5).
  • Després fem una crida a la variable amb les versions que hem establert a la segona línia.
  • 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.

L'última línia, add_subdirectory(src), apunta CMake a dins del directori 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)

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

  • set() s'utilitza per a establir helloworld_SRCS al main.cpp i resources.qrc (si decidim crear fitxers en C++ addicionals, també els haurem d'afegir aquí).
  • add_executable() s'encarrega d'anomenar el nostre executable i prendre els fitxers necessaris per a crear-lo.
  • target_link_libraries enllaça dinàmicament les biblioteques utilitzades en el nostre codi amb el nostre executable.

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