cmake - CMake 的 FetchContent 与 Makefile 构建的依赖项
问题描述
我当前的项目需要一个使用 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
文档中:
该模块可以通过
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
在compile-time运行。您还应该能够将导入的库声明为您的代码布局。但重要的是,请记住调用add_dependencies()
which 告诉 CMake 你make_lib
被另一个目标使用;否则,make-lib
将无法构建。
调用后ExternalProject_Add()
,您可以使用ExternalProject_Get_Property()
查询外部项目目标的信息。链接示例显示了如何获取项目的源目录,这对于获取构建库的位置可能很有用。
推荐阅读
- python - 为什么在使用 lxml 编写 XML 文件后,属性值中的非 ASCII 字符会转义?
- embedded - l3gd20 陀螺仪在 stm32f3discovery 上发回重复字节
- c++ - 使用 MinGW 在 Windows 上构建 GLEW 时遇到问题
- c# - 如何在场景之间保存firebase身份验证
- rust - 如何将 rustdoc 注释添加到 proc 宏生成的代码中?
- node.js - Docker / docker-compose 工作流程:未反映角度变化
- perl - 是否可以使用 perl 将鼠标光标移动到 xvfb 虚拟显示器?
- java - Android:从图库中选择照片
- python - 如何在 lmdb 中正确插入重复键?
- python - 如何在tensorflow中解析张量而不给出out_type?