Förstå CMakeLists

Att begripa hur CMakeLists.txt-filer fungerar

CMake

I vår inledande handledning, använde vi CMake som byggsystem för vårt program, men vi har egentligen bara uppmärksammat en av våra CMakeLists.txt. Här går vi igenom hur det fungerar lite mer detaljerat.

CMake är användbart eftersom det låter oss automatisera mycket av grejorna som måste göras innan kompilering.

CMakeLists.txt

Du kanske kommer ihåg filen CMakeLists.txt från den första handledningen:

 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)

Första raden, cmake_minimum_required(VERSION 3.16) ställer in version av CMake som vi anropar.

Därefter definierar project(helloworld) projektets namn.

Därefter kommer vi till en sektion där vi inkluderar ett antal nödvändiga CMake- och KDE-inställningar genom att använda extra-cmake-modules. Du behöver inte bekymra dig så mycket om raderna för tillfället, och vi behöver inte ändra dem i den här handledningen.

Den följande sektionen är viktig, eftersom den anger vilka beroenden vi tar med vid kompileringstillfället. Låt oss titta på den första:

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() hittar och läser in den externa komponenten.
  • Det första ordet är ramverket, Qt. ${QT_MAJOR_VERSION} är en bekvämlighetsvariabel som tillhandahålls av extra-cmake-moduler som låter oss välja Qt-versionen som ska användas, 5 eller 6, beroende på om vi använder CMake-flaggan -DBUILD_WITH_QT6=ON.
  • REQUIRED talar om för CMake beroendena verkligen krävs och att det ska avslutas med ett fel om paketet inte kan hittas.
  • NO_MODULE ställer om CMake till läget Config. Vi behöver inte bry oss om det för tillfället.
  • COMPONENTS är en parameter som föregår de specifika komponenterna för ramverket vi inkluderar.
  • Varje ord efter COMPONENTS refererar till en specifik komponent.

Den sista raden låter CMake skriva ut vilka paket som har hittats, Och ovanför den pekar add_subdirectory(src) CMake på katalogen 'src/', där en annan CMakeLists.txt finns:

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

Eftersom mycket av själva arbetet görs av den första filen, är den här mycket kortare.

  • add_executable() tar hand om att generera vårt körbara program.
  • target_sources() låter oss lägga till filer som används av vårt nya körbara program.
  • target_link_libraries länkar biblioteken som används i vår kod till vårt körbara program dynamiskt. Kirigami inkluderas inte här eftersom vi bara använder dess QML-modul.
  • install() placerar vår körbara fil på rätt plats genom att använda ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}, en bekvämlighetsvariabel som tillhandahålls av KDEInstallDirs i extra-cmake-modules som installerar körbara filer och bibliotek på rätt plats åt dig utan att behöva ange den absoluta sökvägen, på liknande sätt som GNUInstallDirs.

Inställningen är användbar när vi utvecklar de flesta program i Kirigami.