diff options
author | Pavel Raiskup <praiskup@redhat.com> | 2013-02-11 13:11:51 +0100 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2013-02-20 22:08:16 +0100 |
commit | c83c133556205402d44e81d492efb0b2fe3e3584 (patch) | |
tree | 904f08698742fc665480a1569f65569a0183a591 | |
parent | 97f04a5d1f5fba976284ae4b4503b92f79a5cbd1 (diff) | |
download | automake-c83c133556205402d44e81d492efb0b2fe3e3584.tar.gz |
aclocal: just warn if the primary local m4 dir doesn't exist (don't error)
Related to automake bug#13514.
Every package which does not need to have the local m4 macro
directory pre-existing in the version control system (because
e.g., it does not have nor need any private m4 macros) would
fail during the "autoreconf -vfi" phase if AC_CONFIG_MACRO_DIRS([m4])
is specified in configure.ac (it could be to instruct tools like
'autopoint' and 'libtoolize' to use 'm4' as the local directory
where to install definitions of their m4 macros, and to instruct
aclocal to look into it). The failure would go like this:
autoreconf: Entering directory `.'
autoreconf: running: aclocal --force
aclocal: error: couldn't open directory 'm4': No such file or directory
autoreconf: aclocal failed with exit status: 1
The problem is that when 'aclocal' is run for the first time during
'autoreconf', the directory 'm4' does not exist yet. It will be
created by e.g., 'libtoolize' or 'autopoint' later on. During the
second 'aclocal' run, the 'm4' directory exists and aclocal does not
complain.
To work around this issue, we degrade the error to a simple warning.
The warning is still quite useful when aclocal is run by hand - so
we are not removing completely.
See also:
<http://lists.gnu.org/archive/html/bug-automake/2013-01/msg00115.html>
<http://lists.gnu.org/archive/html/automake-patches/2010-02/msg00030.html>
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=565663>
<https://bugzilla.redhat.com/show_bug.cgi?id=901333>
* aclocal.in (SCAN_M4_DIRS_SILENT, SCAN_M4_DIRS_WARN)
(SCAN_M4_DIRS_ERROR): New constants.
(scan_m4_dirs): Change the second parameter name to $ERR_LEVEL to
better reflect new semantic. Use new constants.
(scan_m4_files): Adjust to reflect the new 'scan_m4_dirs' semantics.
* t/aclocal-macrodir.tap: Adjust.
* t/aclocal-macrodirs.tap: Likewise.
* THANKS: Update.
* NEWS: Likewise.
Suggested-by: Ben Pfaff <blp@cs.stanford.edu>
Signed-off-by: Stefano Lattarini <stefano.lattarini@gmail.com>
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | THANKS | 1 | ||||
-rw-r--r-- | aclocal.in | 46 | ||||
-rwxr-xr-x | t/aclocal-macrodir.tap | 12 | ||||
-rwxr-xr-x | t/aclocal-macrodirs.tap | 17 |
5 files changed, 69 insertions, 14 deletions
@@ -90,6 +90,13 @@ New in 1.13.2: Automake 1.13, has turned out to be a similarly very bad idea, for exactly the same reason. + - 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.1: @@ -297,6 +297,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 b51c09df7..e65b0ab2d 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 @@ -408,11 +434,15 @@ sub scan_m4_files () { # 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 3c66e530c..a480c4cd4 100755 --- a/t/aclocal-macrodir.tap +++ b/t/aclocal-macrodir.tap @@ -157,16 +157,24 @@ 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 diff --git a/t/aclocal-macrodirs.tap b/t/aclocal-macrodirs.tap index 89e424d46..c0bb0acee 100755 --- a/t/aclocal-macrodirs.tap +++ b/t/aclocal-macrodirs.tap @@ -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]) |