ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我目前包括:

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

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

这类似于 Print all local variables accessible to the current scope in Lua 中的问题,但针对 CMake!

有人做过吗?


Z
Zoe stands with Ukraine

使用 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 的 command mode

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

这是一个非常有用的片段。为什么它不打印出我在命令行上设置的 ENV 变量?
@Geremia 您可以将此代码块复制到文件 myfile.txt 并运行: cmake -P myfile.txt
VARIABLES 仅列出“在当前目录中定义的变量”。 cmake.org/cmake/help/latest/prop_dir/…
我必须从 message 命令中删除 STATUS 才能看到输出。
没有为我工作。我得到的只是以 CMAKE_* 开头的变量
C
Community

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

cmake -LAH

manpage

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


在您的构建目录上执行此操作
请注意,此方法不打印系统变量(WIN32、UNIX、APPLE 等)。
这不会打印出所有可用的库,只会打印出缓存的库。
这不会打印出所有变量,只会打印出缓存的变量。 (FTFY拉法)
C
Ciro Santilli Путлер Капут 六四事

ccmake 是交互式检查缓存变量(option(set( CACHE)的一个很好的交互式选项:

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

https://i.stack.imgur.com/ohmjl.png


有用的工具:) 但是,问题要求打印出所有变量..但这只会显示缓存的变量。
W
Willem Hengeveld

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

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


S
Shimon Doodkin

基于@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,https://cmake.org/cmake/help/v3.0/module/FindBoost.html,这是 boost 的更好示例:

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

target_link_libraries(myfile PRIVATE
 ${Boost_LIBRARIES}
)

b
bukzor

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

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)

F
Furlings

您可以使用 message

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