【问题标题】:automake version (am__api_version) hardcoded in configure script配置脚本中硬编码的 automake 版本 (am__api_version)
【发布时间】:2015-06-27 02:58:24
【问题描述】:

我目前正在使用 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 版本在配置脚本中是硬编码的(并且似乎来自 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 定义是否安全?

【问题讨论】:

  • 我将“通常的 autotools 样板”定义为 configure.acMakefile.am。这两个文件的目的是生成configure 脚本、Makefile.inMakefile 以及支持构建的各种其他工件。生成的文件不需要(实际上不应该)添加到任何源代码管理中。

标签: linux makefile autotools automake


【解决方案1】:

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

不要只重新创建 Makefile.in,而是尝试重新创建 aclocal.m4 和所有剩余的 autotools 生成的文件:

autoreconf --force --install   

【讨论】:

  • 所以我想选择是: - 不要在 Perforce 中存储任何生成的文件并始终运行 'autoreconf -fvi' - 将 aclocal.m4、configure、Makefile.in 存储在 Perforce 中,然后每当您修改任何输入文件时,您都需要生成它们的确切 automake 版本吗?当然,总有选项 3 - 抛弃 autotools :)。
  • 您的问题是:“有人更改了 Makefile.am,但忘记重新生成 Makefile.in”。否则一切都应该按设计工作:)
  • @fencekicker 如果你存放的是同版本的autotools生成的aclocal.m4、configure、Makefile.in你就不用关心automake版本了
  • 我最终做的是从 Perforce 中删除所有自动工具生成的文件,并添加了一个重新生成它们的构建步骤。这似乎是最明智的做法,至少对我们来说是这样。然后在本地你可以生成一次并完成它。每晚构建总是会重新生成所有内容,因此无需再担心保持 Makefile.in、Makefile.am 以及不同步的内容。
【解决方案2】:

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

警告:未来的向后不兼容!

还有一个叫

已删除过时的功能

您可以参考发布1.121.131.14

因此configure.acMakefile.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' 并找出哪个宏已过时。然后你必须决定你将遵循上述两种解决方案中的哪一种。

【讨论】:

  • 固定版本的 sn-p 由 automake 自己生成 - 它生成的文件只能部分重新生成(例如重新生成 Makefile.in 但不能重新生成 aclocal.m4 等)本身。至少这是我的理解。我可以修改配置,但如果它会被重新生成,它将被覆盖。
  • @fencekicker 对我的误解深表歉意。在问题中暗示am 版本已由用户修复。
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
相关资源
最近更新 更多