Этот вопрос довольно старый, но Google привел меня сюда.
Проблема с SET(<variable name> <value> CACHE BOOL "" FORCE)
состоит в том, что он установит опциональный проект широко.Если вы хотите использовать подпроект, который является библиотекой, и вы хотите установить BUILD_STATIC_LIBS
для подпроекта (ParentLibrary
), используя SET(... CACHE BOOL "" FORCE)
, он установит значение для всех проектов.
Я использую следующую структуру проекта:
|CMakeLists.txt (root)
|- dependencies
| CMakeLists.txt (dependencies)
|- ParentLibrary
| CMakeLists.txt (parent)
|- lib
| CMakeLists.txt (lib)
Теперь у меня есть CMakeLists.txt (dependencies)
, который выглядит следующим образом:
# Copy the option you want to change from ParentLibrary here
option (BUILD_SHARED_LIBS "Build shared libraries" ON)
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(ParentLibrary)
Преимущество в том, что мне не нужно изменятьParentLibrary
и что я могу установить опцию только для этого проекта.
Необходимо явно скопировать команду option
из ParentLibrary
, так как в противном случае при выполнении конфигурации CMake изначально значение переменной будетсначала устанавливается командой set
, а затем значение будет перезаписываться командой option
, поскольку в кэше не было значения.При повторном выполнении конфигурации CMake команда option
будет игнорироваться, поскольку в кеше уже есть значение и будет использоваться значение из команды set
.Это может привести к некоторому странному поведению, что конфигурация между двумя запусками CMake будет отличаться.