在 CMake 中使用“git 子模块”和“ExternalProject_Add”进行依赖管理之间有什么关系?

What is the relationship between use of `git submodules` and `ExternalProject_Add` for dependency mangement in CMake?

我最近花了很多时间来关注一位早已离去的开发人员对我正在处理的 C++ 项目的模糊且不正确的构建说明。因此,我正在编写一个新的构建系统,并且正在寻找实现它的最佳方法。我已经决定在 CMake 中使用 ExternalProject_Add 命令在项目目标之前收集和构建依赖项,但我也发现了一个优秀的 article suggesting use of git submodules, which looks like it does a very similar, if not the same thing. So my question: What is the relationship between git submodules and ExternalProject_Add?

您可以在没有 git 个子模块的情况下使用 ExternalProject_Add

if (SPECIAL_CASE)
  include (ExternalProject)
  ExternalProject_Add (
    project1
    PREFIX project1
    GIT_REPOSITORY "https://github.com/project.git"
    GIT_TAG "v1"
  )
endif ()

project 将被克隆到 CURRENT_BINARY_DIR,在主项目构建之前构建并安装到本地系统中。您的主要项目将使用全局范围内的 #include <project/header.h>。此解决方案仅适用于 热门项目 ,这些项目可作为部分目标操作系统的依赖项使用。您可以保证您的目标系统将收到所需的依赖版本。

例如让我们看看 openssl,您的本地系统 100% 安装了这个库。您的目标操作系统列表包括本机 Win32(没有 MinGWCygWin)。 Win32openssl 的所有可用版本都太旧了,您将无法找到 Win32openssl 安装程序所需的版本。因此,您可以在没有子模块的情况下将 #include <openssl/ssl.h>if (WIN32) ExternalProject_Add 一起使用。将 openssl 子模块添加到您的项目没有意义。

请查看following example

如果外部 project 不流行,在流行的包管理器(如 rpm、deb、ebuilds 等)中不可用,那么最好使用子模块。