CMake:在脚本中打印出所有可访问的变量

306
我想知道是否有办法在CMake中打印出所有可访问的变量。我不感兴趣的是CMake变量 - 如--help-variables选项。我指的是我定义的变量或包含脚本定义的变量。
目前,我的包含方式为:
INCLUDE (${CMAKE_ROOT}/Modules/CMakeBackwardCompatibilityCXX.cmake)
我希望能打印出所有在此处的变量,而不必浏览所有文件并读取其中可用的内容——我可能会发现一些我不知道但有用的变量。这将有助于学习和发现,但严格仅用于调试/开发。

这类似于Lua中的问题:在Lua中打印当前范围内可访问的所有本地变量,但是这里是关于CMake的!

有人做过吗?

7个回答

542

使用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")

2
@Geremia 你可以将这个代码块复制到文件 myfile.txt 中并运行:cmake -P myfile.txt - Idok
2
VARIABLES 列出了“当前目录中定义的变量”。https://cmake.org/cmake/help/latest/prop_dir/VARIABLES.html#prop_dir:VARIABLES - CivFan
1
我不得不从“message”命令中删除“STATUS”,以便输出可见。 - luator
最后一个建议:“execute_process()”在使用CMAKE在MAC下的Eclipse时并不是很有用,原因如下:(1)Eclipse管理CMAKE的命令行,(2)MACOS会在启动像/Applications/Eclipse.app这样安装的“已安装应用程序”(如eclipse)时剥离和重置环境变量。 - user3696153
有没有使用“NOT MATCHED”和“CONTINUE”而不是将消息调用放入if中的“MATCHED”的原因? - Joerg S
显示剩余3条评论

202

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

cmake -LAH

来自manpage

-L[A][H]

列出非高级缓存变量。

列出缓存变量将运行CMake,并列出未标记为INTERNALADVANCED的CMake缓存中的所有变量。这将有效地显示当前的CMake设置[...]。

如果指定了A,则还会显示高级变量。

如果指定了H,还将显示每个变量的帮助信息。


6
请在您的构建目录上执行此操作。 - jtsagata
5
请注意,此方法不会打印系统变量(WIN32、UNIX、APPLE等)。 - holocronweaver
6
这不会打印出所有可用的库,只会打印已缓存的库。 - rafalcieslak
3
这并不会打印出所有的变量,只有缓存的变量。(FTFY rafa) - Qwertie

10

ccmake是一个很好的交互式选项,可用于交互地查看缓存变量(option(set(CACHE):

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


5
有用的工具 :) 然而,问题要求打印出所有变量,但这只会显示缓存的变量。 - OLL

5

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

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


4
基于@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")

变量名区分大小写

顺便提一句,如果您对boost感兴趣,它是Boost_INCLUDE_DIRS而不是BOOST_INCLUDE_DIRS,它是Boost_LIBRARIES而不是BOOST_LIBRARIES,我的错误是将BOOST_LIBRARIES误写成了Boost_LIBRARIES,更好的boost示例请参考https://cmake.org/cmake/help/v3.0/module/FindBoost.html

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

target_link_libraries(myfile PRIVATE
 ${Boost_LIBRARIES}
)

1
你可以使用 message
message([STATUS] "SUB_SOURCES : ${SUB_SOURCES}")

1

目前的答案都没有让我看到项目子目录中的变量。这里提供一种解决方案:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接