On second though I'm less happy the "global" empty file. The reason is that we can use --diff='diff -u' or any other tools that shows the filename in its output, and such a global file would look weird.
It occurred to me that there is a simpler approach that does not require any configury magic, and no new command lines options. Create an empty file like Ralf did in his first patch, but do that on any architecture, and use the actual destination file name instead of some hard-coded one. I believe that doing so should make sense to any kind of tool one might want to use with --diff=xxx. I'm checking this in. 2006-08-04 Alexandre Duret-Lutz <[EMAIL PROTECTED]> * aclocal.in (install_file): Cannot use /dev/null while diffing new files, because Tru64's diff do not handle /dev/null. So create an empty destination file before running diff on a new file, and erase it afterward. Fall back to using /dev/null only if we cannot create this file. Report and initial patch from Ralf Wildenhues. (unlink_tmp): New function. * test/acloca18.test: Make sure the empty file has been erased. Index: aclocal.in =================================================================== RCS file: /cvs/automake/automake/aclocal.in,v retrieving revision 1.138 diff -u -r1.138 aclocal.in --- aclocal.in 21 Apr 2006 19:02:29 -0000 1.138 +++ aclocal.in 4 Aug 2006 08:42:18 -0000 @@ -144,9 +144,25 @@ # Autoconf version # Set by trace_used_macros. my $ac_version; + +# If set, names a temporary file that must be erased on abnormal exit. +my $erase_me; ################################################################ +# Erase temporary file ERASE_ME. +sub unlink_tmp +{ + if (defined $erase_me && -e $erase_me && !unlink ($erase_me)) + { + fatal "could not remove `$erase_me': $!"; + } + undef $erase_me; +} + +$SIG{'INT'} = $SIG{'TERM'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'unlink_tmp'; +END { unlink_tmp } + # Check macros in acinclude.m4. If one is not used, warn. sub check_acinclude () { @@ -180,7 +196,7 @@ sub install_file ($$) { my ($src, $dest) = @_; - my $diff_dest = $dest; + my $diff_dest; if ($force_output || !exists $file_contents{$dest} @@ -189,21 +205,48 @@ if (-e $dest) { msg 'note', "overwriting `$dest' with `$src'"; + $diff_dest = $dest; } else { msg 'note', "installing `$dest' from `$src'"; - $diff_dest = '/dev/null'; } if (@diff_command) { + if (! defined $diff_dest) + { + # $dest does not exist. We create an empty one just to + # run diff, and we erase it afterward. Using the real + # the destination file (rather than a temporary file) is + # good when diff is run with options that display the + # file name. + # + # If creating $dest fails, fall back to /dev/null. At + # least one diff implementation (Tru64's) cannot deal + # with /dev/null. However working around this is not + # worth the trouble since nobody run aclocal on a + # read-only tree anyway. + $erase_me = $dest; + my $f = new IO::File "> $dest"; + if (! defined $f) + { + undef $erase_me; + $diff_dest = '/dev/null'; + } + else + { + $diff_dest = $dest; + $f->close; + } + } my @cmd = (@diff_command, $diff_dest, $src); $! = 0; verb "running: @cmd"; my $res = system (@cmd); Automake::FileUtils::handle_exec_errors "@cmd", 1 if $res; + unlink_tmp; } elsif (!$dry_run) { Index: tests/acloca18.test =================================================================== RCS file: /cvs/automake/automake/tests/acloca18.test,v retrieving revision 1.3 diff -u -r1.3 acloca18.test --- tests/acloca18.test 14 May 2005 20:28:53 -0000 1.3 +++ tests/acloca18.test 4 Aug 2006 08:42:18 -0000 @@ -1,5 +1,5 @@ #! /bin/sh -# Copyright (C) 2005 Free Software Foundation, Inc. +# Copyright (C) 2005, 2006 Free Software Foundation, Inc. # # This file is part of GNU Automake. # @@ -109,6 +109,9 @@ AC_DEFUN([AM_MACRO2], [echo macro2d >> foo]) EOF rm -f foo -$ACLOCAL --diff=diff >output +$ACLOCAL --diff=diff >output 2>stderr +cat stderr cat output grep '#serial 456' output +test ! -f 4/m1.m4 +grep 'installing.*4/m1.m4' stderr -- Alexandre Duret-Lutz Shared books are happy books. http://www.bookcrossing.com/friend/gadl