Помислете за следния минимален пример:
.
├── bar
│ └── CMakeLists.txt
└── CMakeLists.txt
където ./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}" )
и ./bar/CMakeLists.txt
е
set( BAR "Exists in parent scope only." PARENT_SCOPE )
message( STATUS "Variable BAR in ./bar/ = ${BAR}" )
Съответната част от изхода на cmake
е следната:
...
-- 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.
...
Тъй като променливата BAR
е поставена в родителския обхват, бих очаквал тя да бъде налична и в текущия дъщерен обхват (и в тези, които следват) -- точно като променливата FOO
, която е дефинирана родителския обхват като начало. Но както може да се види в горните редове, променливата BAR
е празна в ./bar/CMakeLists.txt
, което ме навежда на следните въпроси:
Защо модифицираният родителски обхват не е незабавно достъпен в дъщерния обхват, ./bar/
? Може ли това да бъде смекчено? Ако да, как? И ако не, какво е заобиколно решение? Или напълно пропускам нещо очевидно?
Контекст: моят проект се състои от няколко изпълними файла и библиотеки. За библиотека, напр. bar
, бих искал да задам променлива bar_INCLUDE_DIR
, която се добавя към включените пътища на всеки зависим изпълним файл, т.е. target_include_directories( my_target PUBLIC bar_INCLUDE_DIR )
.