我目前正在使用autotools开发Linux项目。代码在SCM(Perforce)中提交,我们有配置脚本Makefile.am,Makefile.in - 通常的autotools样板。最近,有人改变了Makefile.am,但忘了重新生成Makefile.in;当我尝试构建时,我收到了这个错误:
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版本在configure脚本中是硬编码的(似乎来自aclocal.m4):
am__api_version='1.11'
所以我想我需要使用automake-1.11(不是1.10,而不是更新的东西)来重新生成Makefile.in文件。
为什么?我们为什么要绑定特定的automake版本?我们主要建立在Ubuntu 14.04上,其中1.14是安装的默认版本。有没有办法告诉构建系统简单地使用任何版本的automake?或者从aclocal.m4中删除am__api_version定义是否安全?
答案 0 :(得分:1)
问题是您正在尝试使用其他版本的autotools重新创建Makefile.in
。这会导致版本不匹配,因为aclocal.m4
是使用不同的版本构建的,它用于生成剩余的文件。
不是仅重新创建Makefile.in
,而是尝试重新创建aclocal.m4
以及所有剩余的autotools生成的文件:
autoreconf --force --install
答案 1 :(得分:0)
重要的问题是为什么有人会修复am__api_versions
。
最可能的答案是:因为automake
倾向于改变宏的参数,甚至删除以前版本的完全宏。在automake
的每个发布公告中,都有一个名为
警告:未来的后向兼容性!
和另一个名为
的人已删除过时功能
因此configure.ac
或Makefile.am
可能包含一些在以后的版本中已经过时的宏。遇到这个问题时,你有两种可能性。要么找出哪个功能替换了过时的功能,要么坚持使用automake
的一个版本。大多数开发人员不认为autotools
文件是项目源代码的一部分。他们只希望保持工作版本的运行并坚持使用当前的am
版本。
请注意,所有发行版都支持旧版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'
并找出哪个宏已过时。然后,您将必须决定您将遵循以上两种解决方案中的哪一种。