Subject: bug#15981: closed ([PATCH] init: ensure $ac_aux_dir is defined before being used)

From: [email-masked] (GNU bug Tracking System)
Date: Tue, 22 Apr 2014 10:59:03 +0000

Your bug report

#15981: regression: 1.14 may use ac_aux_dir before it is defined

which was filed against the automake package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
15981: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=15981
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: [PATCH] init: ensure $ac_aux_dir is defined before being used
From: Stefano Lattarini <[email-masked]>
To: [email-masked]
Cc: [email-masked], [email-masked]
Date: Tue, 22 Apr 2014 11:57:47 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Since we use $ac_aux_dir to define $am_aux_dir, we need to ensure
the former has been initialized before we try to define the latter,
otherwise the definition:

   am_aux_dir=`cd $ac_aux_dir && pwd`

will set $am_aux_dir to $HOME, causing weird and unexpected
behaviours.

This change fixes automake bug#15981.

* m4/auxdir.m4: AC_REQUIRE expansion of 'AC_CONFIG_AUX_DIR_DEFAULT'.
Fix redundant comment and AC_PREREQ, add extra quoting around
'$ac_aux_dir'.
* t/auxdir-pr15981.sh: New test.
* t/auxdir-cc-pr15981.sh: Likewise.
* t/list-of-tests.mk (handwritten_TESTS): Add them.
* THANKS: Update.
* bin/automake.in: Fix a harmless typo in comments, that I happened
to notice while writing this patch.

Signed-off-by: Stefano Lattarini <[email-masked]>
---
 THANKS                 |  1 +
 bin/automake.in        |  2 +-
 m4/auxdir.m4           |  7 +++----
 t/auxdir-cc-pr15981.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++
 t/auxdir-pr15981.sh    | 39 ++++++++++++++++++++++++++++++++++
 t/list-of-tests.mk     |  2 ++
 6 files changed, 103 insertions(+), 5 deletions(-)
 create mode 100644 t/auxdir-cc-pr15981.sh
 create mode 100644 t/auxdir-pr15981.sh

diff --git a/THANKS b/THANKS
index 550b565..eef67c3 100644
--- a/THANKS
+++ b/THANKS
@@ -317,6 +317,7 @@ Per Oyvind Hvidsten             [email-masked]
 Peter Breitenlohner             [email-masked]
 Peter Eisentraut                [email-masked]
 Peter Gavin                     [email-masked]
+Peter Hutterer                  [email-masked]
 Peter Johansson                 [email-masked]
 Peter Mattis                    [email-masked]
 Peter Muir                      [email-masked]
diff --git a/bin/automake.in b/bin/automake.in
index 996a9de..f9cc611 100644
--- a/bin/automake.in
+++ b/bin/automake.in
@@ -313,7 +313,7 @@ my $seen_ar = 0;
 # Location of AC_REQUIRE_AUX_FILE calls, indexed by their argument.
 my %required_aux_file = ();
 
-# Where AM_INIT_AUTOMAKE is called;
+# Where AM_INIT_AUTOMAKE is called.
 my $seen_init_automake = 0;
 
 # TRUE if we've seen AM_AUTOMAKE_VERSION.
diff --git a/m4/auxdir.m4 b/m4/auxdir.m4
index 1f8614d..93fc225 100644
--- a/m4/auxdir.m4
+++ b/m4/auxdir.m4
@@ -45,8 +45,7 @@
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
diff --git a/t/auxdir-cc-pr15981.sh b/t/auxdir-cc-pr15981.sh
new file mode 100644
index 0000000..74157cb
--- /dev/null
+++ b/t/auxdir-cc-pr15981.sh
@@ -0,0 +1,57 @@
+#! /bin/sh
+# Copyright (C) 2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Test automake bug#15981: automake 1.14 may use $ac_aux_dir
+# before it is defined, leading to error messages such as:
+# "/bin/sh: /home/david/missing: No such file or directory"
+
+required=cc
+. test-init.sh
+
+cat > configure.ac <<END
+AC_INIT([$me], [0.0])
+AC_USE_SYSTEM_EXTENSIONS
+AM_INIT_AUTOMAKE([1.11 foreign])
+AC_CONFIG_FILES([Makefile])
+AC_SUBST([MISSING])
+AC_OUTPUT
+test -n "\${MISSING}"
+END
+
+echo 'int main (void) { return 0; }' > foo.c
+
+cat > Makefile.am <<'END'
+bin_PROGRAMS = foo
+
+# Without quotes around '--help' and with an empty $(MISSING), make might
+# strip the trailing '--', call Bash's 'help' builtin, and have this test
+# succeed spuriously.  Yes, that has happened in practice :-(
+test:
+	$(MISSING) '--help'
+END
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+
+./configure 2>stderr || { cat stderr >&2; exit 1; }
+cat stderr >&2
+$FGREP "missing" stderr && exit 1
+
+$MAKE all
+$MAKE test
+
+:
diff --git a/t/auxdir-pr15981.sh b/t/auxdir-pr15981.sh
new file mode 100644
index 0000000..f09d551
--- /dev/null
+++ b/t/auxdir-pr15981.sh
@@ -0,0 +1,39 @@
+#! /bin/sh
+# Copyright (C) 2014 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# AM_AUX_DIR_EXPAND should ensure $ac_aux_dir is properly initialized.
+# Issue revealed by related automake bug#15981.
+
+. test-init.sh
+
+cat > configure.ac <<'END'
+AC_INIT([test], [0.0])
+AM_AUX_DIR_EXPAND
+printf '%s\n' "ac_aux_dir: '$ac_aux_dir'"
+printf '%s\n' "am_aux_dir: '$am_aux_dir'"
+test "$ac_aux_dir" = . || AS_EXIT([1])
+test "$am_aux_dir" = "`pwd`" || AS_EXIT([1])
+AS_EXIT([0])
+END
+
+$ACLOCAL
+$AUTOCONF
+
+test -f install-sh  # sanity check
+
+./configure
+
+:
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index 6b2eebe..e6ee856 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -116,6 +116,8 @@ t/aclocal-scan-configure-ac-pr319.sh \
 t/aclocal-serial.sh \
 t/aclocal-underquoted-defun.sh \
 t/aclocal-verbose-install.sh \
+t/auxdir-pr15981.sh \
+t/auxdir-cc-pr15981.sh \
 t/ac-output-old.tap \
 t/acsilent.sh \
 t/acsubst.sh \
-- 
1.9.1

Subject: regression: 1.14 may use ac_aux_dir before it is defined
From: Peter Hutterer <[email-masked]>
To: [email-masked]
Cc: David Herrmann <[email-masked]>
Date: Wed, 27 Nov 2013 10:43:42 +1000
List-Id: <debbugs-submit.debbugs.gnu.org>

automake 1.14 may use $ac_aux_dir before it is defined, leading to error
messages such as 

   /bin/sh: /home/david/missing: No such file or directory

The configure script runs this:

    # expand $ac_aux_dir to an absolute path
    am_aux_dir=`cd $ac_aux_dir && pwd`

before the definition of ac_aux_dir, so $am_aux_dir is always $HOME, which
causes the above error later.

Turns out the culprit is, at least in our case, AC_SYSTEM_EXTENSIONS. Simple
reproducer:

    AC_PREREQ([2.62])
    AC_INIT([test], [0.0])
    AC_USE_SYSTEM_EXTENSIONS
    AM_INIT_AUTOMAKE([1.11 foreign])

    AC_CONFIG_FILES([Makefile])
    AC_OUTPUT

With automake 1.13.4 this works, 1.14 breaks. Moving the call to
AC_USE_SYSTEM_EXTENSIONS below AM_INIT_AUTOMAKE makes it work again. It gets
a bit convoluted to find the direct cause but I suspect it's the AC_PROG_CC
changes in 34001a987a6de, and it looks like AC_USE_SYSTEM_EXTENSIONS calls
that after a few levels of nesting (where I got lost, sorry). In case it
matters, above testcase tested with autoconf from git (v2.69-112-gf181785).

Bisect range:
    good: 1.13.4
    bad: b7bdb2c3f2fb66a2384123670fb47b83d30c4bf9
Bisected to:
    commit 34001a987a6defdb70f6f3c17cce9d9c665fe6e8
    "compile: use 'compile' script when "-c -o" is used with losing compilers"

Cheers,
   Peter