autoconf/bin/autoreconf.in

513 lines
13 KiB
Plaintext
Raw Normal View History

#! @PERL@ -w
# -*- perl -*-
# @configure_input@
eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
if 0;
# autoreconf - install the GNU Build System in a directory tree
# Copyright (C) 1994, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
1994-04-30 09:42:39 +08:00
# 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
1996-06-13 01:55:25 +08:00
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
# 02111-1307, USA.
1994-04-30 09:42:39 +08:00
# 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 Cwd 'chdir', 'cwd';
use strict;
## ----------- ##
## Variables. ##
## ----------- ##
# $HELP
# -----
$help = "Usage: $0 [OPTION] ... [CONFIGURE-AC or DIRECTORY] ...
Run `autoconf' (and `autoheader', `aclocal', `automake', `gettextize',
and `libtoolize' where appropriate) repeatedly to remake the GNU Build
System files in the DIRECTORIES or the directory trees driven by
CONFIGURE-AC (defaulting to `.').
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
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 2002 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';
# Does gettextize support --no-changelog and --intl?
my $gettextize_intl_p;
my $gettextize_no_changelog_p;
# --install -- as --add-missing in other tools.
my $install = 0;
my @include;
my $status = 0;
# symlink -- when --install, use symlinks instead.
my $symlink = 0;
# The directory where autoreconf was run.
my $cwd = cwd;
## ---------- ##
## 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);
# 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)
{
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';
}
}
# &study_gettextize
# -----------------
# See what options gettextize supports.
sub study_gettextize ()
{
return
if defined $gettextize_no_changelog_p && defined $gettextize_intl_p;
$gettextize_no_changelog_p = 0;
$gettextize_intl_p = 0;
my $usage = new Autom4te::XFile ("$gettextize --help |");
while ($_ = $usage->getline)
{
$gettextize_no_changelog_p = 1 if /--no-changelog/;
$gettextize_intl_p = 1 if /--intl/;
}
$gettextize .= " --no-changelog" if $gettextize_no_changelog_p;
}
# &autoreconf ($DIRECTORY)
# ------------------------
# Reconf the $DIRECTORY.
sub autoreconf ($)
{
my ($directory) = @_;
verbose "working in `$directory'";
chdir $directory
or die "$me: cannot chdir to $directory: $!\n";
my $configure_ac = find_configure_ac;
die "$me: cannot find `configure.ac' in `$directory'\n"
unless $configure_ac;
# ---------------------- #
# Is it using Autoconf? #
# ---------------------- #
my $uses_autoconf;
my $configure_ac_file = new Autom4te::XFile $configure_ac;
while ($_ = $configure_ac_file->getline)
{
if (/AC_INIT/)
{
$uses_autoconf = 1;
last;
}
}
if (!$uses_autoconf)
{
verbose "$configure_ac: not using Autoconf";
return;
}
# ----------------- #
# 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 /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)
{
verbose "$configure_ac: not using aclocal";
}
else
{
xsystem ("$aclocal $aclocal_flags --output=aclocal.m4t");
# aclocal may produce no output.
update_file ('aclocal.m4t', 'aclocal.m4')
if -f 'aclocal.m4t';
}
# We might have to rerun aclocal if Libtool or Gettext import new
# macros.
my $rerun_alocal = 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 $uses_gettext;
# Starting at GNU Gettext 0.11, libintl is optional.
my $uses_libintl;
my $uses_libtool;
my $uses_autoheader;
my @subdir;
my $traces = new Autom4te::XFile
("$autoconf"
. join (' --trace=', '',
'AC_INIT', 'AM_GNU_GETTEXT', 'AC_PROG_LIBTOOL',
'AC_CONFIG_HEADERS',
'AC_CONFIG_SUBDIRS:AC_CONFIG_SUBDIRS:\$1')
. ' |');
while ($_ = $traces->getline)
{
$uses_autoconf = 1 if /AC_INIT/;
if (/AM_GNU_GETTEXT/)
{
$uses_gettext = 1;
$uses_libintl = !/external/;
}
$uses_libtool = 1 if /AC_PROG_LIBTOOL/;
$uses_autoheader = 1 if /AC_CONFIG_HEADERS/;
push @subdir, split (' ', $1) if /AC_CONFIG_SUBDIRS:(.*)/;
}
# The subdirs are *optional*, they may not exist.
foreach (@subdir)
{
if (-d)
{
verbose "$configure_ac: subdirectory $_ to autoreconf";
push @ARGV, catfile ($directory, $_);
}
else
{
verbose "$configure_ac: subdirectory $_ not present";
}
}
# -------------------- #
2002-04-20 14:09:01 +08:00
# Running gettextize. #
# -------------------- #
if (!$uses_gettext)
{
verbose "$configure_ac: not using Gettext";
}
elsif (!$install)
{
verbose "$configure_ac: not running gettextize: --install not given";
}
else
{
# See if gettextize supports --intl and --no-changelog.
study_gettextize;
# Old and new gettext are really different :(
if ($gettextize_intl_p)
{
# Gettext >= 0.11.
if ($uses_libintl)
{
if (-d 'intl' && !$force)
{
verbose ("$configure_ac: not running gettextize: ",
"`intl' is already present");
}
else
{
xsystem "$gettextize --intl";
$rerun_alocal = 1;
}
}
else
{
# Always run modern gettextizes, as they update/import
# several files.
xsystem "$gettextize";
$rerun_alocal = 1;
}
}
else
{
# Gettext < 0.11.
if (-d 'intl' && !$force)
{
verbose ("$configure_ac: not running gettextize: ",
"`intl' is already present");
}
else
{
xsystem "$gettextize --intl";
$rerun_alocal = 1;
}
}
}
# -------------------- #
# Running libtoolize. #
# -------------------- #
if (!$uses_libtool)
{
verbose "$configure_ac: not using Libtool";
}
elsif ($install)
{
xsystem ($libtoolize);
$rerun_alocal = 1;
}
else
{
verbose "$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_alocal)
{
if (!$uses_aclocal)
{
verbose "$configure_ac: not using aclocal";
}
else
{
xsystem ("$aclocal $aclocal_flags --output=aclocal.m4t");
# aclocal may produce no output.
update_file ('aclocal.m4t', 'aclocal.m4')
if -f 'aclocal.m4t';
}
}
# ------------------ #
# 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
2002-04-20 14:09:01 +08:00
# up to date checks.
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);
}
chdir $cwd
or die "$me: cannot chdir to $cwd: $!\n";
}
## ------ ##
## 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. A while loop, not a for,
# since the list can change at runtime because of AC_CONFIG_SUBDIRS.
autoreconf (shift @ARGV)
while (@ARGV);