Remove unnecessary parsing during makefile read

* src/read.c (make_word_type): Remove w_varassign from the enum.
(get_next_mword): This function is never called on a string in a place
where we might find a variable assignment.  Any variable assignments
have already been handled via try_variable_definition(), so we don't
need to check for them here.
* tests/scripts/variables/flavors: Check triple-colon assignment in
target-specific variables.
This commit is contained in:
Paul Smith 2024-01-10 23:53:05 -05:00
parent 828906b6dc
commit 82708b3a3a
2 changed files with 18 additions and 46 deletions

View File

@ -68,7 +68,7 @@ struct vmodifiers
enum make_word_type enum make_word_type
{ {
w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon, w_bogus, w_eol, w_static, w_variable, w_colon, w_dcolon, w_semicolon,
w_varassign, w_ampcolon, w_ampdcolon w_ampcolon, w_ampdcolon
}; };
@ -2693,7 +2693,8 @@ readline (struct ebuffer *ebuf)
} }
/* Parse the next "makefile word" from the input buffer, and return info /* Parse the next "makefile word" from the input buffer, and return info
about it. about it. This function won't be called in any context where we might need
to parse a variable assignment so we don't need to check that.
A "makefile word" is one of: A "makefile word" is one of:
@ -2706,11 +2707,10 @@ readline (struct ebuffer *ebuf)
w_ampcolon An ampersand-colon (&:) token w_ampcolon An ampersand-colon (&:) token
w_ampdcolon An ampersand-double-colon (&::) token w_ampdcolon An ampersand-double-colon (&::) token
w_semicolon A semicolon w_semicolon A semicolon
w_varassign A variable assignment operator (=, :=, ::=, +=, ?=, or !=)
Note that this function is only used when reading certain parts of the Note that this function is only used when reading certain parts of the
makefile. Don't use it where special rules hold sway (RHS of a variable, makefile. Don't use it where special rules hold sway (RHS of a variable,
in a command list, etc.) */ in a recipe, etc.) */
static enum make_word_type static enum make_word_type
get_next_mword (char *buffer, char **startp, size_t *length) get_next_mword (char *buffer, char **startp, size_t *length)
@ -2737,29 +2737,13 @@ get_next_mword (char *buffer, char **startp, size_t *length)
wtype = w_semicolon; wtype = w_semicolon;
goto done; goto done;
case '=':
wtype = w_varassign;
goto done;
case ':': case ':':
if (*p == '=') wtype = w_colon;
if (*p == ':')
{ {
++p; ++p;
wtype = w_varassign; /* := */ wtype = w_dcolon;
} }
else if (*p == ':')
{
++p;
if (p[1] == '=')
{
++p;
wtype = w_varassign; /* ::= */
}
else
wtype = w_dcolon;
}
else
wtype = w_colon;
goto done; goto done;
case '&': case '&':
@ -2777,24 +2761,12 @@ get_next_mword (char *buffer, char **startp, size_t *length)
} }
break; break;
case '+':
case '?':
case '!':
if (*p == '=')
{
++p;
wtype = w_varassign; /* += or ?= or != */
goto done;
}
break;
default: default:
break; break;
} }
/* This is some non-operator word. A word consists of the longest /* This is some non-operator word. A word consists of the longest string of
string of characters that doesn't contain whitespace, one of [:=#], characters that doesn't contain whitespace, one of [:#], or &:. */
or [?+!]=, or &:. */
/* We start out assuming a static word; if we see a variable we'll /* We start out assuming a static word; if we see a variable we'll
adjust our assumptions then. */ adjust our assumptions then. */
@ -2809,9 +2781,6 @@ get_next_mword (char *buffer, char **startp, size_t *length)
switch (c) switch (c)
{ {
case '=':
goto done_word;
case ':': case ':':
#ifdef HAVE_DOS_PATHS #ifdef HAVE_DOS_PATHS
/* A word CAN include a colon in its drive spec. The drive /* A word CAN include a colon in its drive spec. The drive
@ -2835,12 +2804,6 @@ get_next_mword (char *buffer, char **startp, size_t *length)
p = skip_reference (p-1); p = skip_reference (p-1);
break; break;
case '?':
case '+':
if (*p == '=')
goto done_word;
break;
case '\\': case '\\':
switch (*p) switch (*p)
{ {
@ -2872,6 +2835,7 @@ get_next_mword (char *buffer, char **startp, size_t *length)
*startp = beg; *startp = beg;
if (length) if (length)
*length = p - beg; *length = p - beg;
return wtype; return wtype;
} }

View File

@ -201,4 +201,12 @@ all: ; @echo '$(foo)'
!, !,
'', 'Good$bye $what Hello'); '', 'Good$bye $what Hello');
# Target-specific variable
run_make_test(q!
bar = Good$$bye
all: foo :::= $(bar)
all: ; @echo '$(foo)'
!,
'', 'Good$bye');
1; 1;