Переопределение значения параметра по умолчанию (...) в CMake из родительского CMakeLists.txt - PullRequest
53 голосов
/ 22 сентября 2010

Я пытаюсь включить несколько сторонних библиотек в мое дерево исходников с минимальными изменениями в их системе сборки для простоты обновления.Все они используют CMake, как и я, поэтому в моем собственном CMakeLists.txt я могу использовать add_subdirectory(extern/foo) для libfoo.

Но foo CMakeLists.txt компилирует тестовый набор, создает документацию, разделяемую библиотеку, которую яне нужно и так далее.У авторов libfoo было предвидение контролировать их с помощью опций - например, option(FOO_BUILD_SHARED "Build libfoo shared library" ON) - что означает, что я могу установить их с помощью командной строки CMake.Но я хотел бы отключить это по умолчанию и переопределить через командную строку.

Я пытался сделать set(FOO_BUILD_SHARED OFF) до add_subdirectory(extern/foo).Это приводит к тому, что я не пытаюсь собрать общую библиотеку во время второй и последующих попыток сборки, но не во время первой, которую мне действительно нужно ускорить.

Возможно ли это сделать илиМне нужно поддерживать разветвленный CMakeLists.txt для этих проектов?

Ответы [ 2 ]

69 голосов
/ 22 сентября 2010

Попробуйте установить переменную в CACHE

SET(FOO_BUILD_SHARED OFF CACHE BOOL "Build libfoo shared library")

Примечание. Необходимо указать тип переменной и описание, чтобы CMake знал, как отображать эту запись в графическом интерфейсе.

0 голосов
/ 28 января 2019

Этот вопрос довольно старый, но 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 будет отличаться.

...