Entendiendo CMakeLists

Familiarizarse con el funcionamiento de los archivos CMakeLists.txt

CMake

In our introductory tutorial, we used CMake as the build system for our application, but we only really paid close attention to one of our CMakeLists.txt files. Here, we're going to go over how it works in a bit more detail.

CMake es útil porque nos permite automatizar la mayoría de las cosas necesarias que hay que hacer antes de compilar.

CMakeLists.txt

Es posible que recuerde este archivo CMakeLists.txt del primer tutorial:

 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ínea, project(helloworld) define el nombre del proyecto.

Tras ella, definimos las versiones de las herramientas que vamos a necesitar. cmake_minimum_required(VERSION 3.16) define la versión de CMake que vamos a llamar. Después usamos set() para definir las variables (KF5_MIN_VERSION y QT_MIN_VERSION) que contienen las versiones de KDE Frameworks y de Qt.

Luego llegamos a una sección donde incluimos una serie de preferencias necesarias de CMake y de KDE usando extra-cmake-modules. No debe preocuparse demasiado de estas líneas por ahora y tampoco necesitaremos cambiarlas en este tutorial.

La siguiente sección es importante, ya que especifica las dependencias necesarias durante la compilación. Veamos la primera línea:

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

  • find_package() encuentra y carga el componente externo.
  • La primera palabra es la infraestructura (KF5).
  • Luego llamamos a la variable con las versiones que hemos configurado en la segunda línea.
  • COMPONENTS es un parámetro que precede a los componentes específicos de la infraestructura que vamos a incluir.
  • Cada palabra tras COMPONENTS hace referencia a un determinado componente.

La línea final, add_subdirectory(src), hace que CMake apunte al directorio 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)

Como la mayor parte del trabajo pesado se realiza en el primer archivo, este es mucho más breve.

  • set() se usa para definir helloworld_SRCS como main.cpp y resources.qrc (si decidimos crear archivos C++ adicionales, también tendremos que añadirlos aquí).
  • add_executable() se encarga de dar nombre a nuestro ejecutable y de tomar los archivos necesarios para crearlo.
  • target_link_libraries enlaza de forma dinámica las bibliotecas usadas en el código fuente con nuestro ejecutable.

Esta configuración será útil para desarrollar la mayoría de las aplicaciones de Kirigami.