首页 > 解决方案 > 用于将自动工具构建的 git 子模块添加到 cmake 项目的 Cmake 宏

问题描述

"cmake-project"考虑一个使用 git 和 git 子模块的大型项目(父项目或)。一些子模块是第三方的,不使用 cmake,而是使用 GNU 自动工具。

问题是:将这些基于 autotools 的库合并到 cmake 项目中的简单方法是什么?

当然,可以分叉这样的存储库并自己添加 cmake 支持,但这通常需要大量工作并且并不总是可行的。相反,我希望简单地使用这些第三方项目作为子模块。

使用 cmake 本身的 git 子模块需要CMakeLists.txt父项目中的以下行:

add_subdirectory( cmake-submodule )

为了完整起见,让我添加此案例的附加要求。

  1. 克隆父项目时,需要通过--recursive检查子模块:
    git clone --recursive <URL-to-project>/cmake-project.git
  2. 如果忘记了上述内容,或者(由其他人)添加了新的子模块,则需要以下命令来获取子模块:
    git submodule update --init --recursive
  3. 像这样签出的子模块处于分离HEAD状态;这使得处理它们(做提交)变得不切实际。如果您想查看整个项目,包括它的子目录(子模块)作为您可以破解的“一个大快乐项目”,那么每个子模块必须首先与一个分支相关联:
    git checkout master
    之后您可能想要git pull --ff-only执行子模块/子目录的“真实”(最新)内容。

在上述之后,当对子模块进行更改时,可以简单地提交,当整个项目处于一致状态时,将子模块添加到父项目,也提交并推送所有内容:

# In each submodule:
git commit -a -m 'It works.'

接着,

make test # Success!
git commit -a -m 'Bring parent project up to date with submodules.'
git push # Automatically pushes all submodules because you already did a
         # git config push.recurseSubmodules on-demand, right?

我想要的是,当我有一个使用 autotools 而不是 cmake 的子模块时,事情几乎一样简单,即:

add_autotools_submodule( autotools-project ) # As opposed to add_subdirectory.

可以替换submoduledirectory,但我想强调这将支持 git 子模块:我们假设这个子目录既是一个 git 子模块,又是用 GNU autotools 构建的。

现在你要说:但你需要传递配置参数和所有的东西。但是,就像基于 cmake 的子模块将所有配置和构建信息存储在项目本身中一样,autotools 构建的项目也应该如此。我们仍然可以通过某种方式克隆这个项目并向其中添加所有需要的信息。这不是很多工作(与添加 cmake 支持相反)。我已经为使用 autotools 子模块的 autotools 项目做了这个。这些子模块包含一个configure.m4文件。将这些信息放在子模块中(而不是在这种情况下,configure.ac每个项目都使用它!)避免重复并使维护更容易。

add_autotools_submodule如果存在,则应使用此类文件,否则使用合理的默认值。

在子模块下载之前,这个文件当然是不可用的;显然它不包含任何“下载”信息。我们不需要下载任何东西;我们为此使用 git。

我之前已经使用ExternalProject_add过一次,用于使用自动工具的子模块。所需的工作量是巨大的。你可以在这里看到它的实际效果:

https://github.com/CarloWood/evio/blob/f8f7511ac39ea8ad1107cf62d70c71a72332cf95/protocol/CMakeLists.txt

我想要将其浓缩为可用作单个add_autotools_submodule宏的通用内容。

我希望最终我们可以得到很多人可以使用的东西,他们也使用 cmake、git 并且需要将第三方 autotools 库合并到他们的项目中。

标签: gitcmakeautotools

解决方案


推荐阅读