autoconf/bin/autoreconf.in
Akim Demaille 9958e7c098 * lib/Autom4te/General.pm (&update_file): If destination is
unchanged, remove the source.
(&up_to_date_p): Don't be verbose, be debug.
* bin/autoreconf.in: No longer support --m4dir.
(&autoreconf): Display the full path of the configure.ac we are
studying.
Trace it only once.
Be sure to honor --force with gettextize.
Always run aclocal.
* doc/autoconf.texi: Adjust.
2001-10-20 06:56:45 +00:00

358 lines
9.1 KiB
Perl

#! @PERL@ -w
# -*- perl -*-
# @configure_input@
eval 'exec @PERL@ -S $0 ${1+"$@"}'
if 0;
# autoreconf - install the GNU Build System in a directory tree
# Copyright 1994, 1999, 2000, 2001 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.
# Written by David J. MacKenzie.
# Extended and rewritten in Perl by Akim Demaille.
BEGIN
{
my $perllibdir = $ENV{'autom4te_perllibdir'} || '@datadir@';
unshift @INC, "$perllibdir";
}
use Autom4te::General;
use Autom4te::XFile;
use File::Find;
use strict;
## ----------- ##
## Variables. ##
## ----------- ##
# $HELP
# -----
$help = "Usage: $0 [OPTION] ... [TEMPLATE-FILE]
Run `autoconf' (and `autoheader', `aclocal', `automake', `gettextize',
and `libtoolize' where appropriate) repeatedly to remake the GNU Build
System files in the directory tree rooted at the current directory.
By default, it only remakes those files that are older than their
predecessors. If you install new versions of the GNU Build System,
running `autoreconf' remakes 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
-s, --symlink instead of copying, install symbolic links
The option `--install' is similar to the option `--add-missing' in
other tools.
Library directories:
-I, --include=DIR look for FILES in DIR (cumulative)
The environment variables AUTOCONF, AUTOHEADER, AUTOMAKE, ACLOCAL,
GETTEXTIZE, LIBTOOLIZE are honored.
Report bugs to <bug-autoconf\@gnu.org>.
";
# $VERSION
# --------
$version = "autoreconf (@PACKAGE_NAME@) @VERSION@
Written by David J. MacKenzie and Akim Demaille.
Copyright 1994, 1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
";
# Lib files.
my $autoconf = $ENV{'AUTOCONF'} || '@autoconf-name@';
my $autoheader = $ENV{'AUTOHEADER'} || '@autoheader-name@';
my $automake = $ENV{'AUTOMAKE'} || 'automake';
my $aclocal = $ENV{'ACLOCAL'} || 'aclocal';
my $libtoolize = $ENV{'LIBTOOLIZE'} || 'libtoolize';
my $gettextize = $ENV{'GETTEXTIZE'} || 'gettextize';
# --install -- as --add-missing in other tools.
my $install = 0;
my @include;
my $status = 0;
# symlink -- when --install, use symlinks instead.
my $symlink = 0;
## ---------- ##
## Routines. ##
## ---------- ##
# parse_args ()
# -------------
# Process any command line arguments.
sub parse_args ()
{
my $srcdir;
getopt ('I|include|A|autoconf-dir|m|macrodir|l|localdir=s' => \@include,
'i|install' => \$install,
's|symlink' => \$symlink);
die "$me: too many arguments\n"
if @ARGV;
if ($verbose && $debug)
{
xsystem ("$autoconf --version | sed 1q >&2");
print STDERR "\n";
xsystem ("$autoheader --version | sed 1q >&2");
print STDERR "\n";
xsystem ("$automake --version | sed 1q >&2");
print STDERR "\n";
xsystem ("$aclocal --version | sed 1q >&2");
print STDERR "\n";
xsystem ("$gettextize --version | sed 1q >&2");
print STDERR "\n";
xsystem ("$libtoolize --version | sed 1q >&2");
print STDERR "\n";
}
# Dispatch autoreconf's option to the tools.
# --include;
$autoconf .= join (' --include=', '', @include);
$autoheader .= join (' --include=', '', @include);
# --install and --symlink;
if ($install)
{
$automake .= ' --add-missing';
$automake .= ' --copy' unless $symlink;
$gettextize .= ' --copy' unless $symlink;
$libtoolize .= ' --copy' unless $symlink;
}
# --force;
if ($force)
{
$autoconf .= ' --force';
$autoheader .= ' --force';
$automake .= ' --force-missing';
$gettextize .= ' --force';
$libtoolize .= ' --force';
}
else
{
$automake .= ' --no-force';
}
# --debug;
if ($debug)
{
$autoconf .= ' --verbose --debug';
$autoheader .= ' --verbose --debug';
$automake .= ' --verbose';
$aclocal .= ' --verbose';
$libtoolize .= ' --debug';
}
}
# &maybe_autoreconf ()
# --------------------
# If the current file ($_) is configure.ac, then there is work to perform
# there. Otherwise return. The main point is preserving $_.
sub maybe_autoreconf ()
{
# If there it's not `configure.ac' or `configure.in', we are not
# interested in the directory.
return
if !/^configure\.(ac|in)$/;
# Save $_ as Find::File requires it to be preserved.
my $underscore = $_;
autoreconf ($_);
$_ = $underscore;
}
# &autoreconf ($CONFIGURE_AC)
# ---------------------------
# Reconf the current directory.
sub autoreconf ($)
{
my ($configure_ac) = @_;
verbose "working on $File::Find::name";
# ------------------------------- #
# 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 $configure_ac_file = new Autom4te::XFile $configure_ac;
my $uses_autoconf;
my $uses_gettext;
my $uses_libtool;
my $uses_autoheader;
while ($_ = $configure_ac_file->getline)
{
$uses_autoconf = 1
if /AC_INIT/;
}
my $traces = new Autom4te::XFile
("$autoconf"
. join (' --trace=', '',
'AC_INIT', 'AM_GNU_GETTEXT', 'AM_PROG_LIBTOOL',
'AC_CONFIG_HEADERS')
. " |");
while ($_ = $traces->getline)
{
$uses_autoconf = 1 if /AC_INIT/;
$uses_gettext = 1 if /AM_GNU_GETTEXT/;
$uses_libtool = 1 if /AM_PROG_LIBTOOL/;
$uses_autoheader = 1 if /AC_CONFIG_HEADERS/;
}
# ------------------ #
# Running autoconf. #
# ------------------ #
if (!$uses_autoconf)
{
verbose "$configure_ac: not using Autoconf";
return;
}
# -------------------- #
# Running gettexitze. #
# -------------------- #
if (!$uses_gettext)
{
verbose "$configure_ac: not using Gettext";
}
elsif (-d 'intl' && !$force)
{
verbose "$configure_ac: not running gettextize: `intl' is already present";
}
else
{
xsystem ($gettextize);
}
# -------------------- #
# Running libtoolize. #
# -------------------- #
if (!$uses_libtool)
{
verbose "$configure_ac: not using Libtool";
}
else
{
xsystem ($libtoolize);
}
# ----------------- #
# Running aclocal. #
# ----------------- #
# Always run aclocal. 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.
# If there are flags for aclocal in Makefile.am, use them.
my $aclocal_flags;
if (-f 'Makefile.am')
{
my $aclocal_m4 = new Autom4te::XFile 'Makefile.am';
while ($_ = $aclocal_m4->getline)
{
if (/^ACLOCAL_[A-Z_]*FLAGS\s*=\s*(.*)/)
{
$aclocal_flags = $1;
last;
}
}
}
xsystem ("$aclocal $aclocal_flags --output=aclocal.m4t");
update_file ('aclocal.m4t', 'aclocal.m4');
# ------------------ #
# Running automake. #
# ------------------ #
# Assumes that there is a Makefile.am in the topmost directory.
if (!-f 'Makefile.am')
{
verbose "$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 autoconf. #
# ------------------ #
# Don't try to be smarter than `autoconf', which does its own
# up to date checkings.
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.
if (!$uses_autoheader)
{
verbose "$configure_ac: not using Autoheader";
}
else
{
xsystem ($autoheader);
}
}
## ------ ##
## Main. ##
## ------ ##
# When debugging, it is convenient that all the related temporary
# files be at the same place.
mktmpdir ('ah');
$ENV{'TMPDIR'} = $tmp;
parse_args;
find (\&maybe_autoreconf, '.');