我想知道是否有一种方法可以打印出CMake中所有可访问的变量。我对CMake变量不感兴趣——就像在——help-variables选项中一样。我说的是我定义的变量,或者是包含脚本定义的变量。

我目前包括:

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

我希望我可以打印出这里所有的变量,而不是浏览所有的文件并读取可用的-我可能会发现一些我不知道的变量可能有用。这将有助于学习和发现。它严格用于调试/开发。

这类似于在Lua中打印当前范围内可访问的所有局部变量的问题,但对于CMake!

有人这样做过吗?


当前回答

使用get_cmake_property函数,下面的循环将打印出所有定义的CMake变量及其值:

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

这也可以嵌入到一个方便函数中,该函数可以选择使用正则表达式只打印具有匹配名称的变量子集

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

要打印环境变量,使用CMake的命令模式:

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

其他回答

使用get_cmake_property函数,下面的循环将打印出所有定义的CMake变量及其值:

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

这也可以嵌入到一个方便函数中,该函数可以选择使用正则表达式只打印具有匹配名称的变量子集

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

要打印环境变量,使用CMake的命令模式:

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

你可以使用message:

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

另一种方法是简单地使用:

cmake -LAH

从手册中:

- l [] [H] 列出非高级缓存变量。 列表缓存变量将运行CMake,并从CMake缓存中列出所有未标记为INTERNAL或ADVANCED的变量。这将有效地显示当前CMake设置[…]。 如果指定了A,那么它也会显示高级变量。 如果指定了H,它还将显示每个变量的帮助。

查看所有cmake内部变量的另一种方法是使用——trace-expand选项执行cmake。

这将为您提供执行的所有.cmake文件和每行设置的变量的跟踪。

当前的答案都不允许我查看项目子目录中的变量。这里有一个解决方案:

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)