2013-03-20 5 views
6

Ich habe ein Unterverzeichnis in CMake hinzugefügt, indem ich add_subdirectory verwende. Wie kann ich auf eine Variable aus dem Bereich dieses Unterverzeichnisses zugreifen, ohne die Variable explizit mit set in Kombination mit PARENT_SCOPE zu setzen?CMake: Wie man auf eine Variable aus einem Unterverzeichnis zugreifen kann, ohne sie explizit im übergeordneten Bereich zu setzen

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? 

Ist das möglich?

+0

Wie wird die Variable 'BOX2D_VERSION' in der CMakeLists.txt des Unterverzeichnisses festgelegt? – Fraser

+1

Es ist als eine einfache Variable festgelegt. (so scheint es nach der Antwort unten zu sein, dass es nicht möglich ist, darauf zuzugreifen, ohne die CMakeLists.txt von Bod2d zu ändern) – user1492625

+0

Nun, irgendwie. Ich habe eine Antwort hinzugefügt, die eher eine Umgehungslösung als eine echte Lösung ist. – Fraser

Antwort

7

Wenn die Variable eine einfache Variable ist (im Gegensatz zu einer Cache-Variablen), gibt es keine Möglichkeit, über den übergeordneten Bereich darauf zuzugreifen.

Auf Cache-Variablen (die mit set(... CACHE ...) festgelegt wurden) kann unabhängig vom Bereich zugegriffen werden, ebenso wie auf globale Eigenschaften (set_property(GLOBAL ...)).

3

Während @ Angew Antwort richtig ist, es gibt nicht viele Dinge, die wirklich unmöglich mit CMake :-) sind

Wenn Sie eine Zeile wie

set(BOX2D_VERSION 2.2.1) 

in Box2D_v2.2.1 haben/CMakeLists.txt, dann können Sie die Version im Rahmen Eltern abrufen, indem Sie wie etwas zu tun:

file(STRINGS Box2D_v2.2.1/CMakeLists.txt VersionSetter 
    REGEX "^[ ]*set\\(BOX2D_VERSION") 
string(REGEX REPLACE "(^[ ]*set\\(BOX2D_VERSION[ ]*)([^\\)]*)\\)" "\\2" 
     BOX2D_VERSION ${VersionSetter}) 

das ist ein bisschen zerbrechlich; B. keine zusätzlichen Leerzeichen im Befehl set oder berücksichtigen Sie den Wert, der zweimal festgelegt wird. Sie könnten diese Möglichkeiten auch berücksichtigen, aber wenn Sie das Format des Befehls set kennen und es unwahrscheinlich ist, dass es sich ändert, dann ist dies ein vernünftiger Workaround.

+0

Netter Trick. Ich würde '[] 'in' [\ t] 'verwandeln, nur für den Fall. Es wird auch nicht funktionieren, wenn die Variable mit einer Funktion gesetzt wird (denke 'set ($ {resVar} 1.1 PARENT_SCOPE)'), innerhalb einer Bedingung usw. Ich mag deine Antwort, aber es gibt viele Vorbehalte. – Angew

+0

@Angew - Ja, ich stimme zu, dass dies nur ein Workaround ist - Ihr ist definitiv die beste Antwort (es hat eine +1 von mir). Ich denke, das könnte mit Regex angepasst werden, um fast jedem Szenario zu entsprechen, aber es wird schnell massiv komplex und wahrscheinlich fehleranfällig/nicht zukunftssicher/etc. – Fraser

+0

Und deins bekam +1 von mir :-) – Angew

Verwandte Themen