Команды FetchContent_*
просто извлекают содержимое или метаданные из определенного внешнего ресурса и заполняют переменные CMake;на самом деле они не выполняют никаких действий по настройке, сборке или установке. Таким образом, любые параметры, относящиеся к этим шагам, явно игнорируются при вызове FetchContent_Declare()
. Сюда входят следующие параметры:
CONFIGURE_COMMAND
BUILD_COMMAND
INSTALL_COMMAND
TEST_COMMAND
Из документации FetchContent
:
Этот модуль позволяет заполнять контент во время настройки любым способом, поддерживаемым модулем ExternalProject
. Принимая во внимание, что ExternalProject_Add()
загружается во время сборки, модуль FetchContent
делает содержимое доступным немедленно, что позволяет этапу настройки использовать содержимое в таких командах, как операции add_subdirectory()
, include()
или file()
.
Это не относится к вашему случаю использования, так как вызовы типа add_subdirectory()
не будут работать, потому что во внешней библиотеке нет файлов CMake.
Как уже упоминалось в этом посте, ExternalProject_Add()
имеет больше смысла в вашей ситуации. Ваш вызов может выглядеть примерно так:
ExternalProject_Add(make_lib
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}
URL http://url/library_code.tar.gz
UPDATE_COMMAND ""
SOURCE_DIR ${make_lib_SOURCE_DIR}
BUILD_IN_SOURCE 1
CONFIGURE_COMMAND ""
BUILD_COMMAND "make -j8"
INSTALL_COMMAND "${make_lib_install_commands}"
)
add_library(make_lib_libA STATIC IMPORTED GLOBAL)
set_property(TARGET make_lib_libA
PROPERTY IMPORTED_LOCATION
${make_lib_SOURCE_DIR}/path/to/make_lib_libA.a
)
add_dependencies(myOtherLib make_lib)
Обратите внимание, BUILD_COMMAND
здесь не будет проигнорировано, но будет выполняться make -j8
в время компиляции . Вы также должны быть в состоянии объявить импортированную библиотеку как выложенный код. Но, что важно, не забудьте вызвать add_dependencies()
, который сообщает CMake, что make_lib
используется другой целью;в противном случае make-lib
будет не построить.
После вызова ExternalProject_Add()
вы можете использовать ExternalProject_Get_Property()
для запроса информации о цели внешнего проекта. В связанном примере показано, как получить исходный каталог проекта, который может быть полезен для определения местоположения встроенной библиотеки.