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