Рассмотрим следующий минимальный пример:
.
├── 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 )
.