【问题标题】:cmake pre-build command to copy files from external repositorycmake pre-build 命令从外部存储库复制文件
【发布时间】:2021-08-07 16:27:20
【问题描述】:

在我的项目中,我有一个外部依赖项(一个 Github 存储库),我想从中将某些文件复制到源并包含我的项目的目录。我只需要外部存储库中的源文件和头文件的子集,所以我只想能够将我需要的文件的更新版本复制到我项目的相关目录中。我相信ExternalProject_Add 应该是从外部项目下载文件的正确命令,但我不知道如何将它们复制到我的源代码并在每次构建之前包含目录。是否有ExternalProject_Add 的选项来实现这一点,或者是否应该使用add_custom_command 添加自定义构建规则,在下载外部项目后复制文件?

【问题讨论】:

  • 您为什么要复制文件?您是否查看了文档 cmake.org/cmake/help/latest/module/… 中的示例部分?
  • 外部存储库包含构建库和多个可执行文件的多个目标。我只对在我的项目中使用该库感兴趣,我不需要构建可执行文件的应用程序的源文件。因此,我不想使用外部存储库中包含的CMakeLists.txt 文件。我查看了您链接的示例,但对我的用例没有多大意义。这里是Cmake新手,我可能误解了一些概念。
  • I'm only interested in using the library in my project and I don't need the source files for the application 所以你想安装这个库吗?它被称为安装 - 例如。你下载的是firefox,而不是firefox源。但是如果库没有打包,那么无论如何你都必须重新编译它,然后只需add_subdirectory它。
  • 对不起,我说库建错了;似乎只构建了两个可执行文件。您可以查看我要链接到here 的外部存储库的CMakeLists.txt。我需要编译和安装库,不想编译可执行文件。当我做add-subdirectory时,我猜cmake会使用子目录中的CMakeLists.txt(这里是code),所以我仍然无法弄清楚如何在不修改给定CMakeLists.txt(即不受我控制)。
  • 太好了 - 所以将存储库添加为 git 子模块,然后使用您自己的配置创建您自己的 CMakeLists.txt。无论如何,图书馆显然是在github.com/EricssonResearch/scream/blob/… 创建的

标签: cmake build build-system


【解决方案1】:

您可以在此处查看我要链接到的外部存储库的 CMakeLists.txt。我需要编译和安装库,不想编译可执行文件

如果您的代码在子模块内,您可以通过 git submodule 添加外部代码,或者使用文档中说明的 FetchContent:

include(FetchContent)
FetchContent_Declare(
       screamrepo
       GIT_REPOSITORY "https://github.com/EricssonResearch/scream"
)
FetchContent_GetProperties(screamrepo)
if(NOT screamrepo_POPULATED)
  FetchContent_Populate(screamrepo)
endif()
# use ${screamrepo_SOURCE_DIR} for source dir

如果外部代码结构良好并公开了您想要拥有的库,那么:

add_subdirectory(the/source/path EXCLUDE_FROM_ALL)

并使用该库。如果不是,例如您不喜欢第三方 cmake 配置或它带有不受支持的配置,请编写您自己的目标 add_library 和配置,并包含使用源目录中其他存储库文件的路径。

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多