mirror of
git://git.sv.gnu.org/autoconf
synced 2024-12-15 02:20:10 +08:00
9edd82d2ee
name, so that symlinks to 'autoconf' work properly. Bug reported by Bruno Haible. * bin/autoheader.in (AUTOM4TE): Likewise. * bin/autoreconf.in (autoconf, autoheader): Likewise. * bin/autoscan.in (autom4te): Likewise. * bin/autoupdate.in (autom4te): Likewise.
496 lines
13 KiB
Perl
496 lines
13 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', `autopoint'
|
|
(formerly `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,
|
|
AUTOPOINT, 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'} || '@bindir@/@autoconf-name@';
|
|
my $autoheader = $ENV{'AUTOHEADER'} || '@bindir@/@autoheader-name@';
|
|
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;
|
|
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 ("$autopoint --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;
|
|
$libtoolize .= ' --copy' unless $symlink;
|
|
}
|
|
# --force;
|
|
if ($force)
|
|
{
|
|
$autoconf .= ' --force';
|
|
$autoheader .= ' --force';
|
|
$automake .= ' --force-missing';
|
|
$autopoint .= ' --force';
|
|
$libtoolize .= ' --force';
|
|
}
|
|
else
|
|
{
|
|
$automake .= ' --no-force';
|
|
}
|
|
# --debug;
|
|
if ($debug)
|
|
{
|
|
$autoconf .= ' --verbose --debug';
|
|
$autoheader .= ' --verbose --debug';
|
|
$automake .= ' --verbose';
|
|
$aclocal .= ' --verbose';
|
|
$libtoolize .= ' --debug';
|
|
}
|
|
}
|
|
|
|
|
|
# &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
|
|
{
|
|
# Some filesystems 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;
|
|
|
|
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_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 $uses_gettext;
|
|
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/;
|
|
$uses_gettext = 1 if /AM_GNU_GETTEXT/;
|
|
$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 autopoint. #
|
|
# ------------------- #
|
|
|
|
if (!$uses_gettext)
|
|
{
|
|
verbose "$configure_ac: not using Gettext";
|
|
}
|
|
elsif (!$install)
|
|
{
|
|
verbose "$configure_ac: not running autopoint: --install not given";
|
|
}
|
|
else
|
|
{
|
|
xsystem "$autopoint";
|
|
$rerun_aclocal = 1;
|
|
}
|
|
|
|
|
|
# -------------------- #
|
|
# Running libtoolize. #
|
|
# -------------------- #
|
|
|
|
if (!$uses_libtool)
|
|
{
|
|
verbose "$configure_ac: not using Libtool";
|
|
}
|
|
elsif ($install)
|
|
{
|
|
xsystem ($libtoolize);
|
|
$rerun_aclocal = 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_aclocal)
|
|
{
|
|
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 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 ($aclocal_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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
# ------------------ #
|
|
# 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);
|