Pavel Raiskup 9e6939
diff --git a/NEWS b/NEWS
Pavel Raiskup 9e6939
index ef594b4..5a23a3b 100644
Pavel Raiskup 9e6939
--- a/NEWS
Pavel Raiskup 9e6939
+++ b/NEWS
Pavel Raiskup 9e6939
@@ -55,6 +55,13 @@ New in 1.13.1:
Pavel Raiskup 9e6939
     causes a clear and helpful error message, instead of obscure ones
Pavel Raiskup 9e6939
     (issue introduced in Automake 1.13).
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
+  - Aclocal no longer error out if the first local m4 directory (as
Pavel Raiskup 9e6939
+    specified by the '-I' option or the 'AC_CONFIG_MACRO_DIRS' or
Pavel Raiskup 9e6939
+    'AC_CONFIG_MACRO_DIR' macros) doesn't exist; it merely report a
Pavel Raiskup 9e6939
+    warning in the 'unsupported' category.  This is done to support
Pavel Raiskup 9e6939
+    some pre-existing real-world usages; refer to automake bug#13514
Pavel Raiskup 9e6939
+    for more details.
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 New in 1.13:
Pavel Raiskup 9e6939
diff --git a/THANKS b/THANKS
Pavel Raiskup 9e6939
index 5fa307d..0c143c4 100644
Pavel Raiskup 9e6939
--- a/THANKS
Pavel Raiskup 9e6939
+++ b/THANKS
Pavel Raiskup 9e6939
@@ -295,6 +295,7 @@ Paul Jarc                       prj@po.cwru.edu
Pavel Raiskup 9e6939
 Paul Lunau                      temp@lunau.me.uk
Pavel Raiskup 9e6939
 Paul Martinolich                martinol@datasync.com
Pavel Raiskup 9e6939
 Paul Thomas                     PTHOMAS@novell.com
Pavel Raiskup 9e6939
+Pavel Raiskup                   praiskup@redhat.com
Pavel Raiskup 9e6939
 Pavel Roskin                    pavel_roskin@geocities.com
Pavel Raiskup 9e6939
 Pavel Sanda                     ps@twin.jikos.cz
Pavel Raiskup 9e6939
 Per Bothner                     bothner@cygnus.com
Pavel Raiskup fedee2
diff --git a/aclocal.in b/aclocal.in
Pavel Raiskup 9e6939
index b51c09d..d68ea33 100644
Pavel Raiskup fedee2
--- a/aclocal.in
Pavel Raiskup fedee2
+++ b/aclocal.in
Pavel Raiskup fedee2
@@ -165,6 +165,11 @@ my @ac_config_macro_dirs;
Pavel Raiskup fedee2
 # If set, names a temporary file that must be erased on abnormal exit.
Pavel Raiskup fedee2
 my $erase_me;
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
+# Constants for the $ERR_LEVEL parameter of the 'scan_m4_dirs' function.
Pavel Raiskup fedee2
+use constant SCAN_M4_DIRS_SILENT => 0;
Pavel Raiskup fedee2
+use constant SCAN_M4_DIRS_WARN => 1;
Pavel Raiskup fedee2
+use constant SCAN_M4_DIRS_ERROR => 2;
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
 ################################################################
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
 # Prototypes for all subroutines.
Pavel Raiskup 9e6939
@@ -355,21 +360,42 @@ sub list_compare (\@\@)
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
 ################################################################
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
-# scan_m4_dirs($TYPE, $ERR_ON_NONEXISTING, @DIRS)
Pavel Raiskup fedee2
+# scan_m4_dirs($TYPE, $ERR_LEVEL, @DIRS)
Pavel Raiskup fedee2
 # -----------------------------------------------
Pavel Raiskup fedee2
 # Scan all M4 files installed in @DIRS for new macro definitions.
Pavel Raiskup fedee2
 # Register each file as of type $TYPE (one of the FT_* constants).
Pavel Raiskup 9e6939
+# If a directory in @DIRS cannot be read:
Pavel Raiskup 9e6939
+#  - fail hard                if $ERR_LEVEL == SCAN_M4_DIRS_ERROR
Pavel Raiskup 9e6939
+#  - just print a warning     if $ERR_LEVEL == SCAN_M4_DIRS_WA
Pavel Raiskup 9e6939
+#  - continue silently        if $ERR_LEVEL == SCAN_M4_DIRS_SILENT
Pavel Raiskup fedee2
 sub scan_m4_dirs ($$@)
Pavel Raiskup fedee2
 {
Pavel Raiskup fedee2
-  my ($type, $err_on_nonexisting, @dirlist) = @_;
Pavel Raiskup fedee2
+  my ($type, $err_level, @dirlist) = @_;
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
   foreach my $m4dir (@dirlist)
Pavel Raiskup fedee2
     {
Pavel Raiskup fedee2
       if (! opendir (DIR, $m4dir))
Pavel Raiskup fedee2
 	{
Pavel Raiskup fedee2
 	  # TODO: maybe avoid complaining only if errno == ENONENT?
Pavel Raiskup fedee2
-	  next unless $err_on_nonexisting;
Pavel Raiskup fedee2
-	  fatal "couldn't open directory '$m4dir': $!";
Pavel Raiskup 9e6939
+          my $message = "couldn't open directory '$m4dir': $!";
Pavel Raiskup fedee2
+
Pavel Raiskup 9e6939
+          if ($err_level == SCAN_M4_DIRS_ERROR)
Pavel Raiskup 9e6939
+            {
Pavel Raiskup 9e6939
+              fatal $message;
Pavel Raiskup 9e6939
+            }
Pavel Raiskup 9e6939
+          elsif ($err_level == SCAN_M4_DIRS_WARN)
Pavel Raiskup 9e6939
+            {
Pavel Raiskup 9e6939
+              msg ('unsupported', $message);
Pavel Raiskup 9e6939
+              next;
Pavel Raiskup 9e6939
+            }
Pavel Raiskup 9e6939
+          elsif ($err_level == SCAN_M4_DIRS_SILENT)
Pavel Raiskup 9e6939
+            {
Pavel Raiskup 9e6939
+              next; # Silently ignore.
Pavel Raiskup 9e6939
+            }
Pavel Raiskup 9e6939
+          else
Pavel Raiskup 9e6939
+            {
Pavel Raiskup 9e6939
+               prog_error "invalid \$err_level value '$err_level'";
Pavel Raiskup 9e6939
+            }
Pavel Raiskup fedee2
 	}
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
       # We reverse the directory contents so that foo2.m4 gets
Pavel Raiskup 9e6939
@@ -406,13 +432,27 @@ sub scan_m4_files ()
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
   if (@user_includes)
Pavel Raiskup fedee2
     {
Pavel Raiskup fedee2
+      # Don't explore the same directory multiple times.  This is here not
Pavel Raiskup fedee2
+      # only for speedup purposes.  We need this when the user has e.g.
Pavel Raiskup fedee2
+      # specified 'ACLOCAL_AMFLAGS = -I m4' and has also set
Pavel Raiskup fedee2
+      # AC_CONFIG_MACRO_DIR[S]([m4]) in configure.ac.  This makes the 'm4'
Pavel Raiskup fedee2
+      # directory to occur twice here and fail on the second call to
Pavel Raiskup fedee2
+      # scan_m4_dirs([m4]) when the 'm4' directory doesn't exist.
Pavel Raiskup fedee2
+      # TODO: Shouldn't there be rather a check in scan_m4_dirs for
Pavel Raiskup fedee2
+      #       @user_includes[0]?
Pavel Raiskup fedee2
+      @user_includes = uniq @user_includes;
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
       # Don't complain if the first user directory doesn't exist, in case
Pavel Raiskup fedee2
       # we need to create it later (can happen if '--install' was given).
Pavel Raiskup fedee2
-      scan_m4_dirs (FT_USER, !$install, $user_includes[0]);
Pavel Raiskup fedee2
-      scan_m4_dirs (FT_USER, 1, @user_includes[1..$#user_includes]);
Pavel Raiskup 9e6939
+      scan_m4_dirs (FT_USER,
Pavel Raiskup 9e6939
+                    $install ? SCAN_M4_DIRS_SILENT : SCAN_M4_DIRS_WARN,
Pavel Raiskup 9e6939
+                    $user_includes[0]);
Pavel Raiskup 9e6939
+      scan_m4_dirs (FT_USER,
Pavel Raiskup 9e6939
+                    SCAN_M4_DIRS_ERROR,
Pavel Raiskup fedee2
+		    @user_includes[1..$#user_includes]);
Pavel Raiskup fedee2
     }
Pavel Raiskup fedee2
-  scan_m4_dirs (FT_AUTOMAKE, 1, @automake_includes);
Pavel Raiskup fedee2
-  scan_m4_dirs (FT_SYSTEM,   1, @system_includes);
Pavel Raiskup fedee2
+  scan_m4_dirs (FT_AUTOMAKE, SCAN_M4_DIRS_ERROR, @automake_includes);
Pavel Raiskup fedee2
+  scan_m4_dirs (FT_SYSTEM, SCAN_M4_DIRS_ERROR, @system_includes);
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
   # Construct a new function that does the searching.  We use a
Pavel Raiskup fedee2
   # function (instead of just evaluating $search in the loop) so that
Pavel Raiskup fedee2
diff --git a/t/aclocal-macrodir.tap b/t/aclocal-macrodir.tap
Pavel Raiskup 9e6939
index 3c66e53..051fdb5 100755
Pavel Raiskup fedee2
--- a/t/aclocal-macrodir.tap
Pavel Raiskup fedee2
+++ b/t/aclocal-macrodir.tap
Pavel Raiskup fedee2
@@ -20,7 +20,7 @@
Pavel Raiskup fedee2
 am_create_testdir=empty
Pavel Raiskup fedee2
 . test-init.sh
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
-plan_ 6
Pavel Raiskup fedee2
+plan_ 7
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
 ocwd=$(pwd) || fatal_ "getting current working directory"
Pavel Raiskup fedee2
 ACLOCAL_PATH=; unset ACLOCAL_PATH
Pavel Raiskup 9e6939
@@ -157,16 +157,44 @@ test_end
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
 #---------------------------------------------------------------------------
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
-test_begin "AC_CONFIG_MACRO_DIR([non-existent]) errors out (1)"
Pavel Raiskup 9e6939
+test_begin "AC_CONFIG_MACRO_DIR([non-existent]) warns with -Wunsupported"
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
 cat > configure.ac << 'END'
Pavel Raiskup 9e6939
 AC_INIT([oops], [1.0])
Pavel Raiskup 9e6939
 AC_CONFIG_MACRO_DIR([non-existent])
Pavel Raiskup 9e6939
+AM_INIT_AUTOMAKE
Pavel Raiskup 9e6939
 END
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
-not $ACLOCAL -Wnone 2>stderr \
Pavel Raiskup 9e6939
+$ACLOCAL -Wno-error 2>stderr \
Pavel Raiskup 9e6939
   && cat stderr >&2 \
Pavel Raiskup 9e6939
   && grep "couldn't open directory 'non-existent'" stderr \
Pavel Raiskup 9e6939
+  && test -f aclocal.m4 \
Pavel Raiskup 9e6939
+  || r='not ok'
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+rm -rf aclocal.m4 autom4te*.cache
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+$ACLOCAL -Werror -Wno-unsupported \
Pavel Raiskup 9e6939
+  && test -f aclocal.m4 \
Pavel Raiskup 9e6939
+  || r='not ok'
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+test_end
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+#---------------------------------------------------------------------------
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+test_begin "AC_CONFIG_MACRO_DIR([not-exist]) and ACLOCAL_AMFLAGS = -I not-exist"
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+cat > configure.ac << 'END'
Pavel Raiskup 9e6939
+AC_INIT([oops], [1.0])
Pavel Raiskup 9e6939
+AC_CONFIG_MACRO_DIR([not-exist])
Pavel Raiskup 9e6939
+END
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+cat > Makefile.am << 'END'
Pavel Raiskup 9e6939
+ACLOCAL_AMFLAGS = -I not-exist
Pavel Raiskup 9e6939
+END
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+$ACLOCAL -Wno-error 2>stderr \
Pavel Raiskup fedee2
+  && cat stderr >&2 \
Pavel Raiskup 9e6939
+  && test $(grep -c "couldn't open directory 'not-exist'" stderr) -eq 1 \
Pavel Raiskup fedee2
   || r='not ok'
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
 test_end
Pavel Raiskup 9e6939
diff --git a/t/aclocal-macrodirs.tap b/t/aclocal-macrodirs.tap
Pavel Raiskup 9e6939
index 89e424d..0deae72 100755
Pavel Raiskup 9e6939
--- a/t/aclocal-macrodirs.tap
Pavel Raiskup 9e6939
+++ b/t/aclocal-macrodirs.tap
Pavel Raiskup 9e6939
@@ -20,7 +20,7 @@
Pavel Raiskup 9e6939
 am_create_testdir=empty
Pavel Raiskup 9e6939
 . test-init.sh
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
-plan_ 14
Pavel Raiskup 9e6939
+plan_ 15
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 ocwd=$(pwd) || fatal_ "getting current working directory"
Pavel Raiskup 9e6939
 ACLOCAL_PATH=; unset ACLOCAL_PATH
Pavel Raiskup 9e6939
@@ -317,23 +317,31 @@ test_end
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
 #---------------------------------------------------------------------------
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
-test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) errors out (1)"
Pavel Raiskup 9e6939
+test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) warns (1)"
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
 cat > configure.ac << 'END'
Pavel Raiskup fedee2
 AC_INIT([oops], [1.0])
Pavel Raiskup 9e6939
 AC_CONFIG_MACRO_DIRS([non-existent])
Pavel Raiskup 9e6939
+AM_INIT_AUTOMAKE
Pavel Raiskup fedee2
 END
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
-not $ACLOCAL 2>stderr \
Pavel Raiskup fedee2
+$ACLOCAL -Wno-error 2>stderr \
Pavel Raiskup fedee2
   && cat stderr >&2 \
Pavel Raiskup fedee2
   && grep "couldn't open directory 'non-existent'" stderr \
Pavel Raiskup 9e6939
+  && test -f aclocal.m4 \
Pavel Raiskup 9e6939
+  || r='not ok'
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+rm -rf aclocal.m4 autom4te*.cache
Pavel Raiskup 9e6939
+
Pavel Raiskup 9e6939
+$ACLOCAL -Werror -Wno-unsupported \
Pavel Raiskup 9e6939
+  && test -f aclocal.m4 \
Pavel Raiskup 9e6939
   || r='not ok'
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 test_end
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 #---------------------------------------------------------------------------
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
-test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) errors out (2)"
Pavel Raiskup 9e6939
+test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) warns (2)"
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 cat > configure.ac << 'END'
Pavel Raiskup 9e6939
 AC_INIT([oops], [1.0])
Pavel Raiskup 9e6939
@@ -346,13 +354,14 @@ not $ACLOCAL 2>stderr \
Pavel Raiskup 9e6939
   && cat stderr >&2 \
Pavel Raiskup 9e6939
   && grep "couldn't open directory 'dir-ko'" stderr \
Pavel Raiskup 9e6939
   && not grep "dir-ok" stderr \
Pavel Raiskup 9e6939
+  && test ! -e aclocal.m4 \
Pavel Raiskup fedee2
   || r='not ok'
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 test_end
Pavel Raiskup fedee2
 
Pavel Raiskup fedee2
 #---------------------------------------------------------------------------
Pavel Raiskup fedee2
 
Pavel Raiskup 9e6939
-test_begin "AC_CONFIG_MACRO_DIRS([non-existent]) errors out (tricky setup)"
Pavel Raiskup 9e6939
+test_begin "AC_CONFIG_MACRO_DIRS([existent non-existent]) errors out"
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 cat > configure.ac << 'END'
Pavel Raiskup 9e6939
 AC_INIT([oops], [1.0])
Pavel Raiskup 9e6939
@@ -372,6 +381,26 @@ test_end
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
 #---------------------------------------------------------------------------
Pavel Raiskup 9e6939
 
Pavel Raiskup 9e6939
+test_begin "AC_CONFIG_MACRO_DIRS([not-exist]) and ACLOCAL_AMFLAGS = -I not-exist"
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
+cat > configure.ac << 'END'
Pavel Raiskup fedee2
+AC_INIT([oops], [1.0])
Pavel Raiskup 9e6939
+AC_CONFIG_MACRO_DIRS([not-exist])
Pavel Raiskup fedee2
+END
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
+cat > Makefile.am << 'END'
Pavel Raiskup fedee2
+ACLOCAL_AMFLAGS = -I not-exist
Pavel Raiskup fedee2
+END
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
+$ACLOCAL -Wno-error 2>stderr \
Pavel Raiskup fedee2
+  && cat stderr >&2 \
Pavel Raiskup 9e6939
+  && test $(grep -c "couldn't open directory 'not-exist'" stderr) -eq 1 \
Pavel Raiskup fedee2
+  || r='not ok'
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
+test_end
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
+#---------------------------------------------------------------------------
Pavel Raiskup fedee2
+
Pavel Raiskup fedee2
 # Avoid spurious failures with pre-2.70 autoconf.
Pavel Raiskup fedee2
 # FIXME: remove this in automake 1.14, once we require Autoconf 2.70.
Pavel Raiskup fedee2
 if echo 'AC_INIT AC_CONFIG_MACRO_DIRS' | $AUTOCONF -o/dev/null -; then