consideri il seguente esempio minimo:Le variabili impostate con PARENT_SCOPE sono vuote nello scope secondario corrispondente. Perché?
.
├── bar
│ └── CMakeLists.txt
└── CMakeLists.txt
dove ./CMakeLists.txt
è
project(foo)
cmake_minimum_required(VERSION 2.8)
set(FOO "Exists in both, parent AND in child scope.")
add_subdirectory(bar)
message(STATUS "Variable BAR in ./ = ${BAR}")
message(STATUS "Variable FOO in ./ = ${FOO}")
e ./bar/CMakeLists.txt
è
set(BAR "Exists in parent scope only." PARENT_SCOPE)
message(STATUS "Variable BAR in ./bar/ = ${BAR}")
La parte rilevante della produzione di cmake
è questo:
...
-- Variable BAR in ./bar/ =
-- Variable FOO in ./bar/ = Exists in both, parent AND in child scope.
-- Variable BAR in ./ = Exists in parent scope only.
-- Variable FOO in ./ = Exists in both, parent AND in child scope.
...
Poiché la variabile BAR
è inserita nello scope padre, mi aspetto che sia disponibile anche nell'attuale ambito figlio (e in quelli successivi), proprio come la variabile FOO
, che è definita l'ambito genitore su iniziare con. Ma come si può vedere nelle righe sopra la variabile BAR
è vuoto in ./bar/CMakeLists.txt
, che mi portano a alle seguenti domande:
Perché l'ambito genitore modificato non immediatamente accessibili nel bambino campo di applicazione, ./bar/
? Questo può essere mitigato? Se sì, come? E se no, che cos'è un work-around ? O mi manca completamente qualcosa di ovvio?
Contesto: il mio progetto è composto da diversi eseguibili e librerie. Per una libreria , ad es. bar
, Vorrei impostare una variabile bar_INCLUDE_DIR
che sia aggiunta ai percorsi di inclusione di qualsiasi eseguibile dipendente, ad esempio target_include_directories(my_target PUBLIC bar_INCLUDE_DIR)
.
In realtà, questo è quello che uso. Ma poiché 'my_target' si trova in un * fratello * rispetto a una' bar' di libreria richiesta, io uso la deviazione tramite l'ambito genitore per inoltrare il percorso della directory include. – nils
Non hai bisogno di variabili per trasmettere tali informazioni. Tutto quello che devi fare è applicare 'target_include_directories' nella libreria e tutti gli altri target che lo utilizzano otterranno automaticamente le directory rilevanti nel loro percorso di inclusione. – Lindydancer
Aaah, ora capisco cosa intendi. È molto meglio, davvero. Grazie per la tua persistenza! – nils