automake版本(am__api_version)在configuration脚本中硬编码

我目前正在使用autotools来开发一个Linux项目。 代码在SCM(Perforce)中提交,我们有configuration脚本Makefile.am,Makefile.in – 通常的autotools样板。 最近有人改了Makefile.am,但忘了重新生成Makefile.in; 当我试图build立,我得到这个错误:

WARNING: `automake-1.11' is missing on your system. You should only need it if you modified `Makefile.am', `acinclude.m4' or `configure.ac'. You might want to install the `Automake' and `Perl' packages. Grab them from any GNU archive site. cd . && /bin/bash ./config.status Makefile depfiles 

我看到automake版本在configuration脚本中硬编码(似乎来自aclocal.m4):

 am__api_version='1.11' 

所以我想我需要automake-1.11(不是1.10,而不是更新)来重新生成Makefile.in文件。

这是为什么? 为什么我们应该绑定到特定的automake版本? 我们主要build立在Ubuntu 14.04上,其中1.14是安装的默认版本。 有没有办法告诉构build系统只需使用任何版本的automake安装? 或者是否可以从aclocal.m4中删除am__api_version定义?

问题是你正试图用其他版本的自动工具重新创建Makefile.in 。 这会导致版本不匹配,因为aclocal.m4是使用不同版本构建的,并且用于生成其余文件。

不要仅重新创建Makefile.in ,而是尝试重新创建aclocal.m4和所有剩余的自动工具生成的文件:

 autoreconf --force --install 

重要的问题是为什么有人修复am__api_versions 。 最可能的答案是:因为automake倾向于改变宏的参数,甚至删除以前版本的宏。 在automake每个发布公告中都有一个名为

警告:未来的后向不兼容

另一个叫

已删除过时的功能

你可以参考版本1.12,1.13,1.14

因此, configure.acMakefile.am可能包含一些在以后的版本中已经过时的宏。 遇到这个问题时,你有两种可能性。 要么找出哪个功能取代了过时的功能,要么坚持一个版本的automake 。 大多数开发人员不觉得autotools文件是项目源代码的一部分。 他们只是希望保持工作版本运行,并坚持当前的版本。

请注意,所有发行版都支持旧版本的automake 。 在Ubuntu中你可以找到:

 $ apt-cache search automake | grep automake automake - Tool for generating GNU Standards-compliant Makefiles automake1.4 - A tool for generating GNU Standards-compliant Makefiles automake1.9 - A tool for generating GNU Standards-compliant Makefiles automake1.10 - Tool for generating GNU Standards-compliant Makefiles automake1.11 - Tool for generating GNU Standards-compliant Makefiles 

这意味着你可以安装所需的automake版本。

所以,你可以删除am__api_version='1.11'这行,找出哪个宏已经过时了。 那么你将不得不决定你将遵循上述两种解决方案中的哪一种。