automake
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: automake manual: distclean


From: Ralf Wildenhues
Subject: Re: automake manual: distclean
Date: Thu, 27 Nov 2008 22:47:56 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

Hello Jan, Andreas,

thanks for the bug report.

* Andreas Schwab wrote on Wed, Nov 26, 2008 at 07:48:32PM CET:
> Jan Engelhardt <address@hidden> writes:
> 
> > This is not quite portable -- unless GNU find, which implies a 
> > path of "." if nothing else is specified, Solaris's explicitly requires 
> > a path to find. It should therefor read
> >
> >      distcleancheck_listfiles = \
> >        find . -type f -exec sh -c 'test -f $(srcdir)/{} || echo {}' ';'
> 
> This isn't quite portable either.  POSIX only requires that find -exec
> substitutes in arguments consisting of exactly {}.

Good points.  The above fails with native 'find' on Solaris 10, HP-UX
11.23, AIX 5.3, Tru64/OSF5.1, IRIX 6.5.  The Posix-conforming

  find . -type f -exec sh -c '
    for arg
    do
      test -f $(srcdir)/$$arg || echo $$arg
    done' sh '{}' +

doesn't work with OpenBSD 4.0, HP-UX 10.20, AIX 4.3.3, Tru64/OSF5.1,
IRIX 6.5, so we have to use the (less efficient but more portable) code
as below.  I've pushed that and added Jan to THANKS, master and
branch-1-10.

Thanks,
Ralf

    Fix portability issues in distcleancheck_listfiles doc example.
    
    * doc/automake.texi (Dist): In the `distcleancheck_listfiles'
    code example, add `.' path, for Solaris `find', also rewrite so
    `{}' appears only once and as separate argument, for Posix.
    * THANKS: Update.
    * tests/distcleancheck.test: New test.
    * tests/Makefile.am: Update.
    Report by Jan Engelhardt and Andreas Schwab.

diff --git a/doc/automake.texi b/doc/automake.texi
index 065e6fa..1190f2e 100644
--- a/doc/automake.texi
+++ b/doc/automake.texi
@@ -8207,7 +8207,8 @@ following definition instead:
 
 @example
 distcleancheck_listfiles = \
-  find -type f -exec sh -c 'test -f $(srcdir)/@address@hidden || echo 
@address@hidden' ';'
+  find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \
+       sh '@address@hidden' ';'
 @end example
 
 The above definition is not the default because it's usually an error if
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2a8e847..cac16a1 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -228,6 +228,7 @@ dirforbid.test \
 dirlist.test \
 dirlist2.test \
 discover.test \
+distcleancheck.test \
 distcom2.test \
 distcom3.test \
 distcom4.test \
diff --git a/tests/distcleancheck.test b/tests/distcleancheck.test
new file mode 100755
index 0000000..5f66a12
--- /dev/null
+++ b/tests/distcleancheck.test
@@ -0,0 +1,66 @@
+#! /bin/sh
+# Copyright (C) 2008  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 3, 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, see <http://www.gnu.org/licenses/>.
+
+# Make sure the suggested `distcleancheck_listfiles' in the manual works.
+# The example Makefile.am we use is from the FAQ entry `distcleancheck'.
+
+. ./defs || Exit 1
+
+set -e
+
+cat >>configure.in << 'END'
+AC_PROG_CC
+AC_OUTPUT
+END
+
+cat > Makefile.am << 'END'
+# This Makefile.am is bogus.  See @node{distcleancheck} in the manual
+# for how to fix it properly.
+bin_PROGRAMS = foo
+foo_SOURCES = foo.c
+dist_man_MANS = foo.1
+
+foo.1: foo$(EXEEXT)
+       echo man page for foo$(EXEEXT) > foo.1
+
+## Ignore warnings about overridden variables
+AUTOMAKE_OPTIONS = -Wno-override
+distcleancheck_listfiles = \
+  find . -type f -exec sh -c 'test -f $(srcdir)/$$1 || echo $$1' \
+       sh '{}' ';'
+END
+
+cat >foo.c <<'END'
+int main () { return 0; }
+END
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+
+./configure
+$MAKE
+$MAKE distcheck
+
+# Now ensure that we really needed the override.
+sed '/distcleancheck_listfiles/,$d' Makefile.am > t
+mv -f t Makefile.am
+$AUTOMAKE
+./configure
+$MAKE
+$MAKE -e distcheck && Exit 1
+
+:




reply via email to

[Prev in Thread] Current Thread [Next in Thread]