Ключевое слово INTERNAL
Свойство переменной. Посмотрите на этот пример:
Test/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8)
Project(Test)
add_subdirectory(Component1)
add_subdirectory(Component2)
Test/COMPONENT1/CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.11)
project(Component1)
set(SOURCES test1.c)
set(Component1_CONF "SomeValue" CACHE STRING "Component1_CONF description")
message(STATUS "Component1_CONF=${Component1_CONF}")
add_library(Component1 ${SOURCES})
target_include_directories(
Component1 INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>"
)
Test/COMPONENT2/CMakeLists.txt:
project(Component2)
set(SOURCES test1.c)
set(Component2_CONF "/etc/passwd" CACHE FILEPATH "Component2_CONF description")
add_executable(Component2 ${SOURCES})
target_link_libraries(Component2 Component1)
На самом деле Component2
может быть библиотекой статической или общей не исполняемой, это не имеет значения.
Теперь, если вы запустите cmake-gui
на верхней директории и запустить Configure
вы увидите, как Component1_CONF
и Component2_CONF
. Но если изменить верхний уровень CMakeLists.txt
и добавьте строку, которая принудительно устанавливает Component1_CONF
:
cmake_minimum_required(VERSION 2.8)
Project(Test)
set(Component1_CONF "Other value" CACHE INTERNAL "Component1_CONF forced value" FORCE)
add_subdirectory(Component1)
add_subdirectory(Component2)
вы будете эффективно скрыть Component1_CONF
от cmake-gui
и даже из командной строки (-DComponent1_CONF=Boo
) конфигурации.
Также вы должны заметить, что обычно переменные устанавливаются только в текущей области (если не используется ключевое слово PARENT
). Таким образом, переменные, заданные в каком-то каталоге, не влияют на переменные, заданные в одноранговых подкаталогах и родительский подкаталог. Однако, если переменные установлены в одной и той же области (например, когда вы запускаете тесты конфигурации из родителя CMakeLists.txt
), тогда да, они могут мешать друг другу. Чтобы предотвратить этот CMake, используется соглашение об именах, которое явно разделяет переменные из разных пакетов. Большинство макросов конфигурации получает параметр «префикс», который указывает префикс имени для переменных, заданных в макросах, поэтому пользователи макросов (то есть приложения CMakeLists.txt) могут явно разделять тестовые переменные из разных зависимых пакетов.
Наконец-то я снова нашел свой ответ :) Это стоило каждой щедрости ответить на этот вопрос, и я могу, наконец, использовать его :) – GameDeveloper