automake-patches
[Top][All Lists]
Advanced

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

FYI: fix for PR/371 and PR/372


From: Alexandre Duret-Lutz
Subject: FYI: fix for PR/371 and PR/372
Date: Fri, 29 Nov 2002 18:47:55 +0100
User-agent: Gnus/5.090008 (Oort Gnus v0.08) Emacs/20.7 (i386-debian-linux-gnu)

I'm checking this in (HEAD & branch-1-7).

2002-11-29  Alexandre Duret-Lutz  <address@hidden>

        For PR automake/371 and PR automake/372:
        * automake.in (rule_define): Honor inference rules with multiple
        targets, and warn when they are used.
        * tests/suffix11.test: New file.
        * tests/Makefile.am (TESTS): Add suffix11.test.
        Reported by Duncan Gibson.

Index: THANKS
===================================================================
RCS file: /cvs/automake/automake/THANKS,v
retrieving revision 1.186.2.7
diff -u -r1.186.2.7 THANKS
--- THANKS      7 Nov 2002 10:50:34 -0000       1.186.2.7
+++ THANKS      29 Nov 2002 17:41:31 -0000
@@ -47,6 +47,7 @@
 Dieter Baron           address@hidden
 Dmitry Mikhin          address@hidden
 Doug Evans             address@hidden
+Duncan Gibson          address@hidden
 Eleftherios Gkioulekas address@hidden
 Elrond                 address@hidden
 Enrico Scholz          address@hidden
Index: automake.in
===================================================================
RCS file: /cvs/automake/automake/automake.in,v
retrieving revision 1.1365.2.12
diff -u -r1.1365.2.12 automake.in
--- automake.in 28 Nov 2002 21:02:50 -0000      1.1365.2.12
+++ automake.in 29 Nov 2002 17:41:56 -0000
@@ -7712,18 +7712,35 @@
       $target_name{$target}{$c} = $realtarget;
     }
 
-  # Check the rule for being a suffix rule. If so, store in a hash.
-  # Either it's a rule for two known extensions...
-  if ($target =~ /^($KNOWN_EXTENSIONS_PATTERN)($KNOWN_EXTENSIONS_PATTERN)$/
-      # ...or it's a rule with unknown extensions (.i.e, the rule looks like
-      # `.foo.bar:' but `.foo' or `.bar' are not declared in SUFFIXES
-      # and are not known language extensions).
-      # Automake will complete SUFFIXES from @suffixes automatically
-      # (see handle_footer).
-      || ($target =~ /$SUFFIX_RULE_PATTERN/o && accept_extensions($1)))
+  # We honor inference rules with multiple targets because many
+  # make support this and people use it.  However this is disallowed
+  # by POSIX.  We'll print a warning later.
+  my $target_count = 0;
+  my $inference_rule_count = 0;
+  for my $t (split (' ', $target))
     {
-      register_suffix_rule ($where, $1, $2);
+      ++$target_count;
+      # Check the rule for being a suffix rule. If so, store in a hash.
+      # Either it's a rule for two known extensions...
+      if ($t =~ /^($KNOWN_EXTENSIONS_PATTERN)($KNOWN_EXTENSIONS_PATTERN)$/
+         # ...or it's a rule with unknown extensions (.i.e, the rule
+         # looks like `.foo.bar:' but `.foo' or `.bar' are not
+         # declared in SUFFIXES and are not known language
+         # extensions).  Automake will complete SUFFIXES from
+         # @suffixes automatically (see handle_footer).
+         || ($t =~ /$SUFFIX_RULE_PATTERN/o && accept_extensions($1)))
+       {
+         ++$inference_rule_count;
+         register_suffix_rule ($where, $1, $2);
+       }
     }
+
+  # POSIX allow multiple targets befor the colon, but disallow
+  # definitions of multiple Inference rules.  It's also
+  # disallowed to mix plain targets with inference rules.
+  msg ('portability', $where,
+       "Inference rules can have only one target before the colon (POSIX).")
+    if $inference_rule_count > 0 && $target_count > 1;
 
   # Return "" instead of TRUE so it can be used with make_paragraphs
   # directly.
Index: tests/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.am,v
retrieving revision 1.443.2.6
diff -u -r1.443.2.6 Makefile.am
--- tests/Makefile.am   13 Nov 2002 11:12:44 -0000      1.443.2.6
+++ tests/Makefile.am   29 Nov 2002 17:41:57 -0000
@@ -387,6 +387,7 @@
 suffix8.test \
 suffix9.test \
 suffix10.test \
+suffix11.test \
 symlink.test \
 symlink2.test \
 symlink3.test \
Index: tests/suffix11.test
===================================================================
RCS file: tests/suffix11.test
diff -N tests/suffix11.test
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/suffix11.test 29 Nov 2002 17:41:59 -0000
@@ -0,0 +1,63 @@
+#! /bin/sh
+# Copyright (C) 2002  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 autoconf; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Tests that Automake understand multiple suffix rules on the same line.
+# PR/371 and PR/372: Reported by Duncan Gibson.
+
+. ./defs || exit 1
+
+set -e
+
+cat >>configure.in <<EOF
+AC_PROG_CC
+AC_OUTPUT
+EOF
+
+cat >Makefile.am << 'END'
+bin_PROGRAMS = foo bar baz
+foo_SOURCES = foo.x_
+bar_SOURCES = bar.y_
+baz_SOURCES = baz1.x_ baz2.y_
+.y_.c .x_.c:
+       cp $< $@
+  .z_.c   .w_.x_ :
+       cp $< $@
+
+
+print:
+       @echo BEGIN: $(foo_OBJECTS) :END
+       @echo BEGIN: $(bar_OBJECTS) :END
+       @echo BEGIN: $(baz_OBJECTS) :END
+END
+
+$ACLOCAL
+$AUTOCONF
+# What we do is not portable.  Automake should warn.
+$AUTOMAKE -a 2>stderr && exit 1
+cat stderr
+grep 'Inference rules can have only one target before the colon' stderr
+# But this should work anyway.
+$AUTOMAKE -a -Wno-portability
+./configure
+env OBJEXT=foo $MAKE -e SHELL=/bin/sh print >stdout
+cat stdout
+grep 'BEGIN: foo.foo :END' stdout
+grep 'BEGIN: bar.foo :END' stdout
+grep 'BEGIN: baz1.foo baz2.foo :END' stdout

-- 
Alexandre Duret-Lutz





reply via email to

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