From da6fc6aae2e26b24073591b18ca92e42dda20d8c Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sun, 14 Mar 2021 16:32:47 -0400 Subject: [PATCH] [SV 59870] define/undefine prerequisites are not target-specific vars * 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 | 10 +++++----- tests/scripts/variables/define | 18 ++++++++++++++++++ tests/scripts/variables/undefine | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/read.c b/src/read.c index 545514c5..3b4b0fe4 100644 --- a/src/read.c +++ b/src/read.c @@ -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 diff --git a/tests/scripts/variables/define b/tests/scripts/variables/define index 7324cbc7..984bdd8e 100644 --- a/tests/scripts/variables/define +++ b/tests/scripts/variables/define @@ -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; diff --git a/tests/scripts/variables/undefine b/tests/scripts/variables/undefine index 38707b83..1732351b 100644 --- a/tests/scripts/variables/undefine +++ b/tests/scripts/variables/undefine @@ -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;