cmake
Variables et propriétés
Recherche…
Introduction
La simplicité des variables CMake de base contredit la complexité de la syntaxe de la variable complète. Cette page documente les différents cas variables, avec des exemples, et indique les pièges à éviter.
Syntaxe
- set (variable_name value [description du type CACHE [FORCE]])
Remarques
Les noms de variables sont sensibles à la casse. Leurs valeurs sont de type string. La valeur d'une variable est référencée via:
${variable_name}
et est évalué dans un argument cité
"${variable_name}/directory"
Variable en cache (globale)
set(my_global_string "a string value"
CACHE STRING "a description about the string variable")
set(my_global_bool TRUE
CACHE BOOL "a description on the boolean cache entry")
Si une variable en cache est déjà définie dans le cache lorsque CMake traite la ligne correspondante (par exemple, lorsque CMake est réexécutée), elle n'est pas modifiée. Pour remplacer la valeur par défaut, ajoutez FORCE
comme dernier argument:
set(my_global_overwritten_string "foo"
CACHE STRING "this is overwritten each time CMake is run" FORCE)
Variable locale
set(my_variable "the value is a string")
Par défaut, une variable locale est uniquement définie dans le répertoire en cours et tous les sous-répertoires ajoutés via la commande add_subdirectory
.
Pour étendre la portée d'une variable, il y a deux possibilités:
CACHE
le rendra disponible à l'échelle mondialeutilisez
PARENT_SCOPE
, ce qui le rendra disponible dans la portée parent. La portée parent est soit le fichierCMakeLists.txt
dans le répertoire parent, soit l'appelant de la fonction en cours.Techniquement, le répertoire parent sera le fichier
CMakeLists.txt
qui incluait le fichier actuel via la commandeadd_subdirectory
.
Cordes et Listes
Il est important de savoir comment CMake distingue les listes et les chaînes simples. Lorsque vous écrivez:
set(VAR "ab c")
vous créez une chaîne avec la valeur "ab c"
. Mais quand vous écrivez cette ligne sans guillemets:
set(VAR abc)
Vous créez une liste de trois éléments à la place: "a"
, "b"
et "c"
.
Les variables non listées sont aussi des listes (d'un seul élément).
Les listes peuvent être utilisées avec la commande list()
, qui permet de concaténer des listes, de les rechercher, d’accéder à des éléments arbitraires, etc. ( documentation de list () ).
Un peu déroutant, une liste est aussi une chaîne . La ligne
set(VAR abc)
est équivalent à
set(VAR "a;b;c")
Par conséquent, pour concaténer des listes, on peut aussi utiliser la commande set()
:
set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"
Variables et le cache des variables globales
Vous utiliserez principalement des "variables normales" :
set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})
Mais CMake connaît également les "variables en cache" globales (persistantes dans CMakeCache.txt
). Et si des variables normales et en cache du même nom existent dans la portée actuelle, les variables normales masquent celles en cache:
cmake_minimum_required(VERSION 2.4)
project(VariablesTest)
set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")
set(VAR "NORMAL")
message("VAR = ${VAR}")
set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")
Première sortie
VAR = CACHED-init
VAR = NORMAL
VAR = CACHED
Sortie de la deuxième course
VAR = CACHED
VAR = NORMAL
VAR = CACHED
Remarque: L'option FORCE
désactive / supprime également la variable normale de la portée actuelle.
Cas d'utilisation pour les variables mises en cache
Il y a généralement deux cas d'utilisation (veuillez ne pas les utiliser pour les variables globales):
Une valeur dans votre code doit être modifiable par l'utilisateur de votre projet, par exemple avec l'
cmakegui
,ccmake
oucmake -D ...
:CMakeLists.txt / MyToolchain.cmake
set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
Ligne de commande
$ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
Cela prédéfinit cette valeur dans le cache et la ligne ci-dessus ne le modifiera pas.
CMake GUI
Dans l'interface graphique, l'utilisateur lance d'abord le processus de configuration, puis modifie toute valeur mise en cache et termine le démarrage de la génération de l'environnement de génération.
De plus, CMake met en cache les résultats de recherche / test / identification du compilateur (il n'a donc pas besoin de le refaire à chaque fois qu'il réexécute les étapes de configuration / génération)
find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
Ici,
LIB_A_PATH
est créé en tant que variable mise en cache.
Ajout d'indicateurs de profilage à CMake pour utiliser gprof
La série d'événements est censée fonctionner comme suit:
- Compiler le code avec l'option -pg
- Code de liaison avec l'option -pg
- Exécuter de programme
- Le programme génère le fichier gmon.out
- Exécuter le programme gprof
Pour ajouter des indicateurs de profilage, vous devez ajouter à votre CMakeLists.txt:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
Cela doit ajouter des drapeaux pour compiler et lier, et utiliser après exécution du programme:
gprof ./my_exe
Si vous obtenez une erreur comme:
gmon.out: No such file or directory
Cela signifie que la compilation n'a pas ajouté d'informations de profilage correctement.