CMake: affiche toutes les variables accessibles dans un script


222

Je me demande s'il existe un moyen d'imprimer toutes les variables accessibles dans CMake. Je ne suis pas intéressé par les variables CMake - comme dans l' --help-variablesoption. Je parle de mes variables que j'ai définies, ou des variables définies par les scripts inclus.

J'inclus actuellement:

INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake)

Et j'espérais que je pourrais simplement imprimer toutes les variables qui sont ici, au lieu d'avoir à parcourir tous les fichiers et lire ce qui était disponible - Je peux trouver certaines variables que je ne connaissais pas qui pourraient être utiles. Il serait bon de faciliter l'apprentissage et la découverte. C'est strictement pour le débogage / développement.

Ceci est similaire à la question dans Imprimer toutes les variables locales accessibles à la portée actuelle dans Lua , mais pour CMake!

Quelqu'un a-t-il fait cela?

Réponses:


368

En utilisant la get_cmake_propertyfonction, la boucle suivante imprimera toutes les variables CMake définies et leurs valeurs:

get_cmake_property(_variableNames VARIABLES)
list (SORT _variableNames)
foreach (_variableName ${_variableNames})
    message(STATUS "${_variableName}=${${_variableName}}")
endforeach()

Cela peut également être intégré dans une fonction de commodité qui peut éventuellement utiliser une expression régulière pour imprimer uniquement un sous-ensemble de variables avec des noms correspondants

function(dump_cmake_variables)
    get_cmake_property(_variableNames VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        if (ARGV0)
            unset(MATCHED)
            string(REGEX MATCH ${ARGV0} MATCHED ${_variableName})
            if (NOT MATCHED)
                continue()
            endif()
        endif()
        message(STATUS "${_variableName}=${${_variableName}}")
    endforeach()
endfunction()

Pour imprimer des variables d'environnement, utilisez le mode de commande de CMake :

execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")

C'est un extrait très utile. Pourquoi n'imprime-t-il pas les variables ENV que je mets en ligne de commande?
IgorGanapolsky

2
@Geremia vous pouvez copier ce bloc de code dans le fichier myfile.txt et exécuter: cmake -P myfile.txt
Idok

2
VARIABLESrépertorie uniquement les "variables définies dans le répertoire en cours". cmake.org/cmake/help/latest/prop_dir/…
CivFan

1
J'ai dû supprimer le STATUSde la messagecommande pour que la sortie soit visible.
luator

Ça n'a pas marché pour moi. je n'ai obtenu que des variables commençant par CMAKE_ *
C Johnson

173

Une autre façon consiste à simplement utiliser:

cmake -LAH

Depuis la page de manuel :

-L[A][H]

Répertorie les variables mises en cache non avancées.

Lister les variables de cache exécutera CMake et listera toutes les variables du cache CMake qui ne sont pas marquées comme INTERNALou ADVANCED. Cela affichera efficacement les paramètres actuels de CMake [...].

Si Aest spécifié, il affichera également des variables avancées.

Si Hest spécifié, il affichera également l'aide pour chaque variable.


4
Faites cela sur votre répertoire de construction
jtsagata

5
Notez que cette méthode n'imprime PAS les variables système (WIN32, UNIX, APPLE, etc.).
holocronweaver du

4
Cela n'imprime pas toutes les bibliothèques disponibles, seulement celles mises en cache.
rafalcieslak

2
Cela n'imprime pas toutes les variables, seulement celles mises en cache. (FTFY rafa)
Qwertie

9

ccmakeest une bonne option interactive pour inspecter de manière interactive les variables mises en cache ( option(ou set( CACHE:

sudo apt-get install cmake-curses-gui
mkdir build
cd build
cmake ..
ccmake ..


3
Outil utile :) Cependant, la question demande d'imprimer toutes les variables .. mais cela ne révélera que les variables mises en cache.
OLL
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.