#! /usr/bin/env perl
# -*- perl -*-

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;

# gnu-configize - install the GNU config.guess / config.sub in a directory tree
# Based on autoreconf:
#   Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003
#   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., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.

BEGIN
{
  my $datadir = $ENV{'autom4te_perllibdir'} || '@autom4te_perllibdir@';
#  '/home/kergoth/code/build-arm/tmp/staging/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] ... [CONFIGURE-AC or DIRECTORY] ...

Install the GNU config.sub and config.guess scripts in the
DIRECTORIES or the directory trees driven by CONFIGURE-AC
(defaulting to `.').

Operation modes:
  -h, --help               print this help, then exit
  -V, --version            print version number, then exit
  -v, --verbose            verbosely report processing
  -f, --force              consider all files obsolete
  -s, --symlink            install symbolic links instead of copies
  -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.
";

# $VERSION
# --------
$version = "gnu-configize 1.0

Copyright (C) 2004 Chris Larson
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
";

my $configdir  = '@gnu-configdir@';
#'/home/kergoth/code/build-arm/tmp/staging/i686-linux/share/gnu-config';
my $autoconf   = $ENV{'AUTOCONF'}     || 'autoconf';

# use symlinks instead.
my $symlink = 0;

my $configure_ac;

my $rm = "rm -f";
my $ln_s = "ln -sf";
my $cp = "cp -f";
my $mkdir = "mkdir";
my $chmod = "chmod";

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


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

  getopt ('s|symlink'            => \$symlink);

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


# &gnu_configize_current_directory
# -----------------------------
sub gnu_configize_current_directory ()
{
  my $configure_ac = require_configure_ac;

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

  my $uses_autoconf;
  my $uses_gettext;
  my $configure_ac_file = new Autom4te::XFile $configure_ac;
  while ($_ = $configure_ac_file->getline)
     {
       s/#.*//;
       s/dnl.*//;
       $uses_autoconf = 1 if /AC_INIT/;
     }

  if (!$uses_autoconf)
    {
      verb "$configure_ac: not using Autoconf";
      return;
    }

  my $aux_dir;
  my @subdir;
  my $cmd;
  my $dest;

  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_SUBDIRS:AC_CONFIG_SUBDIRS:\$1',
	     'AC_INIT',
	    )
     . ' |');
  while ($_ = $traces->getline)
    {
      $aux_dir = $1                 if /AC_CONFIG_AUX_DIR:(.*)/;
      $uses_autoconf = 1            if /AC_INIT/;
      push @subdir, split (' ', $1) if /AC_CONFIG_SUBDIRS:(.*)/;
    }

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

  $dest = ".";

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

  if (!$symlink)
    {
      $cmd = $cp;
    }
  else
    {
      $cmd = $ln_s;
    }

  xsystem ("$cmd $configdir/config.guess $dest/");
  xsystem ("$chmod u+x $dest/config.guess");
  xsystem ("$cmd $configdir/config.sub $dest/");
  xsystem ("$chmod u+x $dest/config.sub");
}


# &gnu_configize ($DIRECTORY)
# ------------------------
# Reconf the $DIRECTORY.
sub gnu_configize ($)
{
  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: $!";

  gnu_configize_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.  ##
## ------ ##

parse_args;

# Autoreconf all the given configure.ac.  A while loop, not a for,
# since the list can change at runtime because of AC_CONFIG_SUBDIRS.
for my $directory (@ARGV)
  {
    gnu_configize ($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:
