#! /usr/bin/perl -w
# -*- perl -*-
# Generated from autoreconf.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;

# autoreconf - install the GNU Build System in a directory tree
# Copyright (C) 1994, 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 3 of the License, 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 David J. MacKenzie.
# Extended and rewritten in Perl by Akim Demaille.

BEGIN
{
  my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/share/autoconf';
  unshift @INC, $pkgdatadir;

  # Override SHELL.  On DJGPP SHELL may not be set to a shell
  # that can handle redirection and quote arguments correctly,
  # e.g.: COMMAND.COM.  For DJGPP always use the shell that configure
  # has detected.
  $ENV{'SHELL'} = '/bin/sh' if ($^O eq 'dos');
}

use Autom4te::ChannelDefs;
use Autom4te::Channels;
use Autom4te::Configure_ac;
use Autom4te::FileUtils;
use Autom4te::General;
use Autom4te::XFile;
# Do not use Cwd::chdir, since it might hang.
use Cwd 'cwd';
use strict;

## ----------- ##
## Variables.  ##
## ----------- ##

# $HELP
# -----
$help = "Usage: $0 [OPTION]... [DIRECTORY]...

Run `autoconf' (and `autoheader', `aclocal', `automake', `autopoint'
(formerly `gettextize'), and `libtoolize' where appropriate)
repeatedly to remake the GNU Build System files in specified
DIRECTORIES and their subdirectories (defaulting to `.').

By default, it only remakes those files that are older than their
sources.  If you install new versions of the GNU Build System,
you can make `autoreconf' remake all of the files by giving it the
`--force' option.

Operation modes:
  -h, --help               print this help, then exit
  -V, --version            print version number, then exit
  -v, --verbose            verbosely report processing
  -d, --debug              don't remove temporary files
  -f, --force              consider all files obsolete
  -i, --install            copy missing auxiliary files
      --no-recursive       don't rebuild sub-packages
  -s, --symlink            with -i, install symbolic links instead of copies
  -m, --make               when applicable, re-run ./configure && make
  -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [syntax]

" . Autom4te::ChannelDefs::usage . "

The environment variable \`WARNINGS\' is honored.  Some subtools might
support other warning types, using \`all' is encouraged.

Library directories:
  -B, --prepend-include=DIR  prepend directory DIR to search path
  -I, --include=DIR          append directory DIR to search path

The environment variables AUTOCONF, AUTOHEADER, AUTOMAKE, ACLOCAL,
AUTOPOINT, LIBTOOLIZE, M4, and MAKE are honored.

Report bugs to <bug-autoconf\@gnu.org>.
GNU Autoconf home page: <http://www.gnu.org/software/autoconf/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
";

# $VERSION
# --------
$version = "autoreconf (GNU Autoconf) 2.65
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.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 David J. MacKenzie and Akim Demaille.
";

# Lib files.
my $autoconf   = $ENV{'AUTOCONF'}   || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/bin/autoconf';
my $autoheader = $ENV{'AUTOHEADER'} || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/bin/autoheader';
my $autom4te   = $ENV{'AUTOM4TE'}   || '/usr/local/google/apenwarr/athena/out.mstc/host/usr/bin/autom4te';
my $automake   = $ENV{'AUTOMAKE'}   || 'automake';
my $aclocal    = $ENV{'ACLOCAL'}    || 'aclocal';
my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize';
my $autopoint  = $ENV{'AUTOPOINT'}  || 'autopoint';
my $make       = $ENV{'MAKE'}       || 'make';

# --install -- as --add-missing in other tools.
my $install = 0;
# symlink -- when --install, use symlinks instead.
my $symlink = 0;
# Does aclocal support --force?
my $aclocal_supports_force = 0;
# Does automake support --force-missing?
my $automake_supports_force_missing = 0;

my @prepend_include;
my @include;

# List of command line warning requests.
my @warning;

# Rerun `./configure && make'?
my $run_make = 0;

# Recurse into subpackages
my $recursive = 1;

## ---------- ##
## Routines.  ##
## ---------- ##


# parse_args ()
# -------------
# Process any command line arguments.
sub parse_args ()
{
  my $srcdir;

  getopt ("W|warnings=s"         => \@warning,
	  'I|include=s'          => \@include,
	  'B|prepend-include=s'	 => \@prepend_include,
	  'i|install'            => \$install,
	  's|symlink'            => \$symlink,
	  'm|make'               => \$run_make,
	  'recursive!'           => \$recursive);

  # Split the warnings as a list of elements instead of a list of
  # lists.
  @warning = map { split /,/ } @warning;
  parse_WARNINGS;
  parse_warnings '--warnings', @warning;

  # Even if the user specified a configure.ac, trim to get the
  # directory, and look for configure.ac again.  Because (i) the code
  # is simpler, and (ii) we are still able to diagnose simultaneous
  # presence of configure.ac and configure.in.
  @ARGV = map { /configure\.(ac|in)$/ ? dirname ($_) : $_ } @ARGV;
  push @ARGV, '.' unless @ARGV;

  if ($verbose && $debug)
    {
      for my $prog ($autoconf, $autoheader,
		    $automake, $aclocal,
		    $autopoint,
		    $libtoolize)
	{
	  xsystem ("$prog --version | sed 1q >&2");
	  print STDERR "\n";
	}
    }

  $aclocal_supports_force = `$aclocal --help 2>/dev/null` =~ /--force/;
  $automake_supports_force_missing = `$automake --help 2>/dev/null` =~ /--force-missing/;

  # Dispatch autoreconf's option to the tools.
  # --include;
  $aclocal    .= join (' -I ', '', map { shell_quote ($_) } @include);
  $autoconf   .= join (' --include=', '', map { shell_quote ($_) } @include);
  $autoconf   .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include);
  $autoheader .= join (' --include=', '', map { shell_quote ($_) } @include);
  $autoheader .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include);

  # --install and --symlink;
  if ($install)
    {
      $automake   .= ' --add-missing';
      $automake   .= ' --copy' unless $symlink;
      $libtoolize .= ' --copy' unless $symlink;
    }
  # --force;
  if ($force)
    {
      $aclocal    .= ' --force'
	if $aclocal_supports_force;
      $autoconf   .= ' --force';
      $autoheader .= ' --force';
      $automake   .= ' --force-missing'
	if $automake_supports_force_missing;
      $autopoint  .= ' --force';
      $libtoolize .= ' --force';
    }
  else
    {
      # The implementation of --no-force is bogus in all implementations
      # of Automake up to 1.8, so we avoid it in these cases.  (Automake
      # 1.8 is the first version where aclocal supports force, hence
      # the condition.)
      $automake .= ' --no-force'
	if $aclocal_supports_force;
    }
  # --verbose --verbose or --debug;
  if ($verbose > 1 || $debug)
    {
      $autoconf   .= ' --verbose';
      $autoheader .= ' --verbose';
      $automake   .= ' --verbose';
      $aclocal    .= ' --verbose';
    }
  if ($debug)
    {
      $autoconf   .= ' --debug';
      $autoheader .= ' --debug';
      $libtoolize .= ' --debug';
    }
  # --warnings;
  if (@warning)
    {
      my $warn = ' --warnings=' . join (',', @warning);
      $autoconf   .= $warn;
      $autoheader .= $warn;
      $automake   .= $warn
	if `$automake --help` =~ /--warnings/;
    }
}


# &run_aclocal ($ACLOCAL, $FLAGS)
# -------------------------------
# Update aclocal.m4 as lazily as possible, as aclocal pre-1.8 always
# overwrites aclocal.m4, hence triggers autoconf, autoheader, automake
# etc. uselessly.  aclocal 1.8+ does not need this.
sub run_aclocal ($$)
{
  my ($aclocal, $flags) = @_;

  # aclocal 1.8+ does all this for free.  It can be recognized by its
  # --force support.
  if ($aclocal_supports_force)
    {
      xsystem ("$aclocal $flags");
    }
  else
    {
      xsystem ("$aclocal $flags --output=aclocal.m4t");
      # aclocal may produce no output.
      if (-f 'aclocal.m4t')
	{
	  update_file ('aclocal.m4t', 'aclocal.m4');
	  # Make sure that the local m4 files are older than
	  # aclocal.m4.
	  #
	  # Why is not always the case?  Because we already run
	  # aclocal at first (before tracing), which, for instance,
	  # can find Gettext's macros in .../share/aclocal, so we may
	  # have had the right aclocal.m4 already.  Then autopoint is
	  # run, and installs locally these M4 files.  Then
	  # autoreconf, via update_file, sees it is the _same_
	  # aclocal.m4, and doesn't change its timestamp.  But later,
	  # Automake's Makefile expresses that aclocal.m4 depends on
	  # these local files, which are newer, so it triggers aclocal
	  # again.
	  #
	  # To make sure aclocal.m4 is no older, we change the
	  # modification times of the local M4 files to be not newer
	  # than it.
	  #
	  # First, where are the local files?
	  my $aclocal_local_dir = '.';
	  if ($flags =~ /-I\s+(\S+)/)
	    {
	      $aclocal_local_dir = $1;
	    }
	  # All the local files newer than aclocal.m4 are to be
	  # made not newer than it.
	  my $aclocal_m4_mtime = mtime ('aclocal.m4');
	  for my $file (glob ("$aclocal_local_dir/*.m4"), 'acinclude.m4')
	    {
	      if ($aclocal_m4_mtime < mtime ($file))
		{
		  debug "aging $file to be not newer than aclocal.m4";
		  utime $aclocal_m4_mtime, $aclocal_m4_mtime, $file;
		}
	    }
	}
    }
}

# &autoreconf_current_directory
# -----------------------------
sub autoreconf_current_directory ()
{
  my $configure_ac = find_configure_ac;

  # ---------------------- #
  # Is it using Autoconf?  #
  # ---------------------- #

  my $uses_autoconf;
  my $uses_gettext;
  if (-f $configure_ac)
    {
      my $configure_ac_file = new Autom4te::XFile "< $configure_ac";
      while ($_ = $configure_ac_file->getline)
	{
	  s/#.*//;
	  s/dnl.*//;
	  $uses_autoconf = 1 if /AC_INIT/;
	  # See below for why we look for gettext here.
	  $uses_gettext = 1  if /^AM_GNU_GETTEXT_VERSION/;
	}
    }
  if (!$uses_autoconf)
    {
      verb "$configure_ac: not using Autoconf";
      return;
    }


  # ------------------- #
  # Running autopoint.  #
  # ------------------- #

  # Gettext is a bit of a problem: its macros are not necessarily
  # visible to aclocal, so if we start with a completely striped down
  # package (think of a fresh CVS checkout), running `aclocal' first
  # will fail: the Gettext macros are missing.
  #
  # Therefore, we can't use the traces to decide if we use Gettext or
  # not.  I guess that once Gettext move to 2.5x we will be able to,
  # but in the meanwhile forget it.
  #
  # We can only grep for AM_GNU_GETTEXT_VERSION in configure.ac.  You
  # might think this approach is naive, and indeed it is, as it
  # prevents one to embed AM_GNU_GETTEXT_VERSION in another *.m4, but
  # anyway we don't limit the generality, since... that's what
  # autopoint does.  Actually, it is even more restrictive, as it
  # greps for `^AM_GNU_GETTEXT_VERSION('.  We did this above, while
  # scanning configure.ac.
  if (!$uses_gettext)
    {
      verb "$configure_ac: not using Gettext";
    }
  elsif (!$install)
    {
      verb "$configure_ac: not running autopoint: --install not given";
    }
  else
    {
      xsystem_hint ("autopoint is needed because this package uses Gettext", "$autopoint");
    }


  # ----------------- #
  # Running aclocal.  #
  # ----------------- #

  # Run it first: it might discover new macros to add, e.g.,
  # AC_PROG_LIBTOOL, which we will trace later to see if Libtool is
  # used.
  #
  # Always run it.  Tracking its sources for up-to-dateness is too
  # complex and too error prone.  The best we can do is avoiding
  # nuking the time stamp.
  my $uses_aclocal = 1;

  # Nevertheless, if aclocal.m4 exists and is not made by aclocal,
  # don't run aclocal.

  if (-f 'aclocal.m4')
    {
      my $aclocal_m4 = new Autom4te::XFile 'aclocal.m4';
      $_ = $aclocal_m4->getline;
      $uses_aclocal = 0
	unless defined ($_) && /generated.*by aclocal/;
    }

  # If there are flags for aclocal in Makefile.am, use them.
  my $aclocal_flags = '';
  if ($uses_aclocal && -f 'Makefile.am')
    {
      my $makefile = new Autom4te::XFile 'Makefile.am';
      while ($_ = $makefile->getline)
	{
	  if (/^ACLOCAL_[A-Z_]*FLAGS\s*=\s*(.*)/)
	    {
	      $aclocal_flags = $1;
	      last;
	    }
	}
    }

  if (!$uses_aclocal)
    {
      verb "$configure_ac: not using aclocal";
    }
  else
    {
      # Some file systems have sub-second time stamps, and if so we may
      # run into trouble later, after we rerun autoconf and set the
      # time stamps of input files to be no greater than aclocal.m4,
      # because the time-stamp-setting operation (utime) has a
      # resolution of only 1 second.  Work around the problem by
      # ensuring that there is at least a one-second window before the
      # time stamp of aclocal.m4t in which no file time stamps can
      # fall.
      sleep 1;

      run_aclocal ($aclocal, $aclocal_flags);
    }

  # We might have to rerun aclocal if Libtool (or others) imports new
  # macros.
  my $rerun_aclocal = 0;



  # ------------------------------- #
  # See what tools will be needed.  #
  # ------------------------------- #

  # Perform a single trace reading to avoid --force forcing a rerun
  # between two --trace, that's useless.  If there is no AC_INIT, then
  # we are not interested: it looks like a Cygnus thingy.
  my $aux_dir;
  my $uses_gettext_via_traces;
  my $uses_libtool;
  my $uses_libltdl;
  my $uses_autoheader;
  my $uses_automake;
  my @subdir;
  verb "$configure_ac: tracing";
  my $traces = new Autom4te::XFile
    ("$autoconf"
     . join (' ',
	     map { ' --trace=' . $_ . ':\$n::\${::}%' }
	     # If you change this list, update the
	     # `Autoreconf-preselections' section of autom4te.in.
	     'AC_CONFIG_AUX_DIR',
	     'AC_CONFIG_HEADERS',
	     'AC_CONFIG_SUBDIRS',
	     'AC_INIT',
	     'AC_PROG_LIBTOOL',
	     'LT_INIT',
	     'LT_CONFIG_LTDL_DIR',
	     'AM_GNU_GETTEXT',
	     'AM_INIT_AUTOMAKE',
	    )
     . ' |');
  while ($_ = $traces->getline)
    {
      chomp;
      my ($macro, @args) = split (/::/);
      $aux_dir = $args[0]           if $macro eq "AC_CONFIG_AUX_DIR";
      $uses_autoconf = 1            if $macro eq "AC_INIT";
      $uses_gettext_via_traces = 1  if $macro eq "AM_GNU_GETTEXT";
      $uses_libtool = 1             if $macro eq "AC_PROG_LIBTOOL"
                                       || $macro eq "LT_INIT";
      $uses_libltdl = 1             if $macro eq "LT_CONFIG_LTDL_DIR";
      $uses_autoheader = 1          if $macro eq "AC_CONFIG_HEADERS";
      $uses_automake = 1            if $macro eq "AM_INIT_AUTOMAKE";
      push @subdir, split (' ', $args[0])
                                    if $macro eq "AC_CONFIG_SUBDIRS" && $recursive;
    }

  # The subdirs are *optional*, they may not exist.
  foreach (@subdir)
    {
      if (-d)
	{
	  verb "$configure_ac: adding subdirectory $_ to autoreconf";
	  autoreconf ($_);
	}
      else
	{
	  verb "$configure_ac: subdirectory $_ not present";
	}
    }

  # Gettext consistency checks...
  error "$configure_ac: AM_GNU_GETTEXT is used, but not AM_GNU_GETTEXT_VERSION"
    if $uses_gettext_via_traces && ! $uses_gettext;
  error "$configure_ac: AM_GNU_GETTEXT_VERSION is used, but not AM_GNU_GETTEXT"
    if $uses_gettext && ! $uses_gettext_via_traces;


  # ---------------------------- #
  # Setting up the source tree.  #
  # ---------------------------- #

  # libtoolize, automake --add-missing etc. will drop files in the
  # $AUX_DIR.  But these tools fail to install these files if the
  # directory itself does not exist, which valid: just imagine a CVS
  # repository with hand written code only (there is not even a need
  # for a Makefile.am!).

  if (defined $aux_dir && ! -d $aux_dir)
    {
      verb "$configure_ac: creating directory $aux_dir";
      mkdir $aux_dir, 0755
	or error "cannot create $aux_dir: $!";
    }


  # -------------------- #
  # Running libtoolize.  #
  # -------------------- #

  if (!$uses_libtool)
    {
      verb "$configure_ac: not using Libtool";
    }
  elsif ($install)
    {
      if ($uses_libltdl)
	{
	  $libtoolize .= " --ltdl";
	}
      xsystem_hint ("libtoolize is needed because this package uses Libtool", $libtoolize);
      $rerun_aclocal = 1;
    }
  else
    {
      verb "$configure_ac: not running libtoolize: --install not given";
    }



  # ------------------- #
  # Rerunning aclocal.  #
  # ------------------- #

  # If we re-installed Libtool or Gettext, the macros might have changed.
  # Automake also needs an up-to-date aclocal.m4.
  if ($rerun_aclocal)
    {
      if (!$uses_aclocal)
	{
	  verb "$configure_ac: not using aclocal";
	}
      else
	{
	  run_aclocal ($aclocal, $aclocal_flags);
	}
    }


  # ------------------ #
  # Running autoconf.  #
  # ------------------ #

  # Don't try to be smarter than `autoconf', which does its own up to
  # date checks.
  #
  # We prefer running autoconf before autoheader, because (i) the
  # latter runs the former, and (ii) autoconf is stricter than
  # autoheader.  So all in all, autoconf should give better error
  # messages.
  xsystem ($autoconf);


  # -------------------- #
  # Running autoheader.  #
  # -------------------- #

  # We now consider that if AC_CONFIG_HEADERS is used, then autoheader
  # is used too.
  #
  # Just as for autoconf, up to date ness is performed by the tool
  # itself.
  #
  # Run it before automake, since the latter checks the presence of
  # config.h.in when it sees an AC_CONFIG_HEADERS.
  if (!$uses_autoheader)
    {
      verb "$configure_ac: not using Autoheader";
    }
  else
    {
      xsystem ($autoheader);
    }


  # ------------------ #
  # Running automake.  #
  # ------------------ #

  if (!$uses_automake)
    {
      verb "$configure_ac: not using Automake";
    }
  else
    {
      # We should always run automake, and let it decide whether it shall
      # update the file or not.  In fact, the effect of `$force' is already
      # included in `$automake' via `--no-force'.
      xsystem ($automake);
    }


  # -------------- #
  # Running make.  #
  # -------------- #

  if ($run_make)
    {
      if (!-f "config.status")
	{
	  verb "no config.status: cannot re-make";
	}
      else
	{
	  xsystem ("./config.status --recheck");
	  xsystem ("./config.status");
	  if (!-f "Makefile")
	    {
	      verb "no Makefile: cannot re-make";
	    }
	  else
	    {
	      xsystem ("$make");
	    }
	}
    }
}


# &autoreconf ($DIRECTORY)
# ------------------------
# Reconf the $DIRECTORY.
sub autoreconf ($)
{
  my ($directory) = @_;
  my $cwd = cwd;

  # The format for this message is not free: taken from Emacs, itself
  # using GNU Make's format.
  verb "Entering directory `$directory'";
  chdir $directory
    or error "cannot chdir to $directory: $!";

  autoreconf_current_directory;

  # The format is not free: taken from Emacs, itself using GNU Make's
  # format.
  verb "Leaving directory `$directory'";
  chdir $cwd
    or error "cannot chdir to $cwd: $!";
}


## ------ ##
## Main.  ##
## ------ ##

# When debugging, it is convenient that all the related temporary
# files be at the same place.
mktmpdir ('ar');
$ENV{'TMPDIR'} = $tmp;
parse_args;

# Autoreconf all the given configure.ac.  Unless `--no-recursive' is passed,
# AC_CONFIG_SUBDIRS will be traversed in &autoreconf_current_directory.
$ENV{'AUTOM4TE'} = $autom4te;
for my $directory (@ARGV)
  {
    require_configure_ac ($directory);
    autoreconf ($directory);
  }

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