CMet's FetchContent с зависимостью, созданной в Makefile - PullRequest
0 голосов
/ 31 октября 2019

Мой текущий проект требует библиотеки, которая построена с Makefile. Я хотел бы скомпилировать эту библиотеку во время компиляции моего проекта;эта функция является основным преимуществом FetchContent, и она очень хорошо работает с зависимостями CMake. Тем не менее, я не могу заставить его работать с Makefiles, и не могу найти примеры того, как это сделать.

FetchContent_Declare(
    make_lib
    URL http://url/library_code.tar.gz 
    BUILD_COMMAND ${CMAKE_COMMAND} -E env make -j 8
    BUILD_IN_SOURCE true  
    BINARY_DIR ""
)

FetchContent_GetProperties(make_lib)
if (NOT make_lib_POPULATED)
    FetchContent_Populate(make_lib)

    # here I would like to declare imported libraries:
    add_library(make_lib::libA STATIC IMPORTED GLOBAL)
    target_include_directories(make_lib::libA INTERFACE ${make_lib_SOURCE_DIR}/include)
    set_property(TARGET make_lib::libA   PROPERTY IMPORTED_LOCATION <path to "to be built" lib>)

endif()
  • Возможно ли выполнение "1005 * во время компиляции" привсе?
  • Если это так, может ли это быть параллельно?
  • Можно ли объявить импортированные цели с помощью библиотеки, скомпилированной по зависимости?

1 Ответ

1 голос
/ 31 октября 2019

Команды 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() для запроса информации о цели внешнего проекта. В связанном примере показано, как получить исходный каталог проекта, который может быть полезен для определения местоположения встроенной библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...