2013-03-20 11 views
6

Ho aggiunto una sottodirectory in CMake utilizzando add_subdirectory. Come posso accedere a una variabile dall'ambito di quella sottodirectory senza impostare esplicitamente la variabile utilizzando set in combinazione con PARENT_SCOPE?CMake: Come accedere a una variabile da una sottodirectory senza impostarla esplicitamente nell'oggetto principale

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? 

È possibile?

+0

In che modo la variabile 'BOX2D_VERSION' è impostata nel file CMakeLists.txt della sottodirectory? – Fraser

+1

È impostato come variabile semplice. (quindi, secondo la risposta di seguito, sembra che non sia possibile accedervi senza modificare BodaDLists.txt di Bod2d) – user1492625

+0

Beh, un po '. Ho aggiunto una risposta che è più di una soluzione alternativa di una vera soluzione. – Fraser

risposta

7

Se la variabile è una variabile semplice (al contrario di una variabile cache), non è possibile accedervi dall'ambito principale.

È possibile accedere alle variabili della cache (quelle impostate con set(... CACHE ...)) indipendentemente dall'ambito, così come le proprietà globali (set_property(GLOBAL ...)).

3

Mentre @ di Angew risposta è corretta, non ci sono molte cose che sono veramente impossibile con CMake :-)

Se si dispone di una linea come

set(BOX2D_VERSION 2.2.1) 

in Box2D_v2.2.1/CMakeLists.txt, quindi è possibile recuperare la versione del perimetro genitore facendo qualcosa di simile:

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

Questo è un po 'fragile; ad esempio, non accetta spazi aggiuntivi nel comando set o soddisfa il valore impostato due volte. È possibile soddisfare anche queste possibilità, ma se si conosce il formato del comando set ed è improbabile che cambi, questa soluzione è ragionevole.

+0

Bel trucco. Girerei '[]' in '[\ t]', per ogni evenienza. Inoltre, non funzionerà quando la variabile viene impostata usando una funzione (si pensi 'set ($ {resVar} 1.1 PARENT_SCOPE)'), all'interno di un condizionale ecc. Mi piace la risposta, ma ci sono molti avvertimenti. – Angew

+0

@Angew - Sì, sono d'accordo che questa è solo una soluzione - la tua è sicuramente la migliore risposta (ha un +1 da me). Penso che questo possa essere adattato usando la corrispondenza delle espressioni regolari per adattarsi a qualsiasi scenario, ma diventa rapidamente complesso e probabilmente incline agli errori/non a prova di futuro/ecc. – Fraser

+0

E il tuo ha ottenuto +1 da me :-) – Angew

Problemi correlati