Module Name: src
Committed By: rillig
Date: Tue Jan 14 21:23:17 UTC 2025
Modified Files:
src/usr.bin/make: parse.c
src/usr.bin/make/unit-tests: dep-var.exp dep-var.mk deptgt.exp
directive-export-impl.exp suff.exp varname.exp
Log Message:
make: simplify parsing of dependency lines
The evaluation modes that allow or deny undefined variables have the same
effect in this case, as Var_Subst does not return an error marker.
To generate a diff of this commit:
cvs rdiff -u -r1.736 -r1.737 src/usr.bin/make/parse.c
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/dep-var.exp
cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/dep-var.mk
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/make/unit-tests/deptgt.exp \
src/usr.bin/make/unit-tests/directive-export-impl.exp
cvs rdiff -u -r1.2 -r1.3 src/usr.bin/make/unit-tests/suff.exp
cvs rdiff -u -r1.23 -r1.24 src/usr.bin/make/unit-tests/varname.exp
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/parse.c
diff -u src/usr.bin/make/parse.c:1.736 src/usr.bin/make/parse.c:1.737
--- src/usr.bin/make/parse.c:1.736 Thu Oct 31 09:12:13 2024
+++ src/usr.bin/make/parse.c Tue Jan 14 21:23:17 2025
@@ -1,4 +1,4 @@
-/* $NetBSD: parse.c,v 1.736 2024/10/31 09:12:13 rillig Exp $ */
+/* $NetBSD: parse.c,v 1.737 2025/01/14 21:23:17 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.736 2024/10/31 09:12:13 rillig Exp $");
+MAKE_RCSID("$NetBSD: parse.c,v 1.737 2025/01/14 21:23:17 rillig Exp $");
/* Detects a multiple-inclusion guard in a makefile. */
typedef enum {
@@ -2839,7 +2839,6 @@ FindSemicolon(char *p)
static void
ParseDependencyLine(char *line)
{
- VarEvalMode emode;
char *expanded_line;
const char *shellcmd = NULL;
@@ -2852,41 +2851,7 @@ ParseDependencyLine(char *line)
}
}
- /*
- * We now know it's a dependency line, so it needs to have all
- * variables expanded before being parsed.
- *
- * XXX: Ideally the dependency line would first be split into
- * its left-hand side, dependency operator and right-hand side,
- * and then each side would be expanded on its own. This would
- * allow for the left-hand side to allow only defined variables
- * and to allow variables on the right-hand side to be undefined
- * as well.
- *
- * Parsing the line first would also prevent that targets
- * generated from expressions are interpreted as the
- * dependency operator, such as in "target${:U\:} middle: source",
- * in which the middle is interpreted as a source, not a target.
- */
-
- /*
- * In lint mode, allow undefined variables to appear in dependency
- * lines.
- *
- * Ideally, only the right-hand side would allow undefined variables
- * since it is common to have optional dependencies. Having undefined
- * variables on the left-hand side is more unusual though. Since
- * both sides are expanded in a single pass, there is not much choice
- * what to do here.
- *
- * In normal mode, it does not matter whether undefined variables are
- * allowed or not since as of 2020-09-14, Var_Parse does not print
- * any parse errors in such a case. It simply returns the special
- * empty string var_Error, which cannot be detected in the result of
- * Var_Subst.
- */
- emode = opts.strict ? VARE_EVAL : VARE_EVAL_DEFINED;
- expanded_line = Var_Subst(line, SCOPE_CMDLINE, emode);
+ expanded_line = Var_Subst(line, SCOPE_CMDLINE, VARE_EVAL);
/* TODO: handle errors */
/* Need a fresh list for the target nodes */
Index: src/usr.bin/make/unit-tests/dep-var.exp
diff -u src/usr.bin/make/unit-tests/dep-var.exp:1.9 src/usr.bin/make/unit-tests/dep-var.exp:1.10
--- src/usr.bin/make/unit-tests/dep-var.exp:1.9 Sat Jan 11 21:21:33 2025
+++ src/usr.bin/make/unit-tests/dep-var.exp Tue Jan 14 21:23:17 2025
@@ -1,4 +1,4 @@
-Var_Parse: ${UNDEF1} (eval-defined)
+Var_Parse: ${UNDEF1} (eval)
Global: .ALLTARGETS = all
Global: .ALLTARGETS = all ${DEF2}
Global: .ALLTARGETS = all ${DEF2} a-${DEF2}-b
@@ -10,7 +10,7 @@ Global: INDIRECT_3 = indirect
Global: UNDEF1 = undef1
Global: DEF2 = def2
Global: .ALLTARGETS = all ${DEF2} a-${DEF2}-b ${UNDEF3} 1-${INDIRECT_1}-1 $$)
-Var_Parse: ${:U\$)}: (eval-defined)
+Var_Parse: ${:U\$)}: (eval)
Evaluating modifier ${:U...} on value "" (eval, undefined)
Result of ${:U\$)} is "$)" (eval, defined)
Global: .ALLTARGETS = all ${DEF2} a-${DEF2}-b ${UNDEF3} 1-${INDIRECT_1}-1 $$) undef1
Index: src/usr.bin/make/unit-tests/dep-var.mk
diff -u src/usr.bin/make/unit-tests/dep-var.mk:1.12 src/usr.bin/make/unit-tests/dep-var.mk:1.13
--- src/usr.bin/make/unit-tests/dep-var.mk:1.12 Sun Jun 2 15:31:26 2024
+++ src/usr.bin/make/unit-tests/dep-var.mk Tue Jan 14 21:23:17 2025
@@ -1,4 +1,4 @@
-# $NetBSD: dep-var.mk,v 1.12 2024/06/02 15:31:26 rillig Exp $
+# $NetBSD: dep-var.mk,v 1.13 2025/01/14 21:23:17 rillig Exp $
#
# Tests for variable references in dependency declarations.
#
@@ -7,10 +7,8 @@
.MAKEFLAGS: -dv
-# expect: Var_Parse: ${UNDEF1} (eval-defined)
-# Even though undefined expressions should lead to errors, no error message is
-# generated for this line. The expression ${UNDEF1} simply expands
-# to an empty string.
+# In a dependency line, an undefined expressions expands to an empty string.
+# expect: Var_Parse: ${UNDEF1} (eval)
all: ${UNDEF1}
# Using a double dollar in order to circumvent immediate expression expansion
@@ -21,11 +19,7 @@ all: ${UNDEF1}
# is defined, so everything's fine.
all: $${DEF2} a-$${DEF2}-b
-# This variable is not defined at all.
-# XXX: The -dv log says later when expanding the sources of 'all':
-# Var_Parse: ${UNDEF3} (eval-defined)
-# but no error message is generated for this line, just like for UNDEF1.
-# The expression ${UNDEF3} simply expands to an empty string.
+# This variable is neither defined now nor later.
all: $${UNDEF3}
# Try out how many levels of indirection are really expanded in dependency
@@ -83,14 +77,10 @@ all: $$$$)
# Since 2020-09-13, this generates a parse error in lint mode (-dL), but not
# in normal mode since ParseDependency does not handle any errors after
# calling Var_Parse.
-# expect: Var_Parse: ${:U\$)}: (eval-defined)
+# expect: Var_Parse: ${:U\$)}: (eval)
# expect: Var_Parse: $INDIRECT_2-2-1 $): (parse)
# expect: Var_Parse: $): (parse)
undef1 def2 a-def2-b 1-2-$$INDIRECT_2-2-1 ${:U\$)}:
@echo ${.TARGET:Q}
.MAKEFLAGS: -d0
-
-# XXX: The exit status is still 0, even though Parse_Error is called with
-# PARSE_FATAL in SuffExpandChildren. The exit status is only affected by
-# parse errors when they occur in the parsing phase, see Parse_File.
Index: src/usr.bin/make/unit-tests/deptgt.exp
diff -u src/usr.bin/make/unit-tests/deptgt.exp:1.20 src/usr.bin/make/unit-tests/deptgt.exp:1.21
--- src/usr.bin/make/unit-tests/deptgt.exp:1.20 Fri Jan 10 23:00:38 2025
+++ src/usr.bin/make/unit-tests/deptgt.exp Tue Jan 14 21:23:17 2025
@@ -8,8 +8,8 @@ ParseDependency(: empty-source)
Parsing deptgt.mk:39: : command for empty targets list
Parsing deptgt.mk:40: .MAKEFLAGS: -d0
ParseDependency(.MAKEFLAGS: -d0)
-Var_Parse: ${UNDEF}: depsrc-${UNDEF} (eval-defined)
-Var_Parse: ${UNDEF} (eval-defined)
+Var_Parse: ${UNDEF}: depsrc-${UNDEF} (eval)
+Var_Parse: ${UNDEF} (eval)
Global: .ALLTARGETS = target1 target2 sources empty-source deptgt-
Global: .ALLTARGETS = target1 target2 sources empty-source deptgt- depsrc-
Global: .MAKEFLAGS = -r -k -d p -d 0 -d v -d
Index: src/usr.bin/make/unit-tests/directive-export-impl.exp
diff -u src/usr.bin/make/unit-tests/directive-export-impl.exp:1.20 src/usr.bin/make/unit-tests/directive-export-impl.exp:1.21
--- src/usr.bin/make/unit-tests/directive-export-impl.exp:1.20 Sat Jan 11 21:21:33 2025
+++ src/usr.bin/make/unit-tests/directive-export-impl.exp Tue Jan 14 21:23:17 2025
@@ -3,7 +3,7 @@ Global: UT_VAR = <${REF}>
Parsing directive-export-impl.mk:28: .export UT_VAR
Global: .MAKE.EXPORTED = UT_VAR
Parsing directive-export-impl.mk:32: : ${UT_VAR:N*}
-Var_Parse: ${UT_VAR:N*} (eval-defined)
+Var_Parse: ${UT_VAR:N*} (eval)
Var_Parse: ${REF}> (eval)
Evaluating modifier ${UT_VAR:N...} on value "<>"
Pattern for ':N' is "*"
@@ -26,7 +26,7 @@ Var_Parse: ${REF}> (eval)
Result of ${:!echo "\$UT_VAR"!} is "<>" (eval, defined)
Comparing "<>" != "<>"
Parsing directive-export-impl.mk:50: : ${UT_VAR:N*}
-Var_Parse: ${UT_VAR:N*} (eval-defined)
+Var_Parse: ${UT_VAR:N*} (eval)
Var_Parse: ${REF}> (eval)
Evaluating modifier ${UT_VAR:N...} on value "<>"
Pattern for ':N' is "*"
Index: src/usr.bin/make/unit-tests/suff.exp
diff -u src/usr.bin/make/unit-tests/suff.exp:1.2 src/usr.bin/make/unit-tests/suff.exp:1.3
--- src/usr.bin/make/unit-tests/suff.exp:1.2 Sun Jan 12 23:10:30 2025
+++ src/usr.bin/make/unit-tests/suff.exp Tue Jan 14 21:23:17 2025
@@ -4,8 +4,8 @@ defining transformation from `.from' to
inserting ".from" (1) at end of list
inserting ".to" (2) at end of list
transformation .from.to complete
-Var_Parse: ${.PREFIX}${.ARCHIVE}.additional (eval-defined)
-Var_Parse: ${.ARCHIVE}.additional (eval-defined)
+Var_Parse: ${.PREFIX}${.ARCHIVE}.additional (eval)
+Var_Parse: ${.ARCHIVE}.additional (eval)
Global: .ALLTARGETS = step1 edge-case.to everything ${.PREFIX}${.ARCHIVE}.additional
Global: .ALLTARGETS = step1 edge-case.to everything ${.PREFIX}${.ARCHIVE}.additional edge-case.from
Global: .ALLTARGETS = step1 edge-case.to everything ${.PREFIX}${.ARCHIVE}.additional edge-case.from edge-case.additional
Index: src/usr.bin/make/unit-tests/varname.exp
diff -u src/usr.bin/make/unit-tests/varname.exp:1.23 src/usr.bin/make/unit-tests/varname.exp:1.24
--- src/usr.bin/make/unit-tests/varname.exp:1.23 Sat Jan 11 21:21:34 2025
+++ src/usr.bin/make/unit-tests/varname.exp Tue Jan 14 21:23:17 2025
@@ -7,7 +7,7 @@ Var_Parse: ${VAR(((}}}}" != "3 open pare
Global: .ALLTARGETS = VAR(((=)
make: "varname.mk" line 32: Missing ')' in archive specification
make: "varname.mk" line 32: Error in archive specification: "VAR"
-Var_Parse: ${:UVAR\(\(\(}= try2 (eval-defined)
+Var_Parse: ${:UVAR\(\(\(}= try2 (eval)
Evaluating modifier ${:U...} on value "" (eval, undefined)
Result of ${:UVAR\(\(\(} is "VAR\(\(\(" (eval, defined)
Global: .ALLTARGETS = VAR(((=) VAR\(\(\(=