]> git.ipfire.org Git - thirdparty/make.git/commitdiff
[SV 59870] define/undefine prerequisites are not target-specific vars
authorPaul Smith <psmith@gnu.org>
Sun, 14 Mar 2021 20:32:47 +0000 (16:32 -0400)
committerPaul Smith <psmith@gnu.org>
Sun, 14 Mar 2021 20:35:38 +0000 (16:35 -0400)
* src/read.c (parse_var_assignment): If called in a target-specific
variable context don't allow define/undefine as variable assignments.
* test/scripts/variables/define: Add a test.
* test/scripts/variables/undefine: Add a test.

src/read.c
tests/scripts/variables/define
tests/scripts/variables/undefine

index 545514c588c1330bbc16e05d2360d9694532bb54..3b4b0fe48c27d794ea513365ca6c883d2609dfcf 100644 (file)
@@ -494,7 +494,7 @@ eval_buffer (char *buffer, const floc *flocp)
    based on the modifiers found if any, plus V_ASSIGN is 1.
  */
 static char *
-parse_var_assignment (const char *line, struct vmodifiers *vmod)
+parse_var_assignment (const char *line, int targvar, struct vmodifiers *vmod)
 {
   const char *p;
   memset (vmod, '\0', sizeof (*vmod));
@@ -529,14 +529,14 @@ parse_var_assignment (const char *line, struct vmodifiers *vmod)
         vmod->override_v = 1;
       else if (word1eq ("private"))
         vmod->private_v = 1;
-      else if (word1eq ("define"))
+      else if (!targvar && word1eq ("define"))
         {
           /* We can't have modifiers after 'define' */
           vmod->define_v = 1;
           p = next_token (p2);
           break;
         }
-      else if (word1eq ("undefine"))
+      else if (!targvar && word1eq ("undefine"))
         {
           /* We can't have modifiers after 'undefine' */
           vmod->undefine_v = 1;
@@ -721,7 +721,7 @@ eval (struct ebuffer *ebuf, int set_default)
 
       /* See if this is a variable assignment.  We need to do this early, to
          allow variables with names like 'ifdef', 'export', 'private', etc.  */
-      p = parse_var_assignment (p, &vmod);
+      p = parse_var_assignment (p, 0, &vmod);
       if (vmod.assign_v)
         {
           struct variable *v;
@@ -1181,7 +1181,7 @@ eval (struct ebuffer *ebuf, int set_default)
             p2 = variable_buffer + l;
           }
 
-        p2 = parse_var_assignment (p2, &vmod);
+        p2 = parse_var_assignment (p2, 1, &vmod);
         if (vmod.assign_v)
           {
             /* If there was a semicolon found, add it back, plus anything
index 7324cbc7825820e65e4fced53c32de54a5f276ed..984bdd8e3a0df6bfc5eb1dc5baf7017c8c74dc0b 100644 (file)
@@ -279,4 +279,22 @@ hello
 world
 ');
 
+# Ensure that define can be a target when not appearing in a variable
+# definition context.  See SV 59870
+
+run_make_test(q!
+define = define
+
+$(define) : ;@echo $@
+
+%:define
+
+all: define foo
+
+%.x : define
+
+foo:;
+!,
+    '', "define\n");
+
 1;
index 38707b837f22db2f7ecae3fbd8a19f56de475098..1732351bda751486c1d813a8560a2b8eed939bbd 100644 (file)
@@ -70,4 +70,22 @@ all: ;@echo ouch
 ',
 '', "#MAKEFILE#:3: *** empty variable name.  Stop.\n", 512);
 
+# Ensure that define can be a target when not appearing in a variable
+# definition context.  See SV 59870
+
+run_make_test(q!
+undefine = undefine
+
+$(undefine) : ;@echo $@
+
+%:undefine
+
+all: undefine foo
+
+%.x : undefine
+
+foo:;
+!,
+    '', "undefine\n");
+
 1;