请考虑一个使用git和git子模块的大型项目(父项目或"cmake-project"
)。有些子模块是第三方的,不使用cmake,而是使用GNU自动工具。
问题是:将这种基于自动工具的库合并到cmake项目中的简单方法是什么?
当然,可以派生此类存储库并自己添加cmake支持, 但这通常是很多工作,并不总是可行的。 相反,我希望直接将这些第三方项目作为子模块使用。
使用cmake本身的git子模块在父项目的CMakeLists.txt
中需要以下行:
add_subdirectory( cmake-submodule )
为完整起见,让我添加此案例的其他要求。
--recursive
才能检出子模块:git clone --recursive <URL-to-project>/cmake-project.git
git submodule update --init --recursive
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
。所需的工作量是巨大的。您可以在此处查看其运行情况:
我想要将其压缩为可以用作单个add_autotools_submodule
宏的常规内容。
我希望最终我们能得到很多人可以使用的东西,他们也使用cmake,git,并且需要将第三方自动工具库合并到他们的项目中。