Cmake宏,用于将自动工具构建的git子模块添加到cmake项目

时间:2019-12-25 00:09:16

标签: git cmake autotools

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

问题是:将这种基于自动工具的库合并到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?

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

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

可以将submodule替换为directory,但我想强调一点,它将具有git子模块支持:我们假设该子目录既是git子模块,又是使用GNU autotools构建的。 / p>

现在您要说的是:但是您需要传递配置参数,而不是全部。但是,就像基于cmake的子模块将所有配置和构建信息存储在项目本身中一样,自动工具构建的项目也应如此。我们仍然可以克隆该项目,并以某种方式向其添加所有需要的信息。这不是很多工作(与添加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,并且需要将第三方自动工具库合并到他们的项目中。

0 个答案:

没有答案