建议使用Autoconf Archive宏和其他第三方宏的方法

时间:2013-08-04 19:56:21

标签: git autotools autoconf automake

我在Autoconf Archive中找到了几个有用的宏,还有一个有用的m4文件,它有助于测试Boost库支持。 Autoconf Archive由GNU托管,Boost m4帮助器作为GitHub仓库托管。我想在一个使用Autotools并由git管理的C ++项目中使用它们。

显然,可以手动下载并插入我项目的git仓库。但是有更推荐的方法吗?

例如,通过使构建过程自动下载第三方文件,而不是手动更新它们,可以确保第三方文件是最新版本。它还有助于将源与外部文件分开,因为第三方文件实际上不是纯源代码的一部分,而是外部下载文件。

如果这是一件好事,应该通过autogen.sh手动完成吗?或者使用automake.am?或两者兼而有之(例如在autogen.sh下载文件和在automake中测试版本+更新)?

我想将它们保存在git repo中并不是一场灾难(就像COPYING,git.mk和其他人一样),但是让构建过程从Web上将它们更新为最新版本仍然很有用。 / p>

2 个答案:

答案 0 :(得分:5)

相反,autoconf宏文件是corresponding source的一部分,在make dist tarball中非常重要。实际上,大多数autoconf宏都不会经常更改,以保证构建中的某种更新功能。即使他们经常更新,也无法保证更新的宏不会破坏您现有的构建。

将宏保持在源代码管理下是一个好主意。

编辑:我同意@delinquentme将这些添加为git子模块会很好(可以锁定版本,轻松更新)。但我发现这种方法存在一些问题。

第一个是git没有(IIUC)支持部分检查,即使是子模块也是如此。 GNU Autoconf Archive(例如)有 lot 的宏,你可能只需要其中一些。剩下的未使用的文件和宏仍然在那里,未使用,并且妨碍了。

第二个问题是AC_CONFIG_MACRO_DIR只能在一个目录中找到宏,并且该目录中的 no子目录搜索,这使得使用多个子模块很烦人。你可以通过在不显眼的地方检查子模块并将它们符号链接到AC_CONFIG_MACRO_DIR来实现。

对我而言,宏的上游历史并不是那么重要。这就是上游VCS的用途: - )。

答案 1 :(得分:1)

您可以通过多种方式处理这些依赖关系:

子模块http://git-scm.com/docs/git-submodule

  

... [S] ubmodules适用于您想要制作的不同项目   你的源代码树的一部分,而两个项目的历史仍然存在   保持完全独立,你不能修改的内容   主项目内的子模块。 [注意:cd进入repo将允许编辑]

挂钩http://git-scm.com/book/en/Customizing-Git-Git-Hooks

  

与许多其他版本控制系统一样,Git可以在发生某些重要操作时触发自定义脚本。这些钩子有两组:客户端和服务器端。

  • 通过git特定事件运行

  • Git支持,如果您正在寻找持续集成,而不是冻结资产

我同意@ ldav1s'将它们保留在版本控制之内,但是关于可维护性,知道代码的来源(维护历史记录)可能会有所帮助。随着未来的更新,建立其他人所做的工作似乎是有利的......

TLDR:使用子模块,维护历史记录并完成它。

$ git submodule add http://git.savannah.gnu.org/gitweb/?p=autoconf-archive.git;a=blob_plain;f=m4/ax_am_jobserver.m4

上面的命令会将URL子模块化到当前目录

中的代码库中