CMake: Imprimir todas as variáveis ​​acessíveis em um script

222

Gostaria de saber se existe uma maneira de imprimir todas as variáveis ​​acessíveis no CMake. Não estou interessado nas variáveis ​​do CMake - como na --help-variablesopção Estou falando das minhas variáveis ​​que defini ou das variáveis ​​definidas pelos scripts incluídos.

Atualmente, estou incluindo:

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

E eu esperava poder imprimir todas as variáveis ​​que estão aqui, em vez de precisar ler todos os arquivos e ler o que estava disponível - posso encontrar algumas variáveis ​​que eu não conhecia que possam ser úteis. Seria bom ajudar no aprendizado e na descoberta. É estritamente para depuração / desenvolvimento.

Isso é semelhante à pergunta em Imprimir todas as variáveis ​​locais acessíveis ao escopo atual em Lua , mas para o CMake!

Alguém já fez isso?

Michael
fonte

Respostas:

368

Usando a get_cmake_propertyfunção, o seguinte loop imprimirá todas as variáveis ​​CMake definidas e seus valores:

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

Isso também pode ser incorporado em uma função de conveniência, que pode opcionalmente usar uma expressão regular para imprimir apenas um subconjunto de variáveis ​​com nomes correspondentes

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 variáveis ​​de ambiente, use o modo de comando do CMake :

execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")
sakra
fonte
Esse é um trecho muito útil. Por que não imprime variáveis ENV que defini na linha de comando?
IgorGanapolsky
2
@ Geremia, você pode copiar esse bloco de código no arquivo myfile.txt e executar: cmake -P myfile.txt
Idok:
2
VARIABLESlista apenas "variáveis ​​definidas no diretório atual". cmake.org/cmake/help/latest/prop_dir/…
CivFan 4/17
1
Eu tinha que remover a STATUSpartir do messagecomando para a saída a ser visível.
luator
Não funcionou para mim. tudo o que consegui foram variáveis ​​começando com CMAKE_ *
C Johnson
173

Outra maneira é simplesmente usar:

cmake -LAH

Na página de manual :

-L[A][H]

Listar variáveis ​​em cache não avançadas.

Listar variáveis ​​de cache executará o CMake e listará todas as variáveis ​​do cache do CMake que não estão marcadas como INTERNALou ADVANCED. Isso exibirá efetivamente as configurações atuais do CMake [...].

Se Afor especificado, ele também exibirá variáveis ​​avançadas.

Se Hfor especificado, também exibirá ajuda para cada variável.

jtsagata
fonte
4
Faça isso no diretório de compilação
jtsagata
5
Observe que esse método NÃO imprime variáveis ​​de sistema (WIN32, UNIX, APPLE etc.).
holocronweaver
4
Isso não imprime todas as bibliotecas disponíveis, apenas as armazenadas em cache.
Rafalcieslak
2
Isso não imprime todas as variáveis, apenas as armazenadas em cache. (FTFY rafa)
Qwertie 30/11
9

ccmakeé uma boa opção interativa para inspecionar interativamente variáveis ​​em cache ( option(ou set( CACHE:

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

Ciro Santilli adicionou uma nova foto
fonte
3
Ferramenta útil :) No entanto, as perguntas solicitam a impressão de todas as variáveis. Mas isso só revelará variáveis ​​em cache.
OLL