Entendiendo CMakeLists

Familiarizarse con el funcionamiento de los archivos CMakeLists.txt

CMake

En nuestro tutorial de introducción hemos usado CMake como sistema de compilación para nuestra aplicación, aunque solo hemos prestado más atención a uno de nuestros CMakeLists. Aquí vamos a profundizar un poco más sobre el funcionamiento de CMakeLists.

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