#! /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
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

# Written by David J. MacKenzie.
# Extended and rewritten in Perl by Akim Demaille.

BEGIN
{
  my $datadir = $ENV{'autom4te_perllibdir'} || '/usr/share/autoconf';
  unshift @INC, $datadir;

  # 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 are honored.

Report bugs to <bug-autoconf\@gnu.org>.
";

# $VERSION
# --------
$version = "autoreconf (GNU Autoconf) 2.61
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software.  You may redistribute copies of it under the terms of
the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
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/bin/autoconf';
my $autoheader = $ENV{'AUTOHEADER'} || '/usr/bin/autoheader';
my $automake   = $ENV{'AUTOMAKE'}   || 'automake';
my $aclocal    = $ENV{'ACLOCAL'}    || 'aclocal';
my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize';
my $autopoint  = $ENV{'AUTOPOINT'}  || 'autopoint';

# --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 $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'               => \$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` =~ /--force/;
  $automake_supports_force_missing = `$automake --help` =~ /--force-missing/;

  # Dispatch autoreconf's option to the tools.
  # --include;
  $autoconf   .= join (' --include=', '', @include);
  $autoconf   .= join (' --prepend-include=', '', @prepend_include);
  $autoheader .= join (' --include=', '', @include);
  $autoheader .= join (' --prepend-include=', '', @prepend_include);
  $aclocal   .= join (' -I', '', @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 "$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 (' --trace=', '',
	     # If you change this list, update the
	     # `Autoreconf-preselections' section of autom4te.in.
	     'AC_CONFIG_AUX_DIR:AC_CONFIG_AUX_DIR:\$1',
	     'AC_CONFIG_HEADERS',
	     'AC_CONFIG_SUBDIRS:AC_CONFIG_SUBDIRS:\$1',
	     'AC_INIT',
	     'AC_PROG_LIBTOOL',
	     'LT_INIT',
	     'LT_CONFIG_LTDL_DIR',
	     'AM_GNU_GETTEXT',
	     'AM_INIT_AUTOMAKE',
	    )
     . ' |');
  while ($_ = $traces->getline)
    {
      $aux_dir = $1                 if /AC_CONFIG_AUX_DIR:(.*)/;
      $uses_autoconf = 1            if /AC_INIT/;
      $uses_gettext_via_traces = 1  if /AM_GNU_GETTEXT/;
      $uses_libtool = 1             if /(AC_PROG_LIBTOOL|LT_INIT)/;
      $uses_libltdl = 1             if /LT_CONFIG_LTDL_DIR/;
      $uses_autoheader = 1          if /AC_CONFIG_HEADERS/;
      $uses_automake = 1            if /AM_INIT_AUTOMAKE/;
      push @subdir, split (' ', $1) if /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 ($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 ($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.
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:
