CMake: Druckt alle zugänglichen Variablen in einem Skript aus


222

Ich frage mich, ob es eine Möglichkeit gibt, alle zugänglichen Variablen in CMake auszudrucken. Die CMake-Variablen interessieren mich nicht - wie die --help-variablesOption. Ich spreche über meine Variablen, die ich definiert habe, oder über die Variablen, die durch enthaltene Skripte definiert wurden.

Ich schließe derzeit ein:

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

Und ich hatte gehofft, ich könnte einfach alle Variablen ausdrucken, die hier sind, anstatt alle Dateien durchgehen und lesen zu müssen, was verfügbar ist - ich finde möglicherweise einige Variablen, von denen ich nichts wusste, nützlich. Es wäre gut, das Lernen und Entdecken zu unterstützen. Es ist ausschließlich für das Debuggen / Entwickeln.

Dies ähnelt der Frage in Alle lokalen Variablen drucken, auf die der aktuelle Bereich in Lua zugreifen kann , jedoch für CMake!

Hat jemand das getan?

Antworten:


368

Mit der get_cmake_propertyFunktion druckt die folgende Schleife alle definierten CMake-Variablen und ihre Werte aus:

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

Dies kann auch in eine Komfortfunktion eingebettet werden, die optional einen regulären Ausdruck verwenden kann, um nur eine Teilmenge von Variablen mit übereinstimmenden Namen zu drucken

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()

Verwenden Sie zum Drucken von Umgebungsvariablen den Befehlsmodus von CMake :

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

Das ist ein sehr nützlicher Ausschnitt. Warum druckt es keine ENV- Variablen aus, die ich in der Befehlszeile festgelegt habe?
IgorGanapolsky

2
@Geremia Sie können diesen Codeblock in die Datei myfile.txt kopieren und ausführen: cmake -P myfile.txt
Idok

2
VARIABLESlistet nur "im aktuellen Verzeichnis definierte Variablen" auf. cmake.org/cmake/help/latest/prop_dir/…
CivFan

1
Ich musste das STATUSaus dem messageBefehl entfernen, damit die Ausgabe sichtbar war.
Luator

Hat bei mir nicht funktioniert. Alles was ich bekam waren Variablen beginnend mit CMAKE_ *
C Johnson

173

Eine andere Möglichkeit besteht darin, einfach zu verwenden:

cmake -LAH

Aus der Manpage :

-L[A][H]

Listet nicht erweiterte zwischengespeicherte Variablen auf.

Listen-Cache-Variablen führen CMake aus und listen alle Variablen aus dem CMake-Cache auf, die nicht als INTERNALoder markiert sindADVANCED . Dadurch werden die aktuellen CMake-Einstellungen [...] effektiv angezeigt.

Wenn A angegeben, werden auch erweiterte Variablen angezeigt.

Wenn Hangegeben, wird auch die Hilfe für jede Variable angezeigt.


4
Tun Sie dies auf Ihrem Build-Verzeichnis
jtsagata

5
Beachten Sie, dass diese Methode KEINE Systemvariablen (WIN32, UNIX, APPLE usw.) druckt.
Holocronweaver

4
Dadurch werden nicht alle verfügbaren Bibliotheken ausgedruckt, sondern nur die zwischengespeicherten.
Rafalcieslak

2
Dies druckt nicht alle Variablen aus, nur die zwischengespeicherten. (FTFY rafa)
Qwertie

9

ccmakeist eine gute interaktive Option, um zwischengespeicherte Variablen interaktiv zu überprüfen ( option(oder set( CACHE:

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


3
Nützliches Tool :) In den Fragen wird jedoch gefragt, ob alle Variablen ausgedruckt werden sollen. Dabei werden jedoch nur zwischengespeicherte Variablen angezeigt.
OLL
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.