有没有办法可靠地让 automake 忽略时间戳?

Is there a way to reliably get automake to ignore timestamps?

首先,关于我问这个问题的原因的一些背景知识:我们产品的每日构建脚本(如 Jenkins 在 Debian Linux 下的 运行)大致执行以下操作:

  1. 使用 debootstrap 和 chroot 创建并进入构建环境
  2. 从 SVN 查看我们的代码库(包括一些第 3 方库)
  3. 根据需要运行 configure 和 make 以构建所有代码
  4. 将结果打包到一个安装文件中,该文件可以使用我们的安装工具上传到我们的无头服务器盒。

这大部分工作正常,但每隔一段时间(可能每天构建一次,共 10 次),构建我们第三方库之一的脚本部分会出现如下错误:

CDPATH="${ZSH_VERSION+.}:" && cd . && /bin/bash 
/root/software/3rdparty/libogg/missing autoconf
/root/software/3rdparty/libogg/missing: line 81: autoconf: command not found
WARNING: 'autoconf' is missing on your system.
     You should only need it if you modified 'configure.ac',
     or m4 files included by it.
     The 'autoconf' program is part of the GNU Autoconf package:
     <http://www.gnu.org/software/autoconf/>
     It also requires GNU m4 and Perl in order to run:
     <http://www.gnu.org/software/m4/>
     <http://www.perl.org/>
make: *** [configure] Error 127

据我所知,这种情况偶尔会发生,因为第三方库中文件的时间戳不同(例如,由于检查时间的不同,彼此相差一两秒在该特定构建期间从 SVN 服务器输出)。这导致配置脚本认为它需要自动重新生成一个文件,因此它会尝试调用 'automake' 来这样做,但由于未安装 automake 而出错。

当然,这里要做的显而易见的事情是在构建环境中安装 automake,但是构建环境不是我可以轻易修改的(由于制度原因),所以我想避免如果可能的话,这样做。相反,我想做的是弄清楚如何让配置脚本(我可以修改)忽略时间戳,并始终执行它们在时间戳相等时所做的基本构建。

我试图通过在某些文件上手动 运行ning 'touch' 以强制它们的时间戳相同来解决问题,这似乎使问题发生的频率降低了,但它仍然发生:

./configure --prefix="$PREFIX" --disable-shared --enable-static && \
touch config* aclocal* Makefile* && \
make clean && make install ) || Failure "libogg"

任何熟悉 automake 工作原理的人都可以提供一些建议,告诉我如何在不修改构建环境的情况下使日常构建中的 "configure" 调用更可靠地工作吗?

您可以在您的 Jenkins 服务器上尝试 forcing SVN to use commit times on checkout。如果这些提交时间由于某种原因无法计算出来,也可以在 SVN 中设置。您可以使用 touch -dtouch -r 而不是 touch 来避免那里的竞争条件。