Переопределение значения по умолчанию (...) в CMake из родительского CMakeLists.txt
Я пытаюсь включить несколько сторонних библиотек в свое исходное дерево с минимальными изменениями в их системе сборки для удобства обновления. Все они используют 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)
. Это приводит к тому, что вы не пытаетесь создать общую библиотеку во время второй и последующих попыток сборки, но не во время первого, что мне действительно нужно ускорить.
Возможно ли это, или мне нужно поддерживать forked CMakeLists.txt для этих проектов?
Ответы
Ответ 1
Попробуйте установить переменную в CACHE
SET(FOO_BUILD_SHARED OFF CACHE BOOL "Build libfoo shared library")
Примечание. Необходимо указать тип переменной и описание, чтобы CMake знал, как отображать эту запись в графическом интерфейсе.
Ответ 2
Этот вопрос довольно старый, но 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 будет отличаться.