При сборке проекта на верхнем уровне вы можете передать ему параметр, используя параметр командной строки
-D<VARIABLE>=<VALUE>
(ExternalProject_Add
строит проект «как если бы» верхнего уровня, поэтому передача параметров технически такая же).
При сборке какого-либо проекта как подпроекта с использованием подхода add_subdirectory
вы можете использовать тот же параметр командной строки
-D<VARIABLE>=<VALUE>
для проекта верхнего уровня , и этот параметр будет распространен на подпроект тоже.
При передаче параметр в проект верхнего уровня нежелателен, тогда вы можете эмулировать настройку параметра внутри CMakeLists.txt
, используя set (CACHE INTERNAL) поток команд:
set(<PARAMETER> <VALUE> CACHE INTERNAL "<some description>")
Убедитесь, что эта строка выдается перед вызовом add_subdirectory()
(иначе это не повлияет на подпроект).
Итак, в вашем случае вы можете использовать следующий код:
if(NOT ${SEAL}_POPULATED)
FetchContent_Populate(${SEAL})
# Make subproject to use 'BUILD_SHARED_LIBS=ON' setting.
set(BUILD_SHARED_LIBS ON CACHE INTERNAL "Build SHARED libraries")
add_subdirectory(${${SEAL}_SOURCE_DIR} ${${SEAL}_BINARY_DIR})
endif()
Все вышеперечисленное отлично работает, когда проект верхнего уровня не использует набор параметров для подпроекта.
Если и на проект верхнего уровня, и на подпроект влияет один и тот же параметр, и вы хотите жестко закодировать параметр только для подпроекта, тогда все усложняется. Параметр необходимо восстановить после вызова add_subdirectory
:
if(NOT ${SEAL}_POPULATED)
FetchContent_Populate(${SEAL})
# Store the old value of the 'BUILD_SHARED_LIBS'
set(BUILD_SHARED_LIBS_OLD ${BUILD_SHARED_LIBS})
# Make subproject to use 'BUILD_SHARED_LIBS=ON' setting.
set(BUILD_SHARED_LIBS ON CACHE INTERNAL "Build SHARED libraries")
add_subdirectory(${${SEAL}_SOURCE_DIR} ${${SEAL}_BINARY_DIR})
# Restore the old value of the parameter
set(BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS_OLD} CACHE BOOL "Type of libraries to build" FORCE)
endif()
# ...
# The library will be created according to "original" value for BUILD_SHARED_LIBS option.
add_library(top_lib top_lib.c)
Обратите внимание, что в случае восстановления параметра вместо set(CACHE INTERNAL)
используется поток команд set(CACHE TYPE FORCE)
. Это восстанавливает не только значение переменной CACHE, но и ее тип, который показан в CMake GUI.