Compreender o CMakeLists

Tentar compreender como funcionam os ficheiros CMakeLists.txt

CMake

No nosso tutorial introdutório, usámos o CMake como sistema de compilação para a nossa aplicação, mas só prestámos atenção a um dos nossos ficheiros CMakeLists.txt. Aqui, vamos ver como funcionam os CMakeLists com um pouco mais de detalhe.

O CMake é útil porque nos permite automatizar muitas das coisas que precisam de ser feitas antes da compilação.

CMakeLists.txt

Poderá recordar este ficheiro CMakeLists.txt do primeiro 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)

A primeira linha, project(helloworld) define o nome do projecto.

Depois disto, iremos definir as versões necessárias das nossas ferramentas. O cmake_minimum_required(VERSION 3.16) configura a versão do CMake que iremos invocar. Depois iremos usar o set para definir as variáveis (KF5_MIN_VERSION e QT_MIN_VERSION) que contêm as versões das Plataformas do KDE e do Qt.

Depois chegamos a um secção onde incluímos um conjunto de definições necessárias do CMake e KDE, usando o extra-cmake-modules. Não se deverá preocupar demasiado com estas linhas por agora e não será necessário alterá-las neste tutorial.

A seguinte secção é importante, porque define quais as dependências que iremos buscar na altura da compilação. Vejamos a primeira linha:

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

  • O find_package() procura e carrega o componente externo.
  • A primeira palavra é a plataforma (KF5).
  • Depois iremos invocar a variável com as versões definidas por nós na segunda linha.
  • O COMPONENTS é um parâmetro que antecede os componentes específicos da plataforma que iremos incluir.
  • Cada palavra a seguir ao COMPONENTS refere-se a um componente específico.

A linha final, add_subdirectory(src), aponta o CMake para a pasta '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)

Dado que a maior parte do trabalho pesado é feito pelo primeiro ficheiro, este é bastante mais pequeno.

  • O set()](https://cmake.org/cmake/help/latest/command/set.html) é usado para configurar o helloworld_SRCS como main.cpp e o resources.qrc (se optarmos por criar ficheiros C++ adicionais, também os teremos de adicionar aqui)
  • O add_executable() toma conta de atribuir o nome ao nosso executável e recolher os ficheiros necessários para o criar
  • O target_link_libraries liga de forma dinâmica as bibliotecas usadas no nosso código ao nosso executável.

Esta configuração será útil quando estiver a desenvolver a maioria das aplicações de Kirigami.