autoconf/bin/autoreconf.in
Akim Demaille 7928c2ab02 * bin/autoreconf.in (autoreconf): Don't let aclocal.m4 be older
than some of the input files, hence, on the second run of aclocal,
if some of its input are younger, make them older.
Suggested by Paul Eggert.
2002-04-25 10:28:01 +00:00

561 lines
14 KiB
Perl

#! @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.
# 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 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";
}
}
# -------------------- #
# 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.
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 a 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
# gettextize 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 younger, so it triggers aclocal again.
#
# To make sure aclocal.m4 is younger, we change the
# modification times of the local M4 files to be
# slightly older than it.
#
# First, where are the local files?
my $aclocal_local_dir = '.';
if ($aclocal_flags =~ /-I\s+(\S+)/)
{
$aclocal_local_dir = $1;
}
# All the local files younger than aclocal.m4 are to be
# grown older than it.
my $aclocal_m4_mtime = mtime ('aclocal.m4');
for my $file (glob ("$aclocal_local_dir/*.m4"), 'acinclude.m4')
{
if (mtime ($file) >= $aclocal_m4_mtime)
{
debug "making $file younger than aclocal.m4";
utime $aclocal_m4_mtime - 1, $aclocal_m4_mtime - 1,
$file;
}
}
}
}
}
# ------------------ #
# 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)
{
verbose "$configure_ac: not using Autoheader";
}
else
{
xsystem ($autoheader);
}
# ------------------ #
# 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);
}
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);