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:

  1. CACHE le rendra disponible à l'échelle mondiale

  2. utilisez PARENT_SCOPE , ce qui le rendra disponible dans la portée parent. La portée parent est soit le fichier CMakeLists.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 commande add_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):

  1. Une valeur dans votre code doit être modifiable par l'utilisateur de votre projet, par exemple avec l' cmakegui , ccmake ou cmake -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

    entrer la description de l'image ici

    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.

  1. 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:

  1. Compiler le code avec l'option -pg
  2. Code de liaison avec l'option -pg
  3. Exécuter de programme
  4. Le programme génère le fichier gmon.out
  5. 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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow