CMake:如何从子目录访问变量而不在父作用域中显式设置它

时间:2013-03-20 06:59:06

标签: cmake box2d

我已使用CMakeadd_subdirectory中添加了一个子目录。如何通过将setPARENT_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?

这可能吗?

2 个答案:

答案 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命令的格式并且不太可能改变,那么这是一个合理的解决方法。