- Fix Savannah bug #24622
authorPaul Smith <psmith@gnu.org>
Sun, 7 Jun 2009 18:16:15 +0000 (18:16 +0000)
committerPaul Smith <psmith@gnu.org>
Sun, 7 Jun 2009 18:16:15 +0000 (18:16 +0000)
ChangeLog
file.c
tests/ChangeLog
tests/scripts/features/se_explicit

index 487b2d3..7c8e87a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2009-06-07  Paul Smith  <psmith@gnu.org>
 
+       * file.c (snap_deps): Set SNAPPED_DEPS at the start of snapping,
+       not the end, to catch second expansion $(eval ...) defining new
+       target/prereq relationships during snap_deps.
+       Fixes Savannah bug #24622.
+
        * read.c (record_files): The second-expansion "f->updating" hack
        was not completely correct: if assumed that the target with
        commands always had prerequisites; if one didn't then the ordering
diff --git a/file.c b/file.c
index 0efd51e..95e3788 100644 (file)
--- a/file.c
+++ b/file.c
@@ -638,6 +638,10 @@ snap_deps (void)
   struct file **file_slot;
   struct file **file_end;
 
+  /* Remember that we've done this.  Once we start snapping deps we can no
+     longer define new targets.  */
+  snapped_deps = 1;
+
   /* Perform second expansion and enter each dependency name as a file. */
 
   /* Expand .SUFFIXES first; it's dependencies are used for $$* calculation. */
@@ -737,10 +741,6 @@ snap_deps (void)
     define_variable (STRING_SIZE_TUPLE("OUTPUT_OPTION"), "", o_default, 1);
   */
 #endif
-
-  /* Remember that we've done this.  Once done we can no longer define
-     new targets.  */
-  snapped_deps = 1;
 }
 \f
 /* Set the `command_state' member of FILE and all its `also_make's.  */
index 062e619..244af41 100644 (file)
@@ -1,5 +1,8 @@
 2009-06-07  Paul Smith  <psmith@gnu.org>
 
+       * scripts/features/se_explicit: Make sure we catch defining
+       prereqs during snap_deps().  Savannah bug #24622.
+
        * scripts/variables/automatic: Check prereq ordering when the
        target with the recipe has no prereqs.  Savannah bug #21198.
 
index b0342c7..454d494 100644 (file)
@@ -86,31 +86,19 @@ run_make_test('
 all: foo bar baz
 
 # Subtest #1
-#
 foo: foo.1; @:
-
 foo: foo.2
-
 foo: foo.3
 
-
 # Subtest #2
-#
 bar: bar.2
-
 bar: bar.1; @:
-
 bar: bar.3
 
-
 # Subtest #3
-#
 baz: baz.1
-
 baz: baz.2
-
 baz: ; @:
-
 ',
 '',
 'foo.1
@@ -129,6 +117,18 @@ run_make_test('
 all : $$(eval $$(info test))
 ',            '', "test\n#MAKE#: Nothing to be done for `all'.\n");
 
+# TEST #5: (NEGATIVE) catch eval in a prereq list trying to create new
+# target/prereq relationships.
+
+run_make_test('
+.SECONDEXPANSION:
+proj1.exe : proj1.o $$(eval $$(test))
+define test
+proj1.o : proj1.c
+proj1.c: proj1.h
+endef
+',
+              '', "#MAKE#: *** prerequisites cannot be defined in recipes.  Stop.\n", 512);
 
 # This tells the test driver that the perl test script executed properly.
 1;