CMake: imprime todas las variables accesibles en un script

Me pregunto si hay una forma de imprimir todas las variables accesibles en CMake. No estoy interesado en las variables de CMake, como en el --help-variables opción. Estoy hablando de mis variables que definí, o las variables definidas por los scripts incluidos.

Actualmente estoy incluyendo:

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

Y esperaba poder imprimir todas las variables que están aquí, en lugar de tener que revisar todos los archivos y leer lo que estaba disponible. Puede que encuentre algunas variables que no conocía que pueden ser útiles. Sería bueno ayudar a aprender y descubrir. Es estrictamente para depuración/desarrollo.

Esto es similar a la pregunta en Imprima todas las variables locales accesibles al alcance actual en Lua, pero para CMake!

¿Alguien ha hecho esto?

preguntado el 15 de febrero de 12 a las 13:02

7 Respuestas

Usando el patrón de velas del get_cmake_property función, el siguiente bucle imprimirá todas las variables de CMake definidas y sus valores:

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

Esto también se puede integrar en una función de conveniencia que, opcionalmente, puede usar una expresión regular para imprimir solo un subconjunto de variables con nombres coincidentes.

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

Para imprimir variables de entorno, use CMake modo de comando:

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

respondido 16 nov., 21:17

Ese es un fragmento muy útil. porque no se imprime ENV variables que configuré en la línea de comando? - IgorGanapolsky

@Geremia puede copiar este bloque de código en el archivo miarchivo.txt y correr : cmake -P miarchivo.txt - ídolo

VARIABLES enumera solo "variables definidas en el directorio actual". cmake.org/cmake/help/latest/prop_dir/… - CivFan

Tuve que quitar el STATUS from the message Comando para que la salida sea visible. - luador

No funcionó para mí. todo lo que obtuve fueron variables que comienzan con CMAKE_* - johnson

Otra forma es simplemente usar:

cmake -LAH

Desde el página de manual:

-L[A][H]

Enumere las variables almacenadas en caché no avanzadas.

La lista de variables de caché ejecutará CMake y enumerará todas las variables de la caché de CMake que no están marcadas como INTERNAL or ADVANCED. Esto mostrará efectivamente la configuración actual de CMake [...].

If A se especifica, luego mostrará también variables avanzadas.

If H se especifica, también mostrará ayuda para cada variable.

Respondido el 20 de junio de 20 a las 10:06

Haga esto en su directorio de compilación: jtsagata

Tenga en cuenta que este método NO imprime variables del sistema (WIN32, UNIX, APPLE, etc.). - tejedor de holocrones

Esto no imprime todas las bibliotecas disponibles, solo las almacenadas en caché. - Rafalcieslak

Esto no imprime todas las variables, solo las almacenadas en caché. (FTFY rafa) - Qwertie

ccmake es una buena opción interactiva para inspeccionar de forma interactiva las variables almacenadas en caché (option( or set( CACHE:

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

Herramienta útil :) Sin embargo, las preguntas piden imprimir todas las variables... pero esto solo revelará las variables almacenadas en caché. - OLL

Otra forma de ver todas las variables internas de cmake es ejecutando cmake con el --trace-expand .

Esto le dará un seguimiento de todos los archivos .cmake ejecutados y las variables configuradas en cada línea.

Respondido 11 Oct 20, 15:10

Ninguna de las respuestas actuales me permitió ver las variables en el subdirectorio de mi proyecto. Aquí hay una solución:

function(print_directory_variables dir)
    # Dump variables:
    get_property(_variableNames DIRECTORY ${dir} PROPERTY VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        get_directory_property(_variableValue DIRECTORY ${dir} DEFINITION ${_variableName})
        message(STATUS "DIR ${dir}: ${_variableName}=${_variableValue}")
    endforeach()
endfunction(print_directory_variables)

# for example
print_directory_variables(.)
print_directory_variables(ui/qt)

respondido 30 mar '21, 19:03

basado en @sakra

function(dump_cmake_variables)
    get_cmake_property(_variableNames VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        if (ARGV0)
            unset(MATCHED)

            #case sensitive match
            # string(REGEX MATCH ${ARGV0} MATCHED ${_variableName})
            #
            #case insenstitive match
            string( TOLOWER "${ARGV0}" ARGV0_lower )
            string( TOLOWER "${_variableName}" _variableName_lower )
            string(REGEX MATCH ${ARGV0_lower} MATCHED ${_variableName_lower})

            if (NOT MATCHED)
                continue()
            endif()
        endif()
        message(STATUS "${_variableName}=${${_variableName}}")
    endforeach()
endfunction()

dump_cmake_variables("^Boost")

los nombres de las variables distinguen entre mayúsculas y minúsculas

por cierto, si está interesado en impulsar, es Boost_INCLUDE_DIRS no BOOST_INCLUDE_DIRS, y es Boost_LIBRARIES no BOOST_LIBRARIES, y por error tenía BOOST_LIBRARIES en lugar de Boost_LIBRARIES, https://cmake.org/cmake/help/v3.0/module/FindBoost.html , mejor ejemplo para impulsar:

set(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS RANDOM)
include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(myfile PRIVATE
 ${Boost_LIBRARIES}
)

Respondido el 22 de Septiembre de 20 a las 07:09

Puede usar el mensaje :

message([STATUS] "SUB_SOURCES : ${SUB_SOURCES}")

Respondido 17 Feb 21, 11:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.