gpt4 book ai didi

CMake 的 FetchContent 具有 Makefile 构建的依赖性

转载 作者:行者123 更新时间:2023-12-02 19:49:04 31 4
gpt4 key购买 nike

我当前的项目需要一个使用 Makefile 构建的库。我想在我的项目编译期间编译这个库;此功能是 FetchContent 的主要卖点,它与 CMake 依赖项配合得很好。然而,我无法让它与 Makefile 一起工作,也找不到有关如何这样做的示例。

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()
  • make 的“编译时”执行是否可能?
  • 如果是这样,它可以平行吗?
  • 是否可以使用依赖编译库来声明导入的目标?

最佳答案

FetchContent_*命令只是从特定的外部资源获取内容或元数据,并填充 CMake 变量;它们实际上并不执行任何配置、构建或安装步骤。因此,在调用 FetchContent_Declare() 时,与这些步骤相关的任何选项都被明确忽略。这包括以下选项:

  • CONFIGURE_COMMAND
  • BUILD_COMMAND
  • INSTALL_COMMAND
  • TEST_COMMAND

来自 FetchContent 文档:

This module enables populating content at configure time via any method supported by the ExternalProject module. Whereas ExternalProject_Add() downloads at build time, the FetchContent module makes content available immediately, allowing the configure step to use the content in commands like add_subdirectory(), include() or file() operations.

这不适用于您的用例,因为像 add_subdirectory() 这样的调用会失败,因为外部库中没有 CMake 文件。

this 中所述发布,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()查询有关外部项目目标的信息。链接示例显示了如何获取项目的源目录,这对于获取构建库的位置很有用。

关于CMake 的 FetchContent 具有 Makefile 构建的依赖性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58644504/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com