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

标签 automake

首先,介绍一下我为什么问这个问题的背景:我们产品的日常构建脚本(由 Jenkins 在 Debian Linux 下运行)大致是这样的:

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

这基本上工作正常,但每隔一段时间(可能每天构建一次,共 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

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

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

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

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

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

最佳答案

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

关于automake - 有没有办法可靠地让 automake 忽略时间戳?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35995684/

相关文章:

ubuntu - 如何使用自动工具构建静态和共享库?

c++ - Emacs EDE - Automake 和子目录的顺序

gcc - 使用 gcc-ar 和 gcc-ranlib 的 autoconf 配方

c++ - gcov:从共享库生成 .gcda 输出?

autoconf - Automake 和库

gcc - 使用自动工具时 PACKAGE_NAME 和其他宏发生冲突

autotools - 如何确保将 check_SCRIPTS 添加到发行版中?

c - autotools:使用另一个目录中的代码进行编译

c++ - '-std=c++11' 对 C++/ObjC++ 有效,但对 C 无效

c - Autotools库中没有符号