Module Name: src Committed By: rillig Date: Tue Apr 23 22:51:28 UTC 2024
Modified Files: src/usr.bin/make: cond.c make.h parse.c var.c src/usr.bin/make/unit-tests: cmd-errors-jobs.exp cmd-errors-jobs.mk cmd-errors-lint.exp cmd-errors-lint.mk cmd-errors.exp cmd-errors.mk cmdline-undefined.mk cmdline.mk comment.mk cond-cmp-string.mk cond-func-defined.exp cond-func-defined.mk varmod-ifelse.mk varmod-match.exp varmod-match.mk Log Message: make: clean up comments, code and tests To generate a diff of this commit: cvs rdiff -u -r1.362 -r1.363 src/usr.bin/make/cond.c cvs rdiff -u -r1.330 -r1.331 src/usr.bin/make/make.h cvs rdiff -u -r1.720 -r1.721 src/usr.bin/make/parse.c cvs rdiff -u -r1.1104 -r1.1105 src/usr.bin/make/var.c cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/cmd-errors-jobs.exp \ src/usr.bin/make/unit-tests/cmd-errors-lint.exp \ src/usr.bin/make/unit-tests/cmd-errors.mk cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/cmd-errors-jobs.mk cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/cmd-errors-lint.mk cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/cmd-errors.exp \ src/usr.bin/make/unit-tests/cond-func-defined.exp cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/cmdline-undefined.mk \ src/usr.bin/make/unit-tests/cmdline.mk cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/comment.mk cvs rdiff -u -r1.18 -r1.19 src/usr.bin/make/unit-tests/cond-cmp-string.mk cvs rdiff -u -r1.11 -r1.12 src/usr.bin/make/unit-tests/cond-func-defined.mk cvs rdiff -u -r1.27 -r1.28 src/usr.bin/make/unit-tests/varmod-ifelse.mk cvs rdiff -u -r1.15 -r1.16 src/usr.bin/make/unit-tests/varmod-match.exp cvs rdiff -u -r1.21 -r1.22 src/usr.bin/make/unit-tests/varmod-match.mk Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/make/cond.c diff -u src/usr.bin/make/cond.c:1.362 src/usr.bin/make/cond.c:1.363 --- src/usr.bin/make/cond.c:1.362 Wed Feb 7 07:21:22 2024 +++ src/usr.bin/make/cond.c Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: cond.c,v 1.362 2024/02/07 07:21:22 rillig Exp $ */ +/* $NetBSD: cond.c,v 1.363 2024/04/23 22:51:28 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -91,7 +91,7 @@ #include "dir.h" /* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */ -MAKE_RCSID("$NetBSD: cond.c,v 1.362 2024/02/07 07:21:22 rillig Exp $"); +MAKE_RCSID("$NetBSD: cond.c,v 1.363 2024/04/23 22:51:28 rillig Exp $"); /* * Conditional expressions conform to this grammar: @@ -424,13 +424,12 @@ CondParser_StringExpr(CondParser *par, c * Parse a string from an expression or an optionally quoted string, * on the left-hand and right-hand sides of comparisons. * - * Results: - * Returns the string without any enclosing quotes, or NULL on error. - * Sets out_quoted if the leaf was a quoted string literal. + * Return the string without any enclosing quotes, or NULL on error. + * Sets out_quoted if the leaf was a quoted string literal. */ -static void +static FStr CondParser_Leaf(CondParser *par, bool doEval, bool unquotedOK, - FStr *out_str, bool *out_quoted) + bool *out_quoted) { Buffer buf; FStr str; @@ -492,7 +491,7 @@ return_buf: buf.data = NULL; return_str: Buf_Done(&buf); - *out_str = str; + return str; } /* @@ -602,7 +601,7 @@ CondParser_Comparison(CondParser *par, b ComparisonOp op; bool lhsQuoted, rhsQuoted; - CondParser_Leaf(par, doEval, par->leftUnquotedOK, &lhs, &lhsQuoted); + lhs = CondParser_Leaf(par, doEval, par->leftUnquotedOK, &lhsQuoted); if (lhs.str == NULL) goto done_lhs; @@ -622,7 +621,7 @@ CondParser_Comparison(CondParser *par, b goto done_lhs; } - CondParser_Leaf(par, doEval, true, &rhs, &rhsQuoted); + rhs = CondParser_Leaf(par, doEval, true, &rhsQuoted); t = rhs.str == NULL ? TOK_ERROR : !doEval ? TOK_FALSE : EvalCompare(par, lhs.str, lhsQuoted, op, rhs.str, rhsQuoted); Index: src/usr.bin/make/make.h diff -u src/usr.bin/make/make.h:1.330 src/usr.bin/make/make.h:1.331 --- src/usr.bin/make/make.h:1.330 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/make.h Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: make.h,v 1.330 2024/04/20 10:18:55 rillig Exp $ */ +/* $NetBSD: make.h,v 1.331 2024/04/23 22:51:28 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -399,7 +399,7 @@ typedef struct SearchPath { /* * A graph node represents a target that can possibly be made, including its - * relation to other targets and a lot of other details. + * relation to other targets. */ typedef struct GNode { /* The target's name, such as "clean" or "make.c" */ @@ -581,8 +581,8 @@ extern GNode *SCOPE_GLOBAL; extern GNode *SCOPE_CMDLINE; /* - * Value returned by Var_Parse when an error is encountered. It actually - * points to an empty string, so naive callers needn't worry about it. + * Value returned by Var_Parse when an error is encountered. It points to an + * empty string, so naive callers needn't worry about it. */ extern char var_Error[]; @@ -678,11 +678,11 @@ typedef enum PrintVarsMode { /* Command line options */ typedef struct CmdOpts { - /* -B: whether we are make compatible */ + /* -B: whether to be compatible to traditional make */ bool compatMake; /* - * -d: debug control: There is one bit per module. It is up to the + * -d: debug control: There is one flag per module. It is up to the * module what debug information to print. */ DebugFlags debug; Index: src/usr.bin/make/parse.c diff -u src/usr.bin/make/parse.c:1.720 src/usr.bin/make/parse.c:1.721 --- src/usr.bin/make/parse.c:1.720 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/parse.c Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.720 2024/04/20 10:18:55 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.721 2024/04/23 22:51:28 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -105,7 +105,7 @@ #include "pathnames.h" /* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: parse.c,v 1.720 2024/04/20 10:18:55 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.721 2024/04/23 22:51:28 rillig Exp $"); /* Detects a multiple-inclusion guard in a makefile. */ typedef enum { @@ -1622,10 +1622,10 @@ ParseDependencySources(char *p, GNodeTyp * Transformation rules such as '.c.o' are also handled here, see * Suff_AddTransform. * - * Upon return, the value of the line is unspecified. + * Upon return, the value of expandedLine is unspecified. */ static void -ParseDependency(char *line, const char *unexpanded_line) +ParseDependency(char *expandedLine, const char *unexpandedLine) { char *p; SearchPathList *paths; /* search paths to alter when parsing a list @@ -1636,14 +1636,14 @@ ParseDependency(char *line, const char * * vice versa */ GNodeType op; - DEBUG1(PARSE, "ParseDependency(%s)\n", line); - p = line; + DEBUG1(PARSE, "ParseDependency(%s)\n", expandedLine); + p = expandedLine; paths = NULL; targetAttr = OP_NONE; special = SP_NOT; - if (!ParseDependencyTargets(&p, line, &special, &targetAttr, &paths, - unexpanded_line)) + if (!ParseDependencyTargets(&p, expandedLine, &special, &targetAttr, + &paths, unexpandedLine)) goto out; if (!Lst_IsEmpty(targets)) @@ -1651,7 +1651,7 @@ ParseDependency(char *line, const char * op = ParseDependencyOp(&p); if (op == OP_NONE) { - InvalidLineType(line, unexpanded_line); + InvalidLineType(expandedLine, unexpandedLine); goto out; } ApplyDependencyOperator(op); Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.1104 src/usr.bin/make/var.c:1.1105 --- src/usr.bin/make/var.c:1.1104 Sun Apr 21 21:59:48 2024 +++ src/usr.bin/make/var.c Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.1104 2024/04/21 21:59:48 rillig Exp $ */ +/* $NetBSD: var.c,v 1.1105 2024/04/23 22:51:28 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -81,8 +81,7 @@ * Var_End Clean up the module. * * Var_Set - * Var_SetExpand - * Set the value of the variable, creating it if + * Var_SetExpand Set the value of the variable, creating it if * necessary. * * Var_Append @@ -102,8 +101,7 @@ * * Var_Parse Parse an expression such as ${VAR:Mpattern}. * - * Var_Delete - * Delete a variable. + * Var_Delete Delete a variable. * * Var_ReexportVars * Export some or even all variables to the environment @@ -118,9 +116,6 @@ * Var_Stats Print out hashing statistics if in -dh mode. * * Var_Dump Print out all variables defined in the given scope. - * - * XXX: There's a lot of almost duplicate code in these functions that only - * differs in subtle details that are not mentioned in the manual page. */ #include <sys/stat.h> @@ -137,7 +132,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.1104 2024/04/21 21:59:48 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.1105 2024/04/23 22:51:28 rillig Exp $"); /* * Variables are defined using one of the VAR=value assignments. Their @@ -147,7 +142,7 @@ MAKE_RCSID("$NetBSD: var.c,v 1.1104 2024 * There are 3 kinds of variables: scope variables, environment variables, * undefined variables. * - * Scope variables are stored in a GNode.scope. The only way to undefine + * Scope variables are stored in GNode.vars. The only way to undefine * a scope variable is using the .undef directive. In particular, it must * not be possible to undefine a variable during the evaluation of an * expression, or Var.name might point nowhere. (There is another, @@ -182,7 +177,7 @@ typedef struct Var { /* * The variable comes from the environment. - * Appending to its value moves the variable to the global scope. + * Appending to its value depends on the scope, see var-op-append.mk. */ bool fromEnvironment:1; @@ -485,11 +480,8 @@ VarFindSubstring(Substring name, GNode * } if (var == NULL) { - FStr envName; - const char *envValue; - - envName = Substring_Str(name); - envValue = getenv(envName.str); + FStr envName = Substring_Str(name); + const char *envValue = getenv(envName.str); if (envValue != NULL) return VarNew(envName, envValue, true, true, false); FStr_Done(&envName); @@ -1004,9 +996,10 @@ Var_SetWithFlags(GNode *scope, const cha if (v == NULL) { if (scope == SCOPE_CMDLINE && !(flags & VAR_SET_NO_EXPORT)) { /* - * This var would normally prevent the same name being - * added to SCOPE_GLOBAL, so delete it from there if - * needed. Otherwise -V name may show the wrong value. + * This variable would normally prevent the same name + * being added to SCOPE_GLOBAL, so delete it from + * there if needed. Otherwise -V name may show the + * wrong value. * * See ExistsInCmdline. */ @@ -4716,10 +4709,9 @@ VarSubstPlain(const char **pp, Buffer *r * given string. * * Input: - * str The string in which the expressions are - * expanded. - * scope The scope in which to start searching for - * variables. The other scopes are searched as well. + * str The string in which the expressions are expanded. + * scope The scope in which to start searching for variables. + * The other scopes are searched as well. * emode The mode for parsing or evaluating subexpressions. */ char * Index: src/usr.bin/make/unit-tests/cmd-errors-jobs.exp diff -u src/usr.bin/make/unit-tests/cmd-errors-jobs.exp:1.5 src/usr.bin/make/unit-tests/cmd-errors-jobs.exp:1.6 --- src/usr.bin/make/unit-tests/cmd-errors-jobs.exp:1.5 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/cmd-errors-jobs.exp Tue Apr 23 22:51:28 2024 @@ -1,6 +1,6 @@ : undefined--eol -make: in target "unclosed-variable": Unclosed variable "UNCLOSED" -: unclosed-variable- +make: in target "unclosed-expression": Unclosed variable "UNCLOSED" +: unclosed-expression- make: Unclosed expression, expecting '}' for "UNCLOSED" : unclosed-modifier- make: in target "unknown-modifier": while evaluating variable "UNKNOWN": Unknown modifier "Z" Index: src/usr.bin/make/unit-tests/cmd-errors-lint.exp diff -u src/usr.bin/make/unit-tests/cmd-errors-lint.exp:1.5 src/usr.bin/make/unit-tests/cmd-errors-lint.exp:1.6 --- src/usr.bin/make/unit-tests/cmd-errors-lint.exp:1.5 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/cmd-errors-lint.exp Tue Apr 23 22:51:28 2024 @@ -1,6 +1,6 @@ : undefined -make: in target "unclosed-variable": Unclosed variable "UNCLOSED" -: unclosed-variable +make: in target "unclosed-expression": Unclosed variable "UNCLOSED" +: unclosed-expression make: Unclosed expression, expecting '}' for "UNCLOSED" : unclosed-modifier make: in target "unknown-modifier": while evaluating variable "UNKNOWN": Unknown modifier "Z" Index: src/usr.bin/make/unit-tests/cmd-errors.mk diff -u src/usr.bin/make/unit-tests/cmd-errors.mk:1.5 src/usr.bin/make/unit-tests/cmd-errors.mk:1.6 --- src/usr.bin/make/unit-tests/cmd-errors.mk:1.5 Sun Sep 25 12:51:37 2022 +++ src/usr.bin/make/unit-tests/cmd-errors.mk Tue Apr 23 22:51:28 2024 @@ -1,17 +1,18 @@ -# $NetBSD: cmd-errors.mk,v 1.5 2022/09/25 12:51:37 rillig Exp $ +# $NetBSD: cmd-errors.mk,v 1.6 2024/04/23 22:51:28 rillig Exp $ # -# Demonstrate how errors in variable expansions affect whether the commands +# Demonstrate how errors in expressions affect whether the commands # are actually executed in compat mode. -all: undefined unclosed-variable unclosed-modifier unknown-modifier end +all: undefined unclosed-expression unclosed-modifier unknown-modifier end -# Undefined variables are not an error. They expand to empty strings. +# Undefined variables in expressions are not an error. They expand to empty +# strings. undefined: : $@-${UNDEFINED}-eol # XXX: As of 2020-11-01, this command is executed even though it contains # parse errors. -unclosed-variable: +unclosed-expression: : $@-${UNCLOSED # XXX: As of 2020-11-01, this command is executed even though it contains Index: src/usr.bin/make/unit-tests/cmd-errors-jobs.mk diff -u src/usr.bin/make/unit-tests/cmd-errors-jobs.mk:1.3 src/usr.bin/make/unit-tests/cmd-errors-jobs.mk:1.4 --- src/usr.bin/make/unit-tests/cmd-errors-jobs.mk:1.3 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/cmd-errors-jobs.mk Tue Apr 23 22:51:28 2024 @@ -1,21 +1,22 @@ -# $NetBSD: cmd-errors-jobs.mk,v 1.3 2024/04/20 10:18:55 rillig Exp $ +# $NetBSD: cmd-errors-jobs.mk,v 1.4 2024/04/23 22:51:28 rillig Exp $ # -# Demonstrate how errors in variable expansions affect whether the commands +# Demonstrate how errors in expressions affect whether the commands # are actually executed in jobs mode. .MAKEFLAGS: -j1 -all: undefined unclosed-variable unclosed-modifier unknown-modifier end +all: undefined unclosed-expression unclosed-modifier unknown-modifier end -# Undefined variables are not an error. They expand to empty strings. +# Undefined variables in expressions are not an error. They expand to empty +# strings. # expect: : undefined--eol undefined: : $@-${UNDEFINED}-eol # XXX: This command is executed even though it contains parse errors. -# expect: make: in target "unclosed-variable": Unclosed variable "UNCLOSED" -# expect: : unclosed-variable- -unclosed-variable: +# expect: make: in target "unclosed-expression": Unclosed variable "UNCLOSED" +# expect: : unclosed-expression- +unclosed-expression: : $@-${UNCLOSED # XXX: This command is executed even though it contains parse errors. Index: src/usr.bin/make/unit-tests/cmd-errors-lint.mk diff -u src/usr.bin/make/unit-tests/cmd-errors-lint.mk:1.1 src/usr.bin/make/unit-tests/cmd-errors-lint.mk:1.2 --- src/usr.bin/make/unit-tests/cmd-errors-lint.mk:1.1 Mon Nov 2 20:43:27 2020 +++ src/usr.bin/make/unit-tests/cmd-errors-lint.mk Tue Apr 23 22:51:28 2024 @@ -1,20 +1,21 @@ -# $NetBSD: cmd-errors-lint.mk,v 1.1 2020/11/02 20:43:27 rillig Exp $ +# $NetBSD: cmd-errors-lint.mk,v 1.2 2024/04/23 22:51:28 rillig Exp $ # -# Demonstrate how errors in variable expansions affect whether the commands +# Demonstrate how errors in expressions affect whether the commands # are actually executed. .MAKEFLAGS: -dL -all: undefined unclosed-variable unclosed-modifier unknown-modifier end +all: undefined unclosed-expression unclosed-modifier unknown-modifier end -# Undefined variables are not an error. They expand to empty strings. +# Undefined variables in expressions are not an error. They expand to empty +# strings. undefined: : $@ ${UNDEFINED} # XXX: As of 2020-11-01, this obvious syntax error is not detected. # XXX: As of 2020-11-01, this command is executed even though it contains # parse errors. -unclosed-variable: +unclosed-expression: : $@ ${UNCLOSED # XXX: As of 2020-11-01, this obvious syntax error is not detected. Index: src/usr.bin/make/unit-tests/cmd-errors.exp diff -u src/usr.bin/make/unit-tests/cmd-errors.exp:1.8 src/usr.bin/make/unit-tests/cmd-errors.exp:1.9 --- src/usr.bin/make/unit-tests/cmd-errors.exp:1.8 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/cmd-errors.exp Tue Apr 23 22:51:28 2024 @@ -1,6 +1,6 @@ : undefined--eol -make: in target "unclosed-variable": Unclosed variable "UNCLOSED" -: unclosed-variable- +make: in target "unclosed-expression": Unclosed variable "UNCLOSED" +: unclosed-expression- make: Unclosed expression, expecting '}' for "UNCLOSED" : unclosed-modifier- make: in target "unknown-modifier": while evaluating variable "UNKNOWN": Unknown modifier "Z" Index: src/usr.bin/make/unit-tests/cond-func-defined.exp diff -u src/usr.bin/make/unit-tests/cond-func-defined.exp:1.8 src/usr.bin/make/unit-tests/cond-func-defined.exp:1.9 --- src/usr.bin/make/unit-tests/cond-func-defined.exp:1.8 Sun Nov 19 21:47:52 2023 +++ src/usr.bin/make/unit-tests/cond-func-defined.exp Tue Apr 23 22:51:28 2024 @@ -1,8 +1,5 @@ make: "cond-func-defined.mk" line 24: Missing closing parenthesis for defined() make: "cond-func-defined.mk" line 34: Missing closing parenthesis for defined() -make: "cond-func-defined.mk" line 47: In .for loops, expressions for the loop variables are -make: "cond-func-defined.mk" line 49: substituted at evaluation time. There is no actual variable -make: "cond-func-defined.mk" line 51: involved, even if it feels like it. make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/cmdline-undefined.mk diff -u src/usr.bin/make/unit-tests/cmdline-undefined.mk:1.4 src/usr.bin/make/unit-tests/cmdline-undefined.mk:1.5 --- src/usr.bin/make/unit-tests/cmdline-undefined.mk:1.4 Sun Nov 19 21:47:52 2023 +++ src/usr.bin/make/unit-tests/cmdline-undefined.mk Tue Apr 23 22:51:28 2024 @@ -1,6 +1,6 @@ -# $NetBSD: cmdline-undefined.mk,v 1.4 2023/11/19 21:47:52 rillig Exp $ +# $NetBSD: cmdline-undefined.mk,v 1.5 2024/04/23 22:51:28 rillig Exp $ # -# Tests for undefined expressions in the command line. +# Tests for undefined variables in expressions in the command line. all: # When the command line is parsed, variable assignments using the Index: src/usr.bin/make/unit-tests/cmdline.mk diff -u src/usr.bin/make/unit-tests/cmdline.mk:1.4 src/usr.bin/make/unit-tests/cmdline.mk:1.5 --- src/usr.bin/make/unit-tests/cmdline.mk:1.4 Fri Jun 10 18:58:07 2022 +++ src/usr.bin/make/unit-tests/cmdline.mk Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -# $NetBSD: cmdline.mk,v 1.4 2022/06/10 18:58:07 rillig Exp $ +# $NetBSD: cmdline.mk,v 1.5 2024/04/23 22:51:28 rillig Exp $ # # Tests for command line parsing and related special variables. @@ -24,7 +24,7 @@ makeobjdir-direct: @${MAKE_CMD} MAKEOBJDIR=${DIR2} show-objdir # The .OBJDIR can be set via the MAKEOBJDIR command line variable, -# and that variable could even contain the usual modifiers. +# and expressions based on that variable can contain the usual modifiers. # Since the .OBJDIR=MAKEOBJDIR assignment happens very early, # the SUB2 variable in the modifier is not defined yet and is therefore empty. # The SUB1 in the resulting path comes from the environment variable TMPBASE, Index: src/usr.bin/make/unit-tests/comment.mk diff -u src/usr.bin/make/unit-tests/comment.mk:1.6 src/usr.bin/make/unit-tests/comment.mk:1.7 --- src/usr.bin/make/unit-tests/comment.mk:1.6 Sun Nov 19 21:47:52 2023 +++ src/usr.bin/make/unit-tests/comment.mk Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -# $NetBSD: comment.mk,v 1.6 2023/11/19 21:47:52 rillig Exp $ +# $NetBSD: comment.mk,v 1.7 2024/04/23 22:51:28 rillig Exp $ # # Demonstrate how comments are written in makefiles. @@ -53,9 +53,9 @@ VAR= \# # Both in the assignment. . error .endif -# Since 2012-03-24 the variable modifier :[#] does not need to be escaped. -# To keep the parsing code simple, any "[#" does not start a comment, even -# outside of an expression. +# Since 2012-03-24 the modifier :[#] does not need to be escaped. +# To keep the parsing code simple, the "#" in "[#" does not start a comment, +# regardless of the syntactical context it appears in. WORDS= ${VAR:[#]} [# .if ${WORDS} != "1 [#" . error Index: src/usr.bin/make/unit-tests/cond-cmp-string.mk diff -u src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.18 src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.19 --- src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.18 Sun Nov 19 21:47:52 2023 +++ src/usr.bin/make/unit-tests/cond-cmp-string.mk Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -# $NetBSD: cond-cmp-string.mk,v 1.18 2023/11/19 21:47:52 rillig Exp $ +# $NetBSD: cond-cmp-string.mk,v 1.19 2024/04/23 22:51:28 rillig Exp $ # # Tests for string comparisons in .if conditions. @@ -20,12 +20,12 @@ . error .endif -# The left-hand side of the comparison requires that any expression -# is defined. +# An expression that occurs on the left-hand side of the comparison must be +# defined. # # The variable named "" is never defined, nevertheless it can be used as a -# starting point for expressions. Applying the :U modifier to such -# an undefined expression turns it into a defined expression. +# starting point for an expression. Applying the :U modifier to such an +# undefined expression turns it into a defined expression. # # See ApplyModifier_Defined and DEF_DEFINED. .if ${:Ustr} != "str" @@ -69,8 +69,9 @@ .endif # Between 2003-01-01 (maybe even earlier) and 2020-10-30, adding one of the -# characters " \t!=><" directly after an expression resulted in a -# "Malformed conditional", even though the string was well-formed. +# characters " \t!=><" directly after an expression in a string literal +# resulted in a "Malformed conditional", even though the string was +# well-formed. .if ${:Uword } != "${:Uword} " . error .endif @@ -94,8 +95,7 @@ . error .endif -# Adding a space at the beginning of the quoted expression works -# though. +# Adding a space at the beginning of the quoted expression works though. .if ${:U word } != " ${:Uword} " . error .endif @@ -145,7 +145,7 @@ . error .endif -# Two variables with different values compare unequal. +# Two expressions with different values compare unequal. VAR1= value1 VAR2= value2 .if ${VAR1} != ${VAR2} Index: src/usr.bin/make/unit-tests/cond-func-defined.mk diff -u src/usr.bin/make/unit-tests/cond-func-defined.mk:1.11 src/usr.bin/make/unit-tests/cond-func-defined.mk:1.12 --- src/usr.bin/make/unit-tests/cond-func-defined.mk:1.11 Sun Nov 19 21:47:52 2023 +++ src/usr.bin/make/unit-tests/cond-func-defined.mk Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -# $NetBSD: cond-func-defined.mk,v 1.11 2023/11/19 21:47:52 rillig Exp $ +# $NetBSD: cond-func-defined.mk,v 1.12 2024/04/23 22:51:28 rillig Exp $ # # Tests for the defined() function in .if conditions. @@ -43,12 +43,9 @@ ${:UA B}= variable name with spaces . if defined(var) . error . else -# expect+1: In .for loops, expressions for the loop variables are -. info In .for loops, expressions for the loop variables are -# expect+1: substituted at evaluation time. There is no actual variable -. info substituted at evaluation time. There is no actual variable -# expect+1: involved, even if it feels like it. -. info involved, even if it feels like it. +# In .for loops, expressions based on the loop variables are substituted at +# evaluation time. There is no actual variable involved, even if the code in +# the makefiles looks like it. . endif .endfor Index: src/usr.bin/make/unit-tests/varmod-ifelse.mk diff -u src/usr.bin/make/unit-tests/varmod-ifelse.mk:1.27 src/usr.bin/make/unit-tests/varmod-ifelse.mk:1.28 --- src/usr.bin/make/unit-tests/varmod-ifelse.mk:1.27 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/varmod-ifelse.mk Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-ifelse.mk,v 1.27 2024/04/20 10:18:55 rillig Exp $ +# $NetBSD: varmod-ifelse.mk,v 1.28 2024/04/23 22:51:28 rillig Exp $ # # Tests for the ${cond:?then:else} variable modifier, which evaluates either # the then-expression or the else-expression, depending on the condition. @@ -294,7 +294,7 @@ INDIRECT_COND2= $${DELAYED} == "two" # In the modifier parts for the 'then' and 'else' branches, subexpressions are -# parsed in by inspecting the actual modifiers. In 2008, 2015, 2020, 2022 and +# parsed by inspecting the actual modifiers. In 2008, 2015, 2020, 2022 and # 2023, the exact parsing algorithm switched a few times, counting balanced # braces instead of proper subexpressions, which meant that unbalanced braces # were parsed differently, depending on whether the branch was active or not. Index: src/usr.bin/make/unit-tests/varmod-match.exp diff -u src/usr.bin/make/unit-tests/varmod-match.exp:1.15 src/usr.bin/make/unit-tests/varmod-match.exp:1.16 --- src/usr.bin/make/unit-tests/varmod-match.exp:1.15 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/varmod-match.exp Tue Apr 23 22:51:28 2024 @@ -1,14 +1,14 @@ -make: "varmod-match.mk" line 289: while evaluating variable "WORDS": warning: Unfinished character list in pattern 'a[' of modifier ':M' -make: "varmod-match.mk" line 297: while evaluating variable "WORDS": warning: Unfinished character list in pattern 'a[^' of modifier ':M' -make: "varmod-match.mk" line 305: while evaluating variable "WORDS": warning: Unfinished character list in pattern '[-x1-3' of modifier ':M' -make: "varmod-match.mk" line 313: while evaluating variable "WORDS": warning: Unfinished character list in pattern '*[-x1-3' of modifier ':M' -make: "varmod-match.mk" line 322: while evaluating variable "WORDS": warning: Unfinished character list in pattern '[^-x1-3' of modifier ':M' -make: "varmod-match.mk" line 336: while evaluating variable "WORDS": warning: Unfinished character list in pattern '?[\' of modifier ':M' -make: "varmod-match.mk" line 344: while evaluating variable "WORDS": warning: Unfinished character range in pattern '[x-' of modifier ':M' -make: "varmod-match.mk" line 356: while evaluating variable "WORDS": warning: Unfinished character range in pattern '[^x-' of modifier ':M' -make: "varmod-match.mk" line 364: while evaluating variable " : :: ": warning: Unfinished character list in pattern '[' of modifier ':M' -make: "varmod-match.mk" line 364: while evaluating variable " : :: ": Unknown modifier "]" -make: "varmod-match.mk" line 364: Malformed conditional (${ ${:U\:} ${:U\:\:} :L:M[:]} != ":") +make: "varmod-match.mk" line 290: while evaluating variable "WORDS": warning: Unfinished character list in pattern 'a[' of modifier ':M' +make: "varmod-match.mk" line 298: while evaluating variable "WORDS": warning: Unfinished character list in pattern 'a[^' of modifier ':M' +make: "varmod-match.mk" line 306: while evaluating variable "WORDS": warning: Unfinished character list in pattern '[-x1-3' of modifier ':M' +make: "varmod-match.mk" line 314: while evaluating variable "WORDS": warning: Unfinished character list in pattern '*[-x1-3' of modifier ':M' +make: "varmod-match.mk" line 323: while evaluating variable "WORDS": warning: Unfinished character list in pattern '[^-x1-3' of modifier ':M' +make: "varmod-match.mk" line 337: while evaluating variable "WORDS": warning: Unfinished character list in pattern '?[\' of modifier ':M' +make: "varmod-match.mk" line 345: while evaluating variable "WORDS": warning: Unfinished character range in pattern '[x-' of modifier ':M' +make: "varmod-match.mk" line 357: while evaluating variable "WORDS": warning: Unfinished character range in pattern '[^x-' of modifier ':M' +make: "varmod-match.mk" line 365: while evaluating variable " : :: ": warning: Unfinished character list in pattern '[' of modifier ':M' +make: "varmod-match.mk" line 365: while evaluating variable " : :: ": Unknown modifier "]" +make: "varmod-match.mk" line 365: Malformed conditional (${ ${:U\:} ${:U\:\:} :L:M[:]} != ":") make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/varmod-match.mk diff -u src/usr.bin/make/unit-tests/varmod-match.mk:1.21 src/usr.bin/make/unit-tests/varmod-match.mk:1.22 --- src/usr.bin/make/unit-tests/varmod-match.mk:1.21 Sat Apr 20 10:18:55 2024 +++ src/usr.bin/make/unit-tests/varmod-match.mk Tue Apr 23 22:51:28 2024 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-match.mk,v 1.21 2024/04/20 10:18:55 rillig Exp $ +# $NetBSD: varmod-match.mk,v 1.22 2024/04/23 22:51:28 rillig Exp $ # # Tests for the ':M' modifier, which keeps only those words that match the # given pattern. @@ -33,22 +33,22 @@ # The pattern character '?' matches exactly 1 character, the pattern character # '*' matches 0 or more characters. The whole pattern matches all words that # start with 's' and have 3 or more characters. -.if ${One Two Three Four five six seven:L:Ms??*} != "six seven" +.if ${One Two Three Four five six seven so s:L:Ms??*} != "six seven" . error .endif -# Ensure that a pattern without placeholders only matches itself. +# A pattern without placeholders only matches itself. .if ${a aa aaa b ba baa bab:L:Ma} != "a" . error .endif -# Ensure that a pattern that ends with '*' is properly anchored at the +# A pattern that ends with '*' is anchored at the # beginning. .if ${a aa aaa b ba baa bab:L:Ma*} != "a aa aaa" . error .endif -# Ensure that a pattern that starts with '*' is properly anchored at the end. +# A pattern that starts with '*' is anchored at the end. .if ${a aa aaa b ba baa bab:L:M*a} != "a aa aaa ba baa" . error .endif @@ -257,8 +257,9 @@ ${:U*}= asterisk . error .endif -# Without the modifier ':tW', the string is split into words. All whitespace -# around and between the words is normalized to a single space. +# Without the modifier ':tW', the string is split into words. Whitespace +# around the words is discarded, and whitespace between the words is +# normalized to a single space. .if ${ plain string :L:M*} != "plain string" . error .endif @@ -372,9 +373,16 @@ WORDS= [x- x x- y yyyyy # Before var.c 1.1031 from 2022-08-24, the following expressions caused an # out-of-bounds read beyond the indirect ':M' modifiers. -.if ${:U:${:UM\\}} # The ':M' pattern need not be unescaped, the -. error # resulting pattern is '\', it never matches -.endif # anything. -.if ${:U:${:UM\\\:\\}} # The ':M' pattern must be unescaped, the -. error # resulting pattern is ':\', it never matches -.endif # anything. +# +# The argument to the inner ':U' is unescaped to 'M\'. +# This 'M\' becomes an # indirect modifier ':M' with the pattern '\'. +# The pattern '\' never matches. +.if ${:U:${:UM\\}} +. error +.endif +# The argument to the inner ':U' is unescaped to 'M\:\'. +# This 'M\:\' becomes an indirect modifier ':M' with the pattern ':\'. +# The pattern ':\' never matches. +.if ${:U:${:UM\\\:\\}} +. error +.endif