2013-03-20 10 views
6

Dodałem podkatalog w CMake przy użyciu add_subdirectory. Jak uzyskać dostęp do zmiennej z zakresu tego podkatalogu bez jawnego ustawienia zmiennej za pomocą set w połączeniu z PARENT_SCOPE?CMake: Jak uzyskać dostęp do zmiennej z podkatalogu bez jawnego ustawienia jej w nadrzędnym zakresie

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? 

Czy to możliwe?

+0

Jaka jest zmienna 'BOX2D_VERSION' w katalogu CMakeLists.txt w podkatalogu? – Fraser

+1

Ustawiona jest jako zmienna zwykła. (więc zgodnie z odpowiedzią poniżej wydaje się, że nie można uzyskać do niego dostępu bez modyfikowania CMakeLists.txt Bod2d) – user1492625

+0

Cóż, trochę. Dodałem odpowiedź, która jest bardziej rozwiązaniem niż prawdziwym rozwiązaniem. – Fraser

Odpowiedz

7

Jeśli zmienna jest zmienną zwykłą (w przeciwieństwie do zmiennej pamięci podręcznej), nie ma możliwości uzyskania dostępu do niej z zakresu nadrzędnego.

Dostęp do zmiennych pamięci podręcznej (zestaw z set(... CACHE ...)) można uzyskać niezależnie od zakresu, podobnie jak właściwości globalne (set_property(GLOBAL ...)).

3

Podczas użytkownika @ Angew odpowiedź jest poprawna, nie ma wielu rzeczy, które są naprawdę niemożliwej z CMake :-)

Jeśli masz taką linię

set(BOX2D_VERSION 2.2.1) 

w Box2D_v2.2.1/CMakeLists.txt, można pobrać wersję w zakresie dominującej robiąc coś takiego:

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

jest nieco kruchy; nie uwzględnia na przykład dodatkowych spacji w komendzie set lub uwzględnia podwójną wartość. Możesz również skorzystać z tych możliwości, ale jeśli znasz format polecenia set i jest mało prawdopodobne, aby go zmienić, jest to rozsądne obejście tego problemu.

+0

Dobra sztuczka. Chciałbym zmienić '[]' na '[\ t]', na wszelki wypadek. Ponadto nie zadziała, gdy zmienna zostanie ustawiona za pomocą funkcji (myślę 'set ($ {resVar} 1.1 PARENT_SCOPE)'), wewnątrz warunkowego itd. Podoba mi się twoja odpowiedź, ale jest wiele zastrzeżeń. – Angew

+0

@Angew - Tak, zgadzam się, że to tylko obejście - twoja jest zdecydowanie najlepszą odpowiedzią (ma +1 ode mnie). Myślę, że można to zaadaptować za pomocą dopasowania do wyrażenia regularnego, pasującego do niemal każdego scenariusza, ale szybko staje się ono bardzo złożone i prawdopodobnie jest podatne na błędy/nie jest odporne na przyszłość/itp. – Fraser

+0

A twój otrzymał ode mnie +1 :-) – Angew

Powiązane problemy