Rozważmy następujący minimalny przykład:Zestaw zmiennych z PARENT_SCOPE są puste w odpowiednim zasięgu podrzędnym. Czemu?
.
├── bar
│ └── CMakeLists.txt
└── CMakeLists.txt
gdzie ./CMakeLists.txt
jest
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}")
i ./bar/CMakeLists.txt
jest
set(BAR "Exists in parent scope only." PARENT_SCOPE)
message(STATUS "Variable BAR in ./bar/ = ${BAR}")
Istotna część wyjściu cmake
to:
...
-- 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.
...
Ponieważ zmienna BAR
jest umieszczana w zasięgu nadrzędnym, oczekiwałbym, że będzie ona dostępna również w bieżącym zasięgu podrzędnym (i w kolejnych) - tak jak zmienna FOO
, która definiuje zakres rodzica do zaczynać się. Ale jak widać w powyższych wierszach zmienna BAR
jest pusta ./bar/CMakeLists.txt
, które prowadzą mnie do następujące pytania:
Dlaczego jest zakres rodzic zmodyfikowany nie od razu dostępne w zakresie, ./bar/
dziecko ? Czy można to złagodzić? Jeśli tak, w jaki sposób? A jeśli nie, co to jest obejście ? Czy też zupełnie brakuje mi czegoś oczywistego?
Kontekst: mój projekt składa się z kilku plików wykonywalnych i bibliotek. Dla biblioteki , np. bar
, Chciałbym ustawić zmienną bar_INCLUDE_DIR
, która jest dodawana do ścieżek dołączania każdego zależnego pliku wykonywalnego, tj. target_include_directories(my_target PUBLIC bar_INCLUDE_DIR)
.
W rzeczywistości to właśnie używam. Ale ponieważ 'my_target' ma zasięg * rodzeństwa * w stosunku do wymaganej biblioteki' bar', używam objazdu za pośrednictwem zakresu nadrzędnego, aby przekazać lokalizację katalogu zawierającego. – nils
Nie potrzebujesz zmiennych do przekazania tych informacji. Wszystko, co musisz zrobić, to zastosować 'target_include_directories' w bibliotece, a wszystkie inne obiekty docelowe, które będą z niego korzystać, automagicznie uzyskają odpowiednie katalogi w swojej ścieżce dołączania. – Lindydancer
Aaah, teraz rozumiem, co masz na myśli. W rzeczy samej jest znacznie lepiej. Dzięki za wytrwałość! – nils