6

CMakeを使用してサブディレクトリを追加しましたadd_subdirectorysetと組み合わせて使用​​して変数を明示的に設定せずに、そのサブディレクトリのスコープから変数にアクセスするにはどうすればよい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たとえば、コマンドの余分なスペースに対応したり、2回設定された値に対応したりすることはできません。これらの可能性にも対応できますが、setコマンドの形式がわかっていて、変更される可能性が低い場合は、これが妥当な回避策です。

于 2013-03-20T09:25:10.943 に答える