Подтвердить что ты не робот

Переопределение значения по умолчанию (...) в 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 для этих проектов?

4b9b3361

Ответ 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 будет отличаться.