return 1;
}
+# extract_time_stamp ($fname)
+# ---------------------------
+# Extract a timestamp line from $fname.
+# This is hardwired to know what to look for in the files we currently install.
+sub extract_time_stamp
+{
+ my $fname = shift;
+ open my $fh, '<', $fname
+ or fatal "opening $fname: $!";
+ while (my $l = <$fh>)
+ {
+ if ($l =~ /^(?:scriptversion|timestamp)='?(\d\d\d\d-\d\d-\d\d(?:\.\d\d)?)/)
+ {
+ return $1;
+ }
+ }
+ fatal "no timestamp line found in $fname";
+}
+
+# our_aux_file_is_newer ($dest, $src)
+# -----------------------------------
+# True if our copy of an aux file ($src) has a newer 'timestamp' line
+# than the matching line in $dest.
+sub our_aux_file_is_newer
+{
+ my ($dest, $src) = @_;
+ my $dstamp = extract_time_stamp ($dest);
+ my $sstamp = extract_time_stamp ($src);
+ return $sstamp gt $dstamp;
+}
+
# try_install_aux_files
# ---------------------
# Install each of the aux files listed in @$auxfiles, that we are able
{
my ($destdir, $f, $src) = @_;
my $dest = "${destdir}/$f";
+ if (-e $dest && ! our_aux_file_is_newer ($dest, $src))
+ {
+ return;
+ }
+
if ($symlink)
{
if ($force || ! -l $dest || readlink $dest != $src)
if (-e $dest)
{
unlink $dest
- or fatal "rm -f $dest: $!\n";
+ or fatal "rm -f $dest: $!";
}
verb "linking $dest to $src";
symlink $src, $dest
- or fatal "ln -s $src $dest: $!\n";
+ or fatal "ln -s $src $dest: $!";
}
}
else
if (-e $dest && ! -f $dest)
{
unlink $dest
- or fatal "rm -f $dest: $!\n";
+ or fatal "rm -f $dest: $!";
}
my ($temp, $tempname) = tempfile (UNLINK => 0, DIR => $destdir);
copy ($src, $tempname)
- or fatal "copying $src to $tempname: $!\n";
+ or fatal "copying $src to $tempname: $!";
make_executable ($tempname) if -x $src;
update_file ($tempname, $dest, $force);
}
$perm |= 0010 if ($perm & 0040);
$perm |= 0001 if ($perm & 0004);
chmod $perm, $f
- or fatal "chmod $f: $!\n";
+ or fatal "chmod $f: $!";
}
# ---------------------------------------------------- #
# Installing aux files and checking for missing ones. #
# ---------------------------------------------------- #
+ try_install_aux_files (\@aux_files, $aux_dir || '.')
+ if $install && $force;
+
my @missing_aux_files = find_missing_aux_files (\@aux_files, $aux_dir);
if (@missing_aux_files)
{
- try_install_aux_files (\@missing_aux_files, $aux_dir || '.') if $install;
+ try_install_aux_files (\@missing_aux_files, $aux_dir || '.')
+ if $install && !$force;
for (0 .. $#missing_aux_files)
{
AT_CHECK([autoreconf])
AT_CHECK_CONFIGURE
+AT_CLEANUP
+
+
+AT_SETUP([Missing auxiliary files (--force)])
+AT_KEYWORDS([autoreconf])
+
+# Aux files that already exist should not be overwritten, unless
+# --force is used, in which case they *should* be overwritten.
+# Additional wrinkle: in case automake got to the files we install
+# first, we need to *not* overwrite a newer copy supplied by them.
+
+# Prevent autoreconf from running aclocal, which might not exist,
+# or could barf over warnings in third-party macro files.
+AT_DATA([aclocal.m4])
+ACLOCAL=true
+export ACLOCAL
+
+AT_DATA([configure.ac],
+[[AC_INIT([GNU foo], [1.0])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CANONICAL_HOST
+AC_OUTPUT
+]])
+
+mkdir build-aux
+
+AT_DATA([build-aux/config.guess.old],
+[[#! /bin/sh
+timestamp='1970-01-01'
+printf '%s\n' 'frobozz-bogon-bogos1'
+]])
+
+AT_DATA([build-aux/config.sub.new],
+[[#! /bin/sh
+timestamp='9999-12-31'
+printf '%s\n' "$*"
+]])
+
+cp build-aux/config.guess.old build-aux/config.guess
+cp build-aux/config.sub.new build-aux/config.sub
+chmod +x build-aux/config.sub build-aux/config.guess
+
+# This pass should not change either file.
+AT_CHECK([autoreconf --install])
+AT_CMP([build-aux/config.guess.old], [build-aux/config.guess])
+AT_CMP([build-aux/config.sub.new], [build-aux/config.sub])
+
+# This pass should change only config.guess, not config.sub.
+AT_CHECK([autoreconf --install --force])
+AT_CHECK(
+ [if cmp build-aux/config.guess.old build-aux/config.guess > /dev/null 2>&1
+ then exit 1
+ fi])
+AT_CMP([build-aux/config.sub.new], [build-aux/config.sub])
+
+
AT_CLEANUP
## ------------------------------ ##