2007-06-24 Benoit Sigoure * automake.in, aclocal.in: New option `--clean'. ($clean, @files_installed): New. * automake.in (&require_conf_file): Save the list of files to be removed in @files_installed. (trace_used_macros): Invoke `autom4te --clean' in clean mode. * aclocal.in (&install_file, &write_aclocal): Likewise. * NEWS: Mention the new option. * configure.ac: Define am_AUTOM4TE like am_AUTOCONF. * tests/Makefile.am: Add the new test. * tests/defs.in: Set $AUTOM4TE. * tests/unbootstrap.test: New. Test the new --clean feature as well as combination of --clean and --dry-run. * doc/automake.texi: Mention the new options of automake and aclocal. Index: Makefile.in =================================================================== RCS file: /sources/automake/automake/Makefile.in,v retrieving revision 1.539 diff -u -r1.539 Makefile.in --- Makefile.in 28 Mar 2007 22:27:13 -0000 1.539 +++ Makefile.in 24 Jun 2007 22:15:52 -0000 @@ -124,6 +124,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: NEWS =================================================================== RCS file: /sources/automake/automake/NEWS,v retrieving revision 1.327 diff -u -r1.327 NEWS --- NEWS 23 Jun 2007 08:30:46 -0000 1.327 +++ NEWS 24 Jun 2007 22:15:53 -0000 @@ -21,6 +21,9 @@ - install-sh supports -C, which does not update the installed file (and its time stamps) if the contents did not change. + - automake and aclocal support a new `--clean' option that undoes the job + done by `--add-missing'. + Bugs fixed in 1.10a: * Long standing bugs: Index: aclocal.in =================================================================== RCS file: /sources/automake/automake/aclocal.in,v retrieving revision 1.141 diff -u -r1.141 aclocal.in --- aclocal.in 23 Jun 2007 08:30:46 -0000 1.141 +++ aclocal.in 24 Jun 2007 22:15:53 -0000 @@ -8,7 +8,7 @@ # aclocal - create aclocal.m4 by scanning configure.ac # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005, 2006 Free Software Foundation, Inc. +# 2005, 2006, 2007 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 @@ -77,6 +77,12 @@ # Option --force. my $force_output = 0; +# Option --clean. +my $clean = 0; + +# Files to remove with --clean. +my @files_installed; + # Modification time of the youngest dependency. my $greatest_mtime = 0; @@ -248,6 +254,11 @@ if $res; unlink_tmp; } + elsif ($clean) + { + # Remember that we must remove this file once we're finished. + push (@files_installed, $dest); + } elsif (!$dry_run) { xsystem ('cp', $src, $dest); @@ -686,6 +697,7 @@ } $tracefh->close; + xsystem ("$traces --clean $configure_ac") if $clean and not $dry_run; return %traced; } @@ -773,6 +785,14 @@ return 0; } + # We are now about to output `$output_file'. If we're in clean mode, we + # shall just stop here. + if ($clean) + { + push (@files_installed, $output_file); + return 1; + } + # Nothing to output?! # FIXME: Shouldn't we diagnose this? return 1 if ! length ($output); @@ -858,6 +878,7 @@ Options: --acdir=DIR directory holding config files (for debugging) + --clean remove files installed by aclocal --diff[=COMMAND] run COMMAND [diff -u] on M4 files that would be changed (implies --install and --dry-run) --dry-run pretend to, but do not actually update any file @@ -916,6 +937,7 @@ 'diff:s' => \$diff_command, 'dry-run' => \$dry_run, 'force' => \$force_output, + 'clean' => \$clean, 'I=s' => address@hidden, 'install' => \$install, 'output=s' => \$output_file, @@ -987,6 +1009,11 @@ $dry_run = 1; } + if ($clean && $install) + { + fatal 'Cannot install and clean at the same time'; + } + if ($install && address@hidden) { fatal ("--install should copy macros in the directory indicated by the" @@ -1051,7 +1078,27 @@ last if write_aclocal ($output_file, keys %macro_traced); last if $dry_run; } -check_acinclude; +check_acinclude unless $clean; + +if ($clean) + { + if ($dry_run) + { + foreach my $cleanfile (@files_installed) + { + print "rm -f $cleanfile\n" + unless not -e $cleanfile; + } + } + else + { + foreach my $cleanfile (@files_installed) + { + unlink $cleanfile or fatal "Failed to remove `$cleanfile': $!" + unless not -e $cleanfile; + } + } + } exit $exit_code; Index: automake.in =================================================================== RCS file: /sources/automake/automake/automake.in,v retrieving revision 1.1645 diff -u -r1.1645 automake.in --- automake.in 3 May 2007 17:57:41 -0000 1.1645 +++ automake.in 24 Jun 2007 22:15:55 -0000 @@ -291,6 +291,12 @@ # TRUE if we should copy missing files; otherwise symlink if possible. my $copy_missing = 0; +# TRUE if we shoud remove files that would otherwise be installed (--clean). +my $clean = 0; + +# List of files to be removed when we're finished (--clean). +my @files_installed; + # TRUE if we should always update files that we know about. my $force_missing = 0; @@ -3894,7 +3900,7 @@ { msg ('error', $ac_config_files_location{$file}, "required file `$i' not found") - unless $i =~ /\$/ || exists $output_files{$i} || -f $i; + unless $i =~ /\$/ || exists $output_files{$i} || -f $i || $clean; ($i) = prepend_srcdir ($i); push_dist_common ($i); } @@ -7296,6 +7302,7 @@ $macro = rvar ($macro) unless ref $macro; if ($config_libobj_dir) { + # FIXME: Do we need to put @files in @files_installed when --clean? require_file_internal ($macro->rdef ($cond)->location, $mystrict, $config_libobj_dir, @files); } @@ -7312,6 +7319,7 @@ { my ($where, $mystrict, @files) = @_; require_file_internal ($where, $mystrict, $config_aux_dir, @files); + push (@files_installed, map { $_ = $config_aux_dir . '/' . $_ } @files); } @@ -7532,10 +7540,17 @@ # defined or overridden variables. $output_vars .= output_variables; - check_typos; - my ($out_file) = $output_directory . '/' . $makefile_in; + if ($clean && -e $out_file) + { + unlink ($out_file) + or fatal "cannot remove $out_file: $!\n"; + return; + } + + check_typos; + if ($exit_code != 0) { verb "not writing $out_file because of earlier errors"; @@ -7604,6 +7619,7 @@ --help print this help, then exit --version print version number, then exit -v, --verbose verbosely list files processed + --clean remove files installed by automake --no-force only update Makefile.in's that are out of date -W, --warnings=CATEGORY report the warnings falling in CATEGORY @@ -7721,6 +7737,7 @@ 'o|output-dir=s' => \$output_directory, 'a|add-missing' => \$add_missing, 'c|copy' => \$copy_missing, + 'clean' => \$clean, 'v|verbose' => sub { setup_channel 'verb', silent => 0; }, 'W|warnings=s' => \&parse_warnings, # These long options (--Werror and --Wno-error) for backward @@ -7764,6 +7781,8 @@ # In the next release we'll remove this entirely. $output_directory = '.'; } + msg 'fatal', "Cannot install missing files and clean at the same time\n" + if $add_missing and $clean; return unless @ARGV; @@ -7860,6 +7879,15 @@ } } +if ($clean) + { + foreach my $cleanfile (@files_installed) + { + unlink $cleanfile or fatal "Failed to remove `$cleanfile': $!" + unless not -e $cleanfile; + } + } + exit $exit_code; Index: configure.ac =================================================================== RCS file: /sources/automake/automake/configure.ac,v retrieving revision 1.34 diff -u -r1.34 configure.ac --- configure.ac 15 Oct 2006 19:21:49 -0000 1.34 +++ configure.ac 24 Jun 2007 22:15:57 -0000 @@ -31,6 +31,8 @@ # way we can run Autoconf tests from configure (or from the test # suite) without being bothered by `missing'. AC_SUBST([am_AUTOCONF], ["${AUTOCONF-autoconf}"]) +# Likewise for autom4te. +AC_SUBST([am_AUTOM4TE], ["${AUTOM4TE-autom4te}"]) AM_INIT_AUTOMAKE([1.8a dist-bzip2 filename-length-max=99]) Index: doc/Makefile.in =================================================================== RCS file: /sources/automake/automake/doc/Makefile.in,v retrieving revision 1.66 diff -u -r1.66 Makefile.in --- doc/Makefile.in 28 Mar 2007 22:27:14 -0000 1.66 +++ doc/Makefile.in 24 Jun 2007 22:15:57 -0000 @@ -122,6 +122,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: doc/automake.texi =================================================================== RCS file: /sources/automake/automake/doc/automake.texi,v retrieving revision 1.167 diff -u -r1.167 automake.texi --- doc/automake.texi 3 May 2007 17:57:41 -0000 1.167 +++ doc/automake.texi 24 Jun 2007 22:16:02 -0000 @@ -2383,6 +2383,10 @@ When used with @option{--add-missing}, causes installed files to be copied. The default is to make a symbolic link. address@hidden --clean address@hidden --clean +Remove the files that would be installed by @option{--add-missing}. + @item --cygnus @opindex --cygnus Causes the generated @file{Makefile.in}s to follow Cygnus rules, instead @@ -2949,6 +2953,10 @@ Look for the macro files in @var{dir} instead of the installation directory. This is typically used for debugging. address@hidden --clean address@hidden --clean +Remove the files that would otherwise be installed. + @item address@hidden @opindex --diff Run @var{command} on M4 file that would be installed or overwritten Index: lib/Makefile.in =================================================================== RCS file: /sources/automake/automake/lib/Makefile.in,v retrieving revision 1.138 diff -u -r1.138 Makefile.in --- lib/Makefile.in 28 Mar 2007 22:27:14 -0000 1.138 +++ lib/Makefile.in 24 Jun 2007 22:16:02 -0000 @@ -121,6 +121,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: lib/Automake/Makefile.in =================================================================== RCS file: /sources/automake/automake/lib/Automake/Makefile.in,v retrieving revision 1.149 diff -u -r1.149 Makefile.in --- lib/Automake/Makefile.in 28 Mar 2007 22:27:14 -0000 1.149 +++ lib/Automake/Makefile.in 24 Jun 2007 22:16:02 -0000 @@ -118,6 +118,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: lib/Automake/tests/Makefile.in =================================================================== RCS file: /sources/automake/automake/lib/Automake/tests/Makefile.in,v retrieving revision 1.80 diff -u -r1.80 Makefile.in --- lib/Automake/tests/Makefile.in 28 Mar 2007 22:27:14 -0000 1.80 +++ lib/Automake/tests/Makefile.in 24 Jun 2007 22:16:02 -0000 @@ -94,6 +94,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: lib/am/Makefile.in =================================================================== RCS file: /sources/automake/automake/lib/am/Makefile.in,v retrieving revision 1.124 diff -u -r1.124 Makefile.in --- lib/am/Makefile.in 28 Mar 2007 22:27:14 -0000 1.124 +++ lib/am/Makefile.in 24 Jun 2007 22:16:02 -0000 @@ -105,6 +105,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: m4/Makefile.in =================================================================== RCS file: /sources/automake/automake/m4/Makefile.in,v retrieving revision 1.285 diff -u -r1.285 Makefile.in --- m4/Makefile.in 28 Mar 2007 22:27:14 -0000 1.285 +++ m4/Makefile.in 24 Jun 2007 22:16:02 -0000 @@ -105,6 +105,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ Index: tests/Makefile.am =================================================================== RCS file: /sources/automake/automake/tests/Makefile.am,v retrieving revision 1.621 diff -u -r1.621 Makefile.am --- tests/Makefile.am 29 Mar 2007 23:26:48 -0000 1.621 +++ tests/Makefile.am 24 Jun 2007 22:16:02 -0000 @@ -583,6 +583,7 @@ txinfo30.test \ txinfo31.test \ transform.test \ +unbootstrap.test \ unused.test \ upc.test \ upc2.test \ Index: tests/Makefile.in =================================================================== RCS file: /sources/automake/automake/tests/Makefile.in,v retrieving revision 1.809 diff -u -r1.809 Makefile.in --- tests/Makefile.in 29 Mar 2007 23:26:48 -0000 1.809 +++ tests/Makefile.in 24 Jun 2007 22:16:03 -0000 @@ -95,6 +95,7 @@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ am_AUTOCONF = @am_AUTOCONF@ +am_AUTOM4TE = @am_AUTOM4TE@ am__leading_dot = @am__leading_dot@ am__tar = @am__tar@ am__untar = @am__untar@ @@ -716,6 +717,7 @@ txinfo30.test \ txinfo31.test \ transform.test \ +unbootstrap.test \ unused.test \ upc.test \ upc2.test \ Index: tests/defs.in =================================================================== RCS file: /sources/automake/automake/tests/defs.in,v retrieving revision 1.42 diff -u -r1.42 defs.in --- tests/defs.in 10 Jan 2007 17:57:24 -0000 1.42 +++ tests/defs.in 24 Jun 2007 22:16:03 -0000 @@ -73,6 +73,7 @@ test -z "$PERL" && PERL='@PERL@' test -z "$MAKE" && MAKE=make test -z "$AUTOCONF" && AUTOCONF="@am_AUTOCONF@" +test -z "$AUTOM4TE" && AUTOM4TE="@am_AUTOM4TE@" test -z "$AUTOHEADER" && AUTOHEADER="@AUTOHEADER@" test -z "$AUTOUPDATE" && AUTOUPDATE=autoupdate test -z "$MISSING" && MISSING=`pwd`/../lib/missing Index: tests/unbootstrap.test =================================================================== --- /dev/null 2007-06-25 00:15:07.000000000 +0200 +++ tests/unbootstrap.test 2007-06-23 16:36:16.000000000 +0200 @@ -0,0 +1,71 @@ +#! /bin/sh +# Copyright (C) 2007 Free Software Foundation, Inc. +# +# This file is part of GNU Automake. +# +# GNU Automake 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. +# +# GNU Automake 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 Automake; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +# Test that automake and aclocal --clean remove all the files installed +# by --add-missing. + +. ./defs || exit 1 + +# We can't always diff with `/dev/null' (DU 5.0 refuses). +touch testdiff$$ +# Use `diff -u' when possible. +if at_diff=`diff -u "testdiff$$" "testdiff$$" 2>&1` && test -z "$at_diff" +then + at_diff='diff -u' +else + at_diff=diff +fi +rm -f testdiff$$ + +# We need a version of autom4te that has --clean. +$AUTOM4TE --help | grep ' --clean' >/dev/null || exit 77 + +# We need to run this test in a clean subdir. +test -e chiche && rm -rf chiche +set -e + +# Run the test in a subdir. +mkdir chiche +cd chiche + +cat >configure.ac << 'END' +AC_INIT([unbootstrap], [1.0]) +AM_INIT_AUTOMAKE +AC_CONFIG_FILES([Makefile]) +END +: >Makefile.am + +# Create files so that they are listed in list.before +touch list.after list.during +find . | sort >list.before +$ACLOCAL +$AUTOMAKE --add-missing + +find . | sort >list.during +$ACLOCAL --clean --dry-run +find . | sort >list.after +$at_diff list.during list.after + +$AUTOMAKE --clean +$ACLOCAL --clean + +find . | sort >list.after + +$at_diff list.before list.after