我已使用CMake
在add_subdirectory
中添加了一个子目录。如何通过将set
与PARENT_SCOPE
结合使用来明确设置变量,从该子目录的范围访问变量?
set(BOX2D_BUILD_STATIC 1)
set(BOX2D_BUILD_EXAMPLES 0)
set(BOX2D_INSTALL_BY_DEFAULT 0)
add_subdirectory(Box2D_v2.2.1)
message(STATUS "Using Box2D version ${BOX2D_VERSION}")
# how to get ${BOX2D_VERSION} variable without modifying CMakeLists.txt in Box2D_v2.2.1?
这可能吗?
答案 0 :(得分:7)
如果变量是普通变量(而不是缓存变量),则无法从父范围访问它。
无论范围如何,都可以访问缓存变量(使用set(... CACHE ...)
设置的变量),全局属性(set_property(GLOBAL ...)
)也可以访问。
答案 1 :(得分:3)
虽然@Angew的答案是正确的,但CMake并没有太多真正不可能的东西: - )
如果您有像
这样的行set(BOX2D_VERSION 2.2.1)
在Box2D_v2.2.1 / CMakeLists.txt中,您可以通过执行以下操作来检索父作用域中的版本:
file(STRINGS Box2D_v2.2.1/CMakeLists.txt VersionSetter
REGEX "^[ ]*set\\(BOX2D_VERSION")
string(REGEX REPLACE "(^[ ]*set\\(BOX2D_VERSION[ ]*)([^\\)]*)\\)" "\\2"
BOX2D_VERSION ${VersionSetter})
这有点脆弱;例如,它不适用于set
命令中的额外空格,或者适合设置两次的值。你也可以满足这些可能性,但是如果你知道set
命令的格式并且不太可能改变,那么这是一个合理的解决方法。