为什么 "make distcheck" 在这个非常基本的 "Hello, World!" 自动工具示例中失败?

Why does "make distcheck" fail on this very basic "Hello, World!" autotools example?

当 运行 "make distcheck" 对于下面描述的小 "Hello, World!" 示例时,我收到错误消息

ERROR: files left in build directory after distclean:
./install-sh
./depcomp
./missing

为什么会生成这些错误消息?为什么自动工具不会删除这些文件?

我在 GNU/Linux (Fedora) 3.18.5-101.fc20.x86_64.

上使用 GNU autoconf 2.69 和 GNU automake 1.13.4

编辑 2015-02-17: 对于 https://www.gnu.org/software/automake/manual/automake.html#Creating-amhello 中描述的 am-hello 示例,我也得到了相同的行为。该描述意味着不应生成错误消息。

configure.ac 包含:

AC_PREREQ([2.69])
AC_INIT([hello], [1.0], [bugs@my.domain])
AC_CONFIG_SRCDIR([src/hello.cc])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE
AC_PROG_CXX
AC_CONFIG_FILES([Makefile
                 src/Makefile])
AC_OUTPUT

Makefile.am 包含:

SUBDIRS = src

src/Makefile.am 包含:

bin_PROGRAMS = hello
hello_SOURCES = hello.cc

src/hello.cc 包含:

#include <iostream>             // for cout

int main(int argc, char* argv[])
{
  std::cout << "Hello, World!" << std::endl;
  return 0;
}

文件 NEWS、README、AUTHORS 和 ChangeLog 存在但为空。

执行"autoreconf --install"生成"configure"脚本。然后执行“./configure”生成Makefiles。然后执行 "make distcheck" 以查看包是否已准备好分发。我收到错误消息

ERROR: files left in build directory after distclean:
./install-sh
./depcomp
./missing

如果我再次按 运行 "autoreconf" 和 "make distcheck" 跟进,则不会生成任何错误消息。

编辑 2015-02-21:我无法再在我第一次注意到它的系统上重现该问题。自从我注意到问题后,我接受了一些软件包更新,但没有包含对 automake 或 autoconf 的更新。系统现在在3.18.7-100.fc20.x86_64。我仍然可以在另一个系统上重现该问题,这是第一个系统的克隆,但没有最新的软件包更新。那个目前在 3.18.6-100.fc20.x86_64。上述文件的 MD5 校验和在两个系统上是相同的。我在两个系统上 运行 "autoreconf --install -v -d > autoreconf.log 2>&1" 并比较了生成的 autoreconf.log 文件。有差异,但它们对我来说没有任何意义。在这两种情况下,autoconf (2.69)、autoheader (2.69)、automake (1.13.4)、aclocal (1.13.4)、autopoint (0.18.3) 和 libtoolize (2.4.2) 报告的版本号相同。我确实注意到早些时候在原始系统上(当问题在那里仍然可以重现时)"depcomp"、"install-sh" 和 "missing" 文件随后被写入 parent 包主目录的目录,就好像 AC_CONFIG_AUX_DIR([..]) 包含在 configure.ac 中一样——但事实并非如此。解决方法是将 AC_CONFIG_AUX_DIR([auxiliary]) 添加到 configure.ac(也许 AC_CONFIG_AUX_DIR([.]) 也可以)。

我推荐 运行 autoreconf -ivf。我总是在每个项目中使用以下内容创建 autogen.sh 脚本。

#!/bin/sh

autoreconf -ivf