#!/usr/bin/perl -w
# -*- perl -*-
# Generated from 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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2009  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
{
  my $perllibdir = $ENV{'perllibdir'} || '/usr/local/google/prism/kvmtc/host/usr/share/automake-1.11';
  unshift @INC, (split ':', $perllibdir);
}

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::stat;
use Cwd;

# Some globals.

# 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 macro.  @user_includes can be augmented with -I.
# @system_includes can be augmented with the `dirlist' file.  Also
# --acdir will reset both @automake_includes and @system_includes.
my @user_includes = ();
my @automake_includes = ("/usr/local/google/prism/kvmtc/host/usr/share/aclocal-$APIVERSION");
my @system_includes = ('/usr/local/google/prism/kvmtc/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
# Set by trace_used_macros.
my $ac_version;

# If set, names a temporary file that must be erased on abnormal exit.
my $erase_me;

################################################################

# 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 }

# 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', "warning: 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, $DEST)
sub install_file ($$)
{
  my ($src, $dest) = @_;
  my $diff_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)
	{
	  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, @DIRS)
# --------------------------
# Scan all M4 files installed in @DIRS for new macro definitions.
# Register each file as of type $TYPE (one of the FT_* constants).
sub scan_m4_dirs ($@)
{
  my ($type, @dirlist) = @_;

  foreach my $m4dir (@dirlist)
    {
      if (! opendir (DIR, $m4dir))
	{
	  fatal "couldn't open directory `$m4dir': $!";
	}

      # 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.
  scan_m4_dirs (FT_USER, @user_includes);
  scan_m4_dirs (FT_AUTOMAKE, @automake_includes);
  scan_m4_dirs (FT_SYSTEM, @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",
	       "warning: 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:$.",
		   "warning: 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:$.", "warning: underquoted definition of $2"
		   . "\n  run info '(automake)Extending aclocal'\n"
		   . "  or see http://sources.redhat.com/automake/"
		   . "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;

  my $traces = ($ENV{AUTOM4TE} || 'autom4te');
  $traces .= " --language Autoconf-without-aclocal-m4 ";
  # All candidate files.
  $traces .= join (' ',
		   (map { "'$_'" }
		    (grep { exists $files{$_} } @file_order))) . " ";
  # All candidate macros.
  $traces .= join (' ',
		   (map { "--trace='$_:\$f::\$n::\$1'" }
		    ('AC_DEFUN',
		     'AC_DEFUN_ONCE',
		     'AU_DEFUN',
		     '_AM_AUTOCONF_VERSION')),
		   # 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 |");

  my %traced = ();

  while ($_ = $tracefh->getline)
    {
      chomp;
      my ($file, $macro, $arg1) = split (/::/);

      $traced{$macro} = 1 if exists $macro_seen{$macro};

      $map_traced_defs{$arg1} = $file
	if ($macro eq 'AC_DEFUN'
	    || $macro eq 'AC_DEFUN_ONCE'
	    || $macro eq 'AU_DEFUN');

      $ac_version = $arg1 if $macro eq '_AM_AUTOCONF_VERSION';
    }

  $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)
		{
		  $dest = "$user_includes[0]/" . basename $ifile;
		  verb "installing $ifile to $dest";
		  install_file ($ifile, $dest);
		}
	      $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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
# 2005, 2006, 2007, 2008, 2009  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.

$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 "Usage: aclocal [OPTIONS] ...

Generate `aclocal.m4' by scanning `configure.ac' or `configure.in'

Options:
      --acdir=DIR           directory holding config files (for debugging)
      --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 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>.\n";

  exit $status;
}

# Print version and exit.
sub version()
{
  print <<EOF;
aclocal (GNU $PACKAGE) $VERSION
Copyright (C) 2009 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 =
    (
     'acdir=s'		=> sub # Setting --acdir overrides both the
                             { # automake (versioned) directory and the
			       # public (unversioned) system directory.
			       @automake_includes = ();
			       @system_includes = ($_[1])
			     },
     '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 Getopt::Long;
  Getopt::Long::config ("bundling", "pass_through");

  # See if --version or --help is used.  We want to process these before
  # anything else because the GNU Coding Standards require us to
  # `exit 0' after processing these options, and we can't guarantee this
  # if we treat other options first.  (Handling other options first
  # could produce error diagnostics, and in this condition it is
  # confusing if aclocal does `exit 0'.)
  my %cli_options_1st_pass =
    (
     'version' => \&version,
     'help'    => sub { usage(0); },
     # Recognize all other options (and their arguments) but do nothing.
     map { $_ => sub {} } (keys %cli_options)
     );
  my @ARGV_backup = @ARGV;
  Getopt::Long::GetOptions %cli_options_1st_pass
    or exit 1;
  @ARGV = @ARGV_backup;

  # Now *really* process the options.  This time we know that --help
  # and --version are not present, but we specify them nonetheless so
  # that ambiguous abbreviation are diagnosed.
  Getopt::Long::GetOptions %cli_options, 'version' => sub {}, 'help' => sub {}
    or exit 1;

  if (@ARGV)
    {
      my %argopts;
      for my $k (keys %cli_options)
	{
	  if ($k =~ /(.*)=s$/)
	    {
	      map { $argopts{(length ($_) == 1)
			     ? "-$_" : "--$_" } = 1; } (split (/\|/, $1));
	    }
	}
      if (exists $argopts{$ARGV[0]})
	{
	  fatal ("option `$ARGV[0]' requires an argument\n"
		 . "Try `$0 --help' for more information.");
	}
      else
	{
	  fatal ("unrecognized option `$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;
    }

  if ($install && !@user_includes)
    {
      fatal ("--install should copy macros in the directory indicated by the"
	     . "\nfirst -I option, but no -I was supplied.");
    }

  if (! -d $system_includes[0])
    {
      # By default $(datadir)/aclocal doesn't exist.  We don't want to
      # get an error in the case where we are searching the default
      # directory and it hasn't been created.  (We know
      # @system_includes has its default value if @automake_includes
      # is not empty, because --acdir is the only way to change this.)
      @system_includes = () if @automake_includes;
    }
  else
    {
      # 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);
	}
    }
}

################################################################

parse_WARNINGS;		    # Parse the WARNINGS environment variable.
parse_arguments;
$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;
while (1)
  {
    ++$loop;
    prog_error "Too many loops." if $loop > 2;

    reset_maps;
    scan_m4_files;
    scan_configure;
    last if $exit_code;
    my %macro_traced = trace_used_macros;
    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:
