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

holgip5t  于 12个月前  发布在  其他
关注(0)|答案(7)|浏览(129)

我想知道是否有一种方法可以打印出CMake中所有可访问的变量。我对CMake变量不感兴趣-比如--help-variables选项。我说的是我定义的变量,或者由包含的脚本定义的变量。
我目前包括:

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

字符串
我希望我可以打印出这里所有的变量,而不必遍历所有的文件,阅读可用的内容-我可能会发现一些我不知道的变量,这可能是有用的。这将有助于学习和发现。这是严格用于调试/开发。
这与 * Print all local variables accessible to the current scope in Lua * 中的问题类似,但针对CMake!
有人这么做过吗?

hiz5n14c

hiz5n14c1#

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


或者,以更紧凑的形式:

function(dump_cmake_variables)
    get_cmake_property(_variableNames VARIABLES)
    list (SORT _variableNames)
    foreach (_variableName ${_variableNames})
        if ((NOT DEFINED ARGV0) OR _variableName MATCHES ${ARGV0})
            message(STATUS "${_variableName}=${${_variableName}}")
        endif()
    endforeach()
endfunction()


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

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

neekobn8

neekobn82#

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

cmake -LAH

字符串
来自manpage:
第一个月
列出非高级缓存变量。
列表缓存变量将运行CMake并列出CMake缓存中未标记为INTERNALADVANCED的所有变量。这将有效地显示当前CMake设置[...]。
如果指定了A,那么它也将显示高级变量。
如果指定了H,它还将显示每个变量的帮助。

t98cgbkg

t98cgbkg3#

**ccmake**是一个很好的交互式选项,可以交互式地检查缓存变量(option(set( CACHE

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

字符串


的数据

pw136qt2

pw136qt24#

查看所有cmake内部变量的另一种方法是使用--trace-expand选项执行cmake。
这将给予所有执行的.cmake文件和每行设置的变量的跟踪。

6ovsh4lw

6ovsh4lw5#

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

vfhzx4xs

vfhzx4xs6#

可以使用message

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

字符串

dxxyhpgq

dxxyhpgq7#

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

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)

字符串

相关问题