我想知道是否有一种方法可以打印出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")
基于@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}
)