| #!/usr/bin/perl -w |
| # -*- perl -*- |
| # Generated from bin/aclocal.in; do not edit by hand. |
| |
| eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac' |
| if 0; |
| |
| # aclocal - create aclocal.m4 by scanning configure.ac |
| |
| # Copyright (C) 1996-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/>. |
| |
| # Written by Tom Tromey <tromey@redhat.com>, and |
| # Alexandre Duret-Lutz <adl@gnu.org>. |
| |
| BEGIN |
| { |
| @Aclocal::perl_libdirs = ('/usr/local/google/home/pgynther/clients/buildroot/output/host/usr/share/automake-1.15') |
| unless @Aclocal::perl_libdirs; |
| unshift @INC, @Aclocal::perl_libdirs; |
| } |
| |
| use strict; |
| |
| use Automake::Config; |
| use Automake::General; |
| use Automake::Configure_ac; |
| use Automake::Channels; |
| use Automake::ChannelDefs; |
| use Automake::XFile; |
| use Automake::FileUtils; |
| use File::Basename; |
| use File::Path (); |
| |
| # Some globals. |
| |
| # Support AC_CONFIG_MACRO_DIRS also with older autoconf. |
| # FIXME: To be removed in Automake 2.0, once we can assume autoconf |
| # 2.70 or later. |
| # FIXME: keep in sync with 'internal/ac-config-macro-dirs.m4'. |
| my $ac_config_macro_dirs_fallback = |
| 'm4_ifndef([AC_CONFIG_MACRO_DIRS], [' . |
| 'm4_defun([_AM_CONFIG_MACRO_DIRS], [])' . |
| 'm4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])' . |
| '])'; |
| |
| # We do not operate in threaded mode. |
| $perl_threads = 0; |
| |
| # Include paths for searching macros. We search macros in this order: |
| # user-supplied directories first, then the directory containing the |
| # automake macros, and finally the system-wide directories for |
| # third-party macros. |
| # @user_includes can be augmented with -I or AC_CONFIG_MACRO_DIRS. |
| # @automake_includes can be reset with the '--automake-acdir' option. |
| # @system_includes can be augmented with the 'dirlist' file or the |
| # ACLOCAL_PATH environment variable, and reset with the '--system-acdir' |
| # option. |
| my @user_includes = (); |
| my @automake_includes = ("/usr/local/google/home/pgynther/clients/buildroot/output/host/usr/share/aclocal-$APIVERSION"); |
| my @system_includes = ('/usr/local/google/home/pgynther/clients/buildroot/output/host/usr/share/aclocal'); |
| |
| # Whether we should copy M4 file in $user_includes[0]. |
| my $install = 0; |
| |
| # --diff |
| my @diff_command; |
| |
| # --dry-run |
| my $dry_run = 0; |
| |
| # configure.ac or configure.in. |
| my $configure_ac; |
| |
| # Output file name. |
| my $output_file = 'aclocal.m4'; |
| |
| # Option --force. |
| my $force_output = 0; |
| |
| # Modification time of the youngest dependency. |
| my $greatest_mtime = 0; |
| |
| # Which macros have been seen. |
| my %macro_seen = (); |
| |
| # Remember the order into which we scanned the files. |
| # It's important to output the contents of aclocal.m4 in the opposite order. |
| # (Definitions in first files we have scanned should override those from |
| # later files. So they must appear last in the output.) |
| my @file_order = (); |
| |
| # Map macro names to file names. |
| my %map = (); |
| |
| # Ditto, but records the last definition of each macro as returned by --trace. |
| my %map_traced_defs = (); |
| |
| # Map basenames to macro names. |
| my %invmap = (); |
| |
| # Map file names to file contents. |
| my %file_contents = (); |
| |
| # Map file names to file types. |
| my %file_type = (); |
| use constant FT_USER => 1; |
| use constant FT_AUTOMAKE => 2; |
| use constant FT_SYSTEM => 3; |
| |
| # Map file names to included files (transitively closed). |
| my %file_includes = (); |
| |
| # Files which have already been added. |
| my %file_added = (); |
| |
| # Files that have already been scanned. |
| my %scanned_configure_dep = (); |
| |
| # Serial numbers, for files that have one. |
| # The key is the basename of the file, |
| # the value is the serial number represented as a list. |
| my %serial = (); |
| |
| # Matches a macro definition. |
| # AC_DEFUN([macroname], ...) |
| # or |
| # AC_DEFUN(macroname, ...) |
| # When macroname is '['-quoted , we accept any character in the name, |
| # except ']'. Otherwise macroname stops on the first ']', ',', ')', |
| # or '\n' encountered. |
| my $ac_defun_rx = |
| "(?:AU_ALIAS|A[CU]_DEFUN|AC_DEFUN_ONCE)\\((?:\\[([^]]+)\\]|([^],)\n]+))"; |
| |
| # Matches an AC_REQUIRE line. |
| my $ac_require_rx = "AC_REQUIRE\\((?:\\[([^]]+)\\]|([^],)\n]+))\\)"; |
| |
| # Matches an m4_include line. |
| my $m4_include_rx = "(m4_|m4_s|s)include\\((?:\\[([^]]+)\\]|([^],)\n]+))\\)"; |
| |
| # Match a serial number. |
| my $serial_line_rx = '^#\s*serial\s+(\S*)'; |
| my $serial_number_rx = '^\d+(?:\.\d+)*$'; |
| |
| # Autoconf version. This variable is set by 'trace_used_macros'. |
| my $ac_version; |
| |
| # User directory containing extra m4 files for macros definition, |
| # as extracted from calls to the macro AC_CONFIG_MACRO_DIRS. |
| # This variable is updated by 'trace_used_macros'. |
| 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. |
| |
| # BEGIN AUTOMATICALLY GENERATED PROTOTYPES |
| sub add_file ($); |
| sub add_macro ($); |
| sub check_acinclude (); |
| sub install_file ($$); |
| sub list_compare (\@\@); |
| sub parse_ACLOCAL_PATH (); |
| sub parse_arguments (); |
| sub reset_maps (); |
| sub scan_configure (); |
| sub scan_configure_dep ($); |
| sub scan_file ($$$); |
| sub scan_m4_dirs ($$@); |
| sub scan_m4_files (); |
| sub strip_redundant_includes (%); |
| sub trace_used_macros (); |
| sub unlink_tmp (;$); |
| sub usage ($); |
| sub version (); |
| sub write_aclocal ($@); |
| sub xmkdir_p ($); |
| # END AUTOMATICALLY GENERATED PROTOTYPES |
| |
| ################################################################ |
| |
| # Erase temporary file ERASE_ME. Handle signals. |
| sub unlink_tmp (;$) |
| { |
| my ($sig) = @_; |
| |
| if ($sig) |
| { |
| verb "caught SIG$sig, bailing out"; |
| } |
| if (defined $erase_me && -e $erase_me && !unlink ($erase_me)) |
| { |
| fatal "could not remove '$erase_me': $!"; |
| } |
| undef $erase_me; |
| |
| # reraise default handler. |
| if ($sig) |
| { |
| $SIG{$sig} = 'DEFAULT'; |
| kill $sig => $$; |
| } |
| } |
| |
| $SIG{'INT'} = $SIG{'TERM'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'unlink_tmp'; |
| END { unlink_tmp } |
| |
| sub xmkdir_p ($) |
| { |
| my $dir = shift; |
| local $@ = undef; |
| return |
| if -d $dir or eval { File::Path::mkpath $dir }; |
| chomp $@; |
| $@ =~ s/\s+at\s.*\bline\s\d+.*$//; |
| fatal "could not create directory '$dir': $@"; |
| } |
| |
| # Check macros in acinclude.m4. If one is not used, warn. |
| sub check_acinclude () |
| { |
| foreach my $key (keys %map) |
| { |
| # FIXME: should print line number of acinclude.m4. |
| msg ('syntax', "macro '$key' defined in acinclude.m4 but never used") |
| if $map{$key} eq 'acinclude.m4' && ! exists $macro_seen{$key}; |
| } |
| } |
| |
| sub reset_maps () |
| { |
| $greatest_mtime = 0; |
| %macro_seen = (); |
| @file_order = (); |
| %map = (); |
| %map_traced_defs = (); |
| %file_contents = (); |
| %file_type = (); |
| %file_includes = (); |
| %file_added = (); |
| %scanned_configure_dep = (); |
| %invmap = (); |
| %serial = (); |
| undef &search; |
| } |
| |
| # install_file ($SRC, $DESTDIR) |
| sub install_file ($$) |
| { |
| my ($src, $destdir) = @_; |
| my $dest = $destdir . "/" . basename ($src); |
| my $diff_dest; |
| |
| verb "installing $src to $dest"; |
| |
| if ($force_output |
| || !exists $file_contents{$dest} |
| || $file_contents{$src} ne $file_contents{$dest}) |
| { |
| if (-e $dest) |
| { |
| msg 'note', "overwriting '$dest' with '$src'"; |
| $diff_dest = $dest; |
| } |
| else |
| { |
| msg 'note', "installing '$dest' from '$src'"; |
| } |
| |
| if (@diff_command) |
| { |
| if (! defined $diff_dest) |
| { |
| # $dest does not exist. We create an empty one just to |
| # run diff, and we erase it afterward. Using the real |
| # the destination file (rather than a temporary file) is |
| # good when diff is run with options that display the |
| # file name. |
| # |
| # If creating $dest fails, fall back to /dev/null. At |
| # least one diff implementation (Tru64's) cannot deal |
| # with /dev/null. However working around this is not |
| # worth the trouble since nobody run aclocal on a |
| # read-only tree anyway. |
| $erase_me = $dest; |
| my $f = new IO::File "> $dest"; |
| if (! defined $f) |
| { |
| undef $erase_me; |
| $diff_dest = '/dev/null'; |
| } |
| else |
| { |
| $diff_dest = $dest; |
| $f->close; |
| } |
| } |
| my @cmd = (@diff_command, $diff_dest, $src); |
| $! = 0; |
| verb "running: @cmd"; |
| my $res = system (@cmd); |
| Automake::FileUtils::handle_exec_errors "@cmd", 1 |
| if $res; |
| unlink_tmp; |
| } |
| elsif (!$dry_run) |
| { |
| xmkdir_p ($destdir); |
| xsystem ('cp', $src, $dest); |
| } |
| } |
| } |
| |
| # Compare two lists of numbers. |
| sub list_compare (\@\@) |
| { |
| my @l = @{$_[0]}; |
| my @r = @{$_[1]}; |
| while (1) |
| { |
| if (0 == @l) |
| { |
| return (0 == @r) ? 0 : -1; |
| } |
| elsif (0 == @r) |
| { |
| return 1; |
| } |
| elsif ($l[0] < $r[0]) |
| { |
| return -1; |
| } |
| elsif ($l[0] > $r[0]) |
| { |
| return 1; |
| } |
| shift @l; |
| shift @r; |
| } |
| } |
| |
| ################################################################ |
| |
| # 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_level, @dirlist) = @_; |
| |
| foreach my $m4dir (@dirlist) |
| { |
| if (! opendir (DIR, $m4dir)) |
| { |
| # TODO: maybe avoid complaining only if errno == ENONENT? |
| 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 |
| # used in preference to foo1.m4. |
| foreach my $file (reverse sort grep (! /^\./, readdir (DIR))) |
| { |
| # Only examine .m4 files. |
| next unless $file =~ /\.m4$/; |
| |
| # Skip some files when running out of srcdir. |
| next if $file eq 'aclocal.m4'; |
| |
| my $fullfile = File::Spec->canonpath ("$m4dir/$file"); |
| scan_file ($type, $fullfile, 'aclocal'); |
| } |
| closedir (DIR); |
| } |
| } |
| |
| # Scan all the installed m4 files and construct a map. |
| sub scan_m4_files () |
| { |
| # First, scan configure.ac. It may contain macro definitions, |
| # or may include other files that define macros. |
| scan_file (FT_USER, $configure_ac, 'aclocal'); |
| |
| # Then, scan acinclude.m4 if it exists. |
| if (-f 'acinclude.m4') |
| { |
| scan_file (FT_USER, 'acinclude.m4', 'aclocal'); |
| } |
| |
| # Finally, scan all files in our search paths. |
| |
| 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 ? 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, 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 |
| # "die" is correctly and easily propagated if run. |
| my $search = "sub search {\nmy \$found = 0;\n"; |
| foreach my $key (reverse sort keys %map) |
| { |
| $search .= ('if (/\b\Q' . $key . '\E(?!\w)/) { add_macro ("' . $key |
| . '"); $found = 1; }' . "\n"); |
| } |
| $search .= "return \$found;\n};\n"; |
| eval $search; |
| prog_error "$@\n search is $search" if $@; |
| } |
| |
| ################################################################ |
| |
| # Add a macro to the output. |
| sub add_macro ($) |
| { |
| my ($macro) = @_; |
| |
| # Ignore unknown required macros. Either they are not really |
| # needed (e.g., a conditional AC_REQUIRE), in which case aclocal |
| # should be quiet, or they are needed and Autoconf itself will |
| # complain when we trace for macro usage later. |
| return unless defined $map{$macro}; |
| |
| verb "saw macro $macro"; |
| $macro_seen{$macro} = 1; |
| add_file ($map{$macro}); |
| } |
| |
| # scan_configure_dep ($file) |
| # -------------------------- |
| # Scan a configure dependency (configure.ac, or separate m4 files) |
| # for uses of known macros and AC_REQUIREs of possibly unknown macros. |
| # Recursively scan m4_included files. |
| sub scan_configure_dep ($) |
| { |
| my ($file) = @_; |
| # Do not scan a file twice. |
| return () |
| if exists $scanned_configure_dep{$file}; |
| $scanned_configure_dep{$file} = 1; |
| |
| my $mtime = mtime $file; |
| $greatest_mtime = $mtime if $greatest_mtime < $mtime; |
| |
| my $contents = exists $file_contents{$file} ? |
| $file_contents{$file} : contents $file; |
| |
| my $line = 0; |
| my @rlist = (); |
| my @ilist = (); |
| foreach (split ("\n", $contents)) |
| { |
| ++$line; |
| # Remove comments from current line. |
| s/\bdnl\b.*$//; |
| s/\#.*$//; |
| # Avoid running all the following regexes on white lines. |
| next if /^\s*$/; |
| |
| while (/$m4_include_rx/go) |
| { |
| my $ifile = $2 || $3; |
| # Skip missing 'sinclude'd files. |
| next if $1 ne 'm4_' && ! -f $ifile; |
| push @ilist, $ifile; |
| } |
| |
| while (/$ac_require_rx/go) |
| { |
| push (@rlist, $1 || $2); |
| } |
| |
| # The search function is constructed dynamically by |
| # scan_m4_files. The last parenthetical match makes sure we |
| # don't match things that look like macro assignments or |
| # AC_SUBSTs. |
| if (! &search && /(^|\s+)(AM_[A-Z0-9_]+)($|[^\]\)=A-Z0-9_])/) |
| { |
| # Macro not found, but AM_ prefix found. |
| # Make this just a warning, because we do not know whether |
| # the macro is actually used (it could be called conditionally). |
| msg ('unsupported', "$file:$line", |
| "macro '$2' not found in library"); |
| } |
| } |
| |
| add_macro ($_) foreach (@rlist); |
| scan_configure_dep ($_) foreach @ilist; |
| } |
| |
| # add_file ($FILE) |
| # ---------------- |
| # Add $FILE to output. |
| sub add_file ($) |
| { |
| my ($file) = @_; |
| |
| # Only add a file once. |
| return if ($file_added{$file}); |
| $file_added{$file} = 1; |
| |
| scan_configure_dep $file; |
| } |
| |
| # Point to the documentation for underquoted AC_DEFUN only once. |
| my $underquoted_manual_once = 0; |
| |
| # scan_file ($TYPE, $FILE, $WHERE) |
| # -------------------------------- |
| # Scan a single M4 file ($FILE), and all files it includes. |
| # Return the list of included files. |
| # $TYPE is one of FT_USER, FT_AUTOMAKE, or FT_SYSTEM, depending |
| # on where the file comes from. |
| # $WHERE is the location to use in the diagnostic if the file |
| # does not exist. |
| sub scan_file ($$$) |
| { |
| my ($type, $file, $where) = @_; |
| my $basename = basename $file; |
| |
| # Do not scan the same file twice. |
| return @{$file_includes{$file}} if exists $file_includes{$file}; |
| # Prevent potential infinite recursion (if two files include each other). |
| return () if exists $file_contents{$file}; |
| |
| unshift @file_order, $file; |
| |
| $file_type{$file} = $type; |
| |
| fatal "$where: file '$file' does not exist" if ! -e $file; |
| |
| my $fh = new Automake::XFile $file; |
| my $contents = ''; |
| my @inc_files = (); |
| my %inc_lines = (); |
| |
| my $defun_seen = 0; |
| my $serial_seen = 0; |
| my $serial_older = 0; |
| |
| while ($_ = $fh->getline) |
| { |
| # Ignore '##' lines. |
| next if /^##/; |
| |
| $contents .= $_; |
| my $line = $_; |
| |
| if ($line =~ /$serial_line_rx/go) |
| { |
| my $number = $1; |
| if ($number !~ /$serial_number_rx/go) |
| { |
| msg ('syntax', "$file:$.", |
| "ill-formed serial number '$number', " |
| . "expecting a version string with only digits and dots"); |
| } |
| elsif ($defun_seen) |
| { |
| # aclocal removes all definitions from M4 file with the |
| # same basename if a greater serial number is found. |
| # Encountering a serial after some macros will undefine |
| # these macros... |
| msg ('syntax', "$file:$.", |
| 'the serial number must appear before any macro definition'); |
| } |
| # We really care about serials only for non-automake macros |
| # and when --install is used. But the above diagnostics are |
| # made regardless of this, because not using --install is |
| # not a reason not the fix macro files. |
| elsif ($install && $type != FT_AUTOMAKE) |
| { |
| $serial_seen = 1; |
| my @new = split (/\./, $number); |
| |
| verb "$file:$.: serial $number"; |
| |
| if (!exists $serial{$basename} |
| || list_compare (@new, @{$serial{$basename}}) > 0) |
| { |
| # Delete any definition we knew from the old macro. |
| foreach my $def (@{$invmap{$basename}}) |
| { |
| verb "$file:$.: ignoring previous definition of $def"; |
| delete $map{$def}; |
| } |
| $invmap{$basename} = []; |
| $serial{$basename} = \@new; |
| } |
| else |
| { |
| $serial_older = 1; |
| } |
| } |
| } |
| |
| # Remove comments from current line. |
| # Do not do it earlier, because the serial line is a comment. |
| $line =~ s/\bdnl\b.*$//; |
| $line =~ s/\#.*$//; |
| |
| while ($line =~ /$ac_defun_rx/go) |
| { |
| $defun_seen = 1; |
| if (! defined $1) |
| { |
| msg ('syntax', "$file:$.", "underquoted definition of $2" |
| . "\n run info Automake 'Extending aclocal'\n" |
| . " or see http://www.gnu.org/software/automake/manual/" |
| . "automake.html#Extending-aclocal") |
| unless $underquoted_manual_once; |
| $underquoted_manual_once = 1; |
| } |
| |
| # If this macro does not have a serial and we have already |
| # seen a macro with the same basename earlier, we should |
| # ignore the macro (don't exit immediately so we can still |
| # diagnose later #serial numbers and underquoted macros). |
| $serial_older ||= ($type != FT_AUTOMAKE |
| && !$serial_seen && exists $serial{$basename}); |
| |
| my $macro = $1 || $2; |
| if (!$serial_older && !defined $map{$macro}) |
| { |
| verb "found macro $macro in $file: $."; |
| $map{$macro} = $file; |
| push @{$invmap{$basename}}, $macro; |
| } |
| else |
| { |
| # Note: we used to give an error here if we saw a |
| # duplicated macro. However, this turns out to be |
| # extremely unpopular. It causes actual problems which |
| # are hard to work around, especially when you must |
| # mix-and-match tool versions. |
| verb "ignoring macro $macro in $file: $."; |
| } |
| } |
| |
| while ($line =~ /$m4_include_rx/go) |
| { |
| my $ifile = $2 || $3; |
| # Skip missing 'sinclude'd files. |
| next if $1 ne 'm4_' && ! -f $ifile; |
| push (@inc_files, $ifile); |
| $inc_lines{$ifile} = $.; |
| } |
| } |
| |
| # Ignore any file that has an old serial (or no serial if we know |
| # another one with a serial). |
| return () |
| if ($serial_older || |
| ($type != FT_AUTOMAKE && !$serial_seen && exists $serial{$basename})); |
| |
| $file_contents{$file} = $contents; |
| |
| # For some reason I don't understand, it does not work |
| # to do "map { scan_file ($_, ...) } @inc_files" below. |
| # With Perl 5.8.2 it undefines @inc_files. |
| my @copy = @inc_files; |
| my @all_inc_files = (@inc_files, |
| map { scan_file ($type, $_, |
| "$file:$inc_lines{$_}") } @copy); |
| $file_includes{$file} = \@all_inc_files; |
| return @all_inc_files; |
| } |
| |
| # strip_redundant_includes (%FILES) |
| # --------------------------------- |
| # Each key in %FILES is a file that must be present in the output. |
| # However some of these files might already include other files in %FILES, |
| # so there is no point in including them another time. |
| # This removes items of %FILES which are already included by another file. |
| sub strip_redundant_includes (%) |
| { |
| my %files = @_; |
| |
| # Always include acinclude.m4, even if it does not appear to be used. |
| $files{'acinclude.m4'} = 1 if -f 'acinclude.m4'; |
| # File included by $configure_ac are redundant. |
| $files{$configure_ac} = 1; |
| |
| # Files at the end of @file_order should override those at the beginning, |
| # so it is important to preserve these trailing files. We can remove |
| # a file A if it is going to be output before a file B that includes |
| # file A, not the converse. |
| foreach my $file (reverse @file_order) |
| { |
| next unless exists $files{$file}; |
| foreach my $ifile (@{$file_includes{$file}}) |
| { |
| next unless exists $files{$ifile}; |
| delete $files{$ifile}; |
| verb "$ifile is already included by $file"; |
| } |
| } |
| |
| # configure.ac is implicitly included. |
| delete $files{$configure_ac}; |
| |
| return %files; |
| } |
| |
| sub trace_used_macros () |
| { |
| my %files = map { $map{$_} => 1 } keys %macro_seen; |
| %files = strip_redundant_includes %files; |
| |
| # When AC_CONFIG_MACRO_DIRS is used, avoid possible spurious warnings |
| # from autom4te about macros being "m4_require'd but not m4_defun'd"; |
| # for more background, see: |
| # http://lists.gnu.org/archive/html/autoconf-patches/2012-11/msg00004.html |
| # as well as autoconf commit 'v2.69-44-g1ed0548', "warn: allow aclocal |
| # to silence m4_require warnings". |
| my $early_m4_code .= "m4_define([m4_require_silent_probe], [-])"; |
| |
| my $traces = ($ENV{AUTOM4TE} || 'autom4te'); |
| $traces .= " --language Autoconf-without-aclocal-m4 "; |
| $traces = "echo '$early_m4_code' | $traces - "; |
| |
| # Support AC_CONFIG_MACRO_DIRS also with older autoconf. |
| # Note that we can't use '$ac_config_macro_dirs_fallback' here, because |
| # a bug in option parsing code of autom4te 2.68 and earlier will cause |
| # it to read standard input last, even if the "-" argument is specified |
| # early. |
| # FIXME: To be removed in Automake 2.0, once we can assume autoconf |
| # 2.70 or later. |
| $traces .= "$automake_includes[0]/internal/ac-config-macro-dirs.m4 "; |
| |
| # All candidate files. |
| $traces .= join (' ', |
| (map { "'$_'" } |
| (grep { exists $files{$_} } @file_order))) . " "; |
| |
| # All candidate macros. |
| $traces .= join (' ', |
| (map { "--trace='$_:\$f::\$n::\${::}%'" } |
| ('AC_DEFUN', |
| 'AC_DEFUN_ONCE', |
| 'AU_DEFUN', |
| '_AM_AUTOCONF_VERSION', |
| 'AC_CONFIG_MACRO_DIR_TRACE', |
| # FIXME: Tracing the next two macros is a hack for |
| # compatibility with older autoconf. Remove this in |
| # Automake 2.0, when we can assume Autoconf 2.70 or |
| # later. |
| 'AC_CONFIG_MACRO_DIR', |
| '_AM_CONFIG_MACRO_DIRS')), |
| # Do not trace $1 for all other macros as we do |
| # not need it and it might contains harmful |
| # characters (like newlines). |
| (map { "--trace='$_:\$f::\$n'" } (keys %macro_seen))); |
| |
| verb "running $traces $configure_ac"; |
| |
| my $tracefh = new Automake::XFile ("$traces $configure_ac |"); |
| |
| @ac_config_macro_dirs = (); |
| |
| my %traced = (); |
| |
| while ($_ = $tracefh->getline) |
| { |
| chomp; |
| my ($file, $macro, $arg1) = split (/::/); |
| |
| $traced{$macro} = 1 if exists $macro_seen{$macro}; |
| |
| if ($macro eq 'AC_DEFUN' || $macro eq 'AC_DEFUN_ONCE' |
| || $macro eq 'AU_DEFUN') |
| { |
| $map_traced_defs{$arg1} = $file; |
| } |
| elsif ($macro eq '_AM_AUTOCONF_VERSION') |
| { |
| $ac_version = $arg1; |
| } |
| elsif ($macro eq 'AC_CONFIG_MACRO_DIR_TRACE') |
| { |
| push @ac_config_macro_dirs, $arg1; |
| } |
| # FIXME: We still need to trace AC_CONFIG_MACRO_DIR |
| # for compatibility with older autoconf. Remove this |
| # once we can assume Autoconf 2.70 or later. |
| elsif ($macro eq 'AC_CONFIG_MACRO_DIR') |
| { |
| @ac_config_macro_dirs = ($arg1); |
| } |
| # FIXME:This is an hack for compatibility with older autoconf. |
| # Remove this once we can assume Autoconf 2.70 or later. |
| elsif ($macro eq '_AM_CONFIG_MACRO_DIRS') |
| { |
| # Empty leading/trailing fields might be produced by split, |
| # hence the grep is really needed. |
| push @ac_config_macro_dirs, grep (/./, (split /\s+/, $arg1)); |
| } |
| } |
| |
| # FIXME: in Autoconf >= 2.70, AC_CONFIG_MACRO_DIR calls |
| # AC_CONFIG_MACRO_DIR_TRACE behind the scenes, which could |
| # leave unwanted duplicates in @ac_config_macro_dirs. |
| # Remove this in Automake 2.0, when we'll stop tracing |
| # AC_CONFIG_MACRO_DIR explicitly. |
| @ac_config_macro_dirs = uniq @ac_config_macro_dirs; |
| |
| $tracefh->close; |
| |
| return %traced; |
| } |
| |
| sub scan_configure () |
| { |
| # Make sure we include acinclude.m4 if it exists. |
| if (-f 'acinclude.m4') |
| { |
| add_file ('acinclude.m4'); |
| } |
| scan_configure_dep ($configure_ac); |
| } |
| |
| ################################################################ |
| |
| # Write output. |
| # Return 0 iff some files were installed locally. |
| sub write_aclocal ($@) |
| { |
| my ($output_file, @macros) = @_; |
| my $output = ''; |
| |
| my %files = (); |
| # Get the list of files containing definitions for the macros used. |
| # (Filter out unused macro definitions with $map_traced_defs. This |
| # can happen when an Autoconf macro is conditionally defined: |
| # aclocal sees the potential definition, but this definition is |
| # actually never processed and the Autoconf implementation is used |
| # instead.) |
| for my $m (@macros) |
| { |
| $files{$map{$m}} = 1 |
| if (exists $map_traced_defs{$m} |
| && $map{$m} eq $map_traced_defs{$m}); |
| } |
| # Do not explicitly include a file that is already indirectly included. |
| %files = strip_redundant_includes %files; |
| |
| my $installed = 0; |
| |
| for my $file (grep { exists $files{$_} } @file_order) |
| { |
| # Check the time stamp of this file, and of all files it includes. |
| for my $ifile ($file, @{$file_includes{$file}}) |
| { |
| my $mtime = mtime $ifile; |
| $greatest_mtime = $mtime if $greatest_mtime < $mtime; |
| } |
| |
| # If the file to add looks like outside the project, copy it |
| # to the output. The regex catches filenames starting with |
| # things like '/', '\', or 'c:\'. |
| if ($file_type{$file} != FT_USER |
| || $file =~ m,^(?:\w:)?[\\/],) |
| { |
| if (!$install || $file_type{$file} != FT_SYSTEM) |
| { |
| # Copy the file into aclocal.m4. |
| $output .= $file_contents{$file} . "\n"; |
| } |
| else |
| { |
| # Install the file (and any file it includes). |
| my $dest; |
| for my $ifile (@{$file_includes{$file}}, $file) |
| { |
| install_file ($ifile, $user_includes[0]); |
| } |
| $installed = 1; |
| } |
| } |
| else |
| { |
| # Otherwise, simply include the file. |
| $output .= "m4_include([$file])\n"; |
| } |
| } |
| |
| if ($installed) |
| { |
| verb "running aclocal anew, because some files were installed locally"; |
| return 0; |
| } |
| |
| # Nothing to output?! |
| # FIXME: Shouldn't we diagnose this? |
| return 1 if ! length ($output); |
| |
| if ($ac_version) |
| { |
| # Do not use "$output_file" here for the same reason we do not |
| # use it in the header below. autom4te will output the name of |
| # the file in the diagnostic anyway. |
| $output = "m4_ifndef([AC_AUTOCONF_VERSION], |
| [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl |
| m4_if(m4_defn([AC_AUTOCONF_VERSION]), [$ac_version],, |
| [m4_warning([this file was generated for autoconf $ac_version. |
| You have another version of autoconf. It may work, but is not guaranteed to. |
| If you have problems, you may need to regenerate the build system entirely. |
| To do so, use the procedure documented by the package, typically 'autoreconf'.])]) |
| |
| $output"; |
| } |
| |
| # We used to print "# $output_file generated automatically etc." But |
| # this creates spurious differences when using autoreconf. Autoreconf |
| # creates aclocal.m4t and then rename it to aclocal.m4, but the |
| # rebuild rules generated by Automake create aclocal.m4 directly -- |
| # this would gives two ways to get the same file, with a different |
| # name in the header. |
| $output = "# generated automatically by aclocal $VERSION -*- Autoconf -*- |
| |
| # Copyright (C) 1996-$RELEASE_YEAR Free Software Foundation, Inc. |
| |
| # This file is free software; the Free Software Foundation |
| # gives unlimited permission to copy and/or distribute it, |
| # with or without modifications, as long as this notice is preserved. |
| |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY, to the extent permitted by law; without |
| # even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
| # PARTICULAR PURPOSE. |
| |
| $ac_config_macro_dirs_fallback |
| $output"; |
| |
| # We try not to update $output_file unless necessary, because |
| # doing so invalidate Autom4te's cache and therefore slows down |
| # tools called after aclocal. |
| # |
| # We need to overwrite $output_file in the following situations. |
| # * The --force option is in use. |
| # * One of the dependencies is younger. |
| # (Not updating $output_file in this situation would cause |
| # make to call aclocal in loop.) |
| # * The contents of the current file are different from what |
| # we have computed. |
| if (!$force_output |
| && $greatest_mtime < mtime ($output_file) |
| && $output eq contents ($output_file)) |
| { |
| verb "$output_file unchanged"; |
| return 1; |
| } |
| |
| verb "writing $output_file"; |
| |
| if (!$dry_run) |
| { |
| if (-e $output_file && !unlink $output_file) |
| { |
| fatal "could not remove '$output_file': $!"; |
| } |
| my $out = new Automake::XFile "> $output_file"; |
| print $out $output; |
| } |
| return 1; |
| } |
| |
| ################################################################ |
| |
| # Print usage and exit. |
| sub usage ($) |
| { |
| my ($status) = @_; |
| |
| print <<'EOF'; |
| Usage: aclocal [OPTION]... |
| |
| Generate 'aclocal.m4' by scanning 'configure.ac' or 'configure.in' |
| |
| Options: |
| --automake-acdir=DIR directory holding automake-provided m4 files |
| --system-acdir=DIR directory holding third-party system-wide files |
| --diff[=COMMAND] run COMMAND [diff -u] on M4 files that would be |
| changed (implies --install and --dry-run) |
| --dry-run pretend to, but do not actually update any file |
| --force always update output file |
| --help print this help, then exit |
| -I DIR add directory to search list for .m4 files |
| --install copy third-party files to the first -I directory |
| --output=FILE put output in FILE (default aclocal.m4) |
| --print-ac-dir print name of directory holding system-wide |
| third-party m4 files, then exit |
| --verbose don't be silent |
| --version print version number, then exit |
| -W, --warnings=CATEGORY report the warnings falling in CATEGORY |
| |
| Warning categories include: |
| syntax dubious syntactic constructs (default) |
| unsupported unknown macros (default) |
| all all the warnings (default) |
| no-CATEGORY turn off warnings in CATEGORY |
| none turn off all the warnings |
| error treat warnings as errors |
| |
| Report bugs to <bug-automake@gnu.org>. |
| GNU Automake home page: <http://www.gnu.org/software/automake/>. |
| General help using GNU software: <http://www.gnu.org/gethelp/>. |
| EOF |
| exit $status; |
| } |
| |
| # Print version and exit. |
| sub version () |
| { |
| print <<EOF; |
| aclocal (GNU $PACKAGE) $VERSION |
| Copyright (C) $RELEASE_YEAR Free Software Foundation, Inc. |
| License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html> |
| This is free software: you are free to change and redistribute it. |
| There is NO WARRANTY, to the extent permitted by law. |
| |
| Written by Tom Tromey <tromey\@redhat.com> |
| and Alexandre Duret-Lutz <adl\@gnu.org>. |
| EOF |
| exit 0; |
| } |
| |
| # Parse command line. |
| sub parse_arguments () |
| { |
| my $print_and_exit = 0; |
| my $diff_command; |
| |
| my %cli_options = |
| ( |
| 'help' => sub { usage(0); }, |
| 'version' => \&version, |
| 'system-acdir=s' => sub { shift; @system_includes = @_; }, |
| 'automake-acdir=s' => sub { shift; @automake_includes = @_; }, |
| 'diff:s' => \$diff_command, |
| 'dry-run' => \$dry_run, |
| 'force' => \$force_output, |
| 'I=s' => \@user_includes, |
| 'install' => \$install, |
| 'output=s' => \$output_file, |
| 'print-ac-dir' => \$print_and_exit, |
| 'verbose' => sub { setup_channel 'verb', silent => 0; }, |
| 'W|warnings=s' => \&parse_warnings, |
| ); |
| |
| use Automake::Getopt (); |
| Automake::Getopt::parse_options %cli_options; |
| |
| if (@ARGV > 0) |
| { |
| fatal ("non-option arguments are not accepted: '$ARGV[0]'.\n" |
| . "Try '$0 --help' for more information."); |
| } |
| |
| if ($print_and_exit) |
| { |
| print "@system_includes\n"; |
| exit 0; |
| } |
| |
| if (defined $diff_command) |
| { |
| $diff_command = 'diff -u' if $diff_command eq ''; |
| @diff_command = split (' ', $diff_command); |
| $install = 1; |
| $dry_run = 1; |
| } |
| |
| # Finally, adds any directory listed in the 'dirlist' file. |
| if (open (DIRLIST, "$system_includes[0]/dirlist")) |
| { |
| while (<DIRLIST>) |
| { |
| # Ignore '#' lines. |
| next if /^#/; |
| # strip off newlines and end-of-line comments |
| s/\s*\#.*$//; |
| chomp; |
| foreach my $dir (glob) |
| { |
| push (@system_includes, $dir) if -d $dir; |
| } |
| } |
| close (DIRLIST); |
| } |
| } |
| |
| # Add any directory listed in the 'ACLOCAL_PATH' environment variable |
| # to the list of system include directories. |
| sub parse_ACLOCAL_PATH () |
| { |
| return if not defined $ENV{"ACLOCAL_PATH"}; |
| # Directories in ACLOCAL_PATH should take precedence over system |
| # directories, so we use unshift. However, directories that |
| # come first in ACLOCAL_PATH take precedence over directories |
| # coming later, which is why the result of split is reversed. |
| foreach my $dir (reverse split /:/, $ENV{"ACLOCAL_PATH"}) |
| { |
| unshift (@system_includes, $dir) if $dir ne '' && -d $dir; |
| } |
| } |
| |
| ################################################################ |
| |
| parse_WARNINGS; # Parse the WARNINGS environment variable. |
| parse_arguments; |
| parse_ACLOCAL_PATH; |
| $configure_ac = require_configure_ac; |
| |
| # We may have to rerun aclocal if some file have been installed, but |
| # it should not happen more than once. The reason we must run again |
| # is that once the file has been moved from /usr/share/aclocal/ to the |
| # local m4/ directory it appears at a new place in the search path, |
| # hence it should be output at a different position in aclocal.m4. If |
| # we did not rerun aclocal, the next run of aclocal would produce a |
| # different aclocal.m4. |
| my $loop = 0; |
| my $rerun_due_to_macrodir = 0; |
| while (1) |
| { |
| ++$loop; |
| prog_error "too many loops" if $loop > 2 + $rerun_due_to_macrodir; |
| |
| reset_maps; |
| scan_m4_files; |
| scan_configure; |
| last if $exit_code; |
| my %macro_traced = trace_used_macros; |
| |
| if (!$rerun_due_to_macrodir && @ac_config_macro_dirs) |
| { |
| # The directory specified in calls to the AC_CONFIG_MACRO_DIRS |
| # m4 macro (if any) must go after the user includes specified |
| # explicitly with the '-I' option. |
| push @user_includes, @ac_config_macro_dirs; |
| # We might have to scan some new directory of .m4 files. |
| $rerun_due_to_macrodir++; |
| next; |
| } |
| |
| if ($install && !@user_includes) |
| { |
| fatal "installation of third-party macros impossible without " . |
| "-I options nor AC_CONFIG_MACRO_DIR{,S} m4 macro(s)"; |
| } |
| |
| last if write_aclocal ($output_file, keys %macro_traced); |
| last if $dry_run; |
| } |
| check_acinclude; |
| |
| exit $exit_code; |
| |
| ### Setup "GNU" style for perl-mode and cperl-mode. |
| ## Local Variables: |
| ## perl-indent-level: 2 |
| ## perl-continued-statement-offset: 2 |
| ## perl-continued-brace-offset: 0 |
| ## perl-brace-offset: 0 |
| ## perl-brace-imaginary-offset: 0 |
| ## perl-label-offset: -2 |
| ## cperl-indent-level: 2 |
| ## cperl-brace-offset: 0 |
| ## cperl-continued-brace-offset: 0 |
| ## cperl-label-offset: -2 |
| ## cperl-extra-newline-before-brace: t |
| ## cperl-merge-trailing-else: nil |
| ## cperl-continued-statement-offset: 2 |
| ## End: |