6

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?

这可能吗?

4

2 回答 2

8

如果变量是普通变量(与缓存变量相反),则无法从父范围访问它。

set(... CACHE ...)无论范围如何,都可以访问缓存变量(用 设置的变量),全局属性( set_property(GLOBAL ...))也可以访问。

于 2013-03-20T08:12:25.793 回答
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命令的格式并且不太可能更改,那么这是一个合理的解决方法。

于 2013-03-20T09:25:10.943 回答