Module Name: src
Committed By: rillig
Date: Thu Oct 19 18:24:33 UTC 2023
Modified Files:
src/usr.bin/make/unit-tests: cond-short.exp cond-short.mk
directive-for.exp directive-for.mk directive-ifndef.mk
directive-include-guard.exp directive-include-guard.mk escape.exp
escape.mk hanoi-include.mk recursive.exp recursive.mk unexport.mk
var-eval-short.mk varmisc.exp varmisc.mk varmod-gmtime.mk
Log Message:
tests/make: clean up, explain and reorganize several tests
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/cond-short.exp \
src/usr.bin/make/unit-tests/directive-include-guard.mk
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/make/unit-tests/cond-short.mk
cvs rdiff -u -r1.19 -r1.20 src/usr.bin/make/unit-tests/directive-for.exp \
src/usr.bin/make/unit-tests/varmod-gmtime.mk
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/make/unit-tests/directive-for.mk
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/directive-ifndef.mk
cvs rdiff -u -r1.11 -r1.12 \
src/usr.bin/make/unit-tests/directive-include-guard.exp
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/escape.exp
cvs rdiff -u -r1.14 -r1.15 src/usr.bin/make/unit-tests/escape.mk
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/hanoi-include.mk \
src/usr.bin/make/unit-tests/recursive.exp
cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/recursive.mk
cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/unexport.mk
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/var-eval-short.mk
cvs rdiff -u -r1.17 -r1.18 src/usr.bin/make/unit-tests/varmisc.exp
cvs rdiff -u -r1.32 -r1.33 src/usr.bin/make/unit-tests/varmisc.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/unit-tests/cond-short.exp
diff -u src/usr.bin/make/unit-tests/cond-short.exp:1.12 src/usr.bin/make/unit-tests/cond-short.exp:1.13
--- src/usr.bin/make/unit-tests/cond-short.exp:1.12 Sat Mar 4 13:42:36 2023
+++ src/usr.bin/make/unit-tests/cond-short.exp Thu Oct 19 18:24:33 2023
@@ -7,7 +7,7 @@ expected M pattern
expected or
expected or exists
expected or empty
-make: "cond-short.mk" line 214: Comparison with '<' requires both operands '' and '42' to be numeric
+make: "cond-short.mk" line 231: Comparison with '<' requires both operands '' and '42' to be numeric
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/directive-include-guard.mk
diff -u src/usr.bin/make/unit-tests/directive-include-guard.mk:1.12 src/usr.bin/make/unit-tests/directive-include-guard.mk:1.13
--- src/usr.bin/make/unit-tests/directive-include-guard.mk:1.12 Fri Aug 11 04:56:31 2023
+++ src/usr.bin/make/unit-tests/directive-include-guard.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: directive-include-guard.mk,v 1.12 2023/08/11 04:56:31 rillig Exp $
+# $NetBSD: directive-include-guard.mk,v 1.13 2023/10/19 18:24:33 rillig Exp $
#
# Tests for multiple-inclusion guards in makefiles.
#
@@ -15,8 +15,9 @@
# .endif
#
# When such a file is included for the second or later time, and the guard
-# variable or the guard target is defined, including the file has no effect,
-# as all its content is skipped.
+# variable or the guard target is defined, the file is skipped completely, as
+# including it would not have any effect, not even on the special variable
+# '.MAKE.MAKEFILES', as that variable skips duplicate pathnames.
#
# See also:
# https://gcc.gnu.org/onlinedocs/cppinternals/Guard-Macros.html
@@ -46,6 +47,25 @@ LINES.variable-ifndef-reuse= \
# expect: Parse_PushInput: file variable-ifndef-reuse.tmp, line 1
# expect: Skipping 'variable-ifndef-reuse.tmp' because 'VARIABLE_IFNDEF' is defined
+# The guard variable cannot be a number, as numbers are interpreted
+# differently from bare words.
+INCS+= variable-ifndef-zero
+LINES.variable-ifndef-zero= \
+ '.ifndef 0e0' \
+ 'syntax error' \
+ '.endif'
+# expect: Parse_PushInput: file variable-ifndef-zero.tmp, line 1
+# expect: Parse_PushInput: file variable-ifndef-zero.tmp, line 1
+
+# The guard variable cannot be a number, as numbers are interpreted
+# differently from bare words.
+INCS+= variable-ifndef-one
+LINES.variable-ifndef-one= \
+ '.ifndef 1' \
+ '.endif'
+# expect: Parse_PushInput: file variable-ifndef-one.tmp, line 1
+# expect: Parse_PushInput: file variable-ifndef-one.tmp, line 1
+
# Comments and empty lines do not affect the multiple-inclusion guard.
INCS+= comments
LINES.comments= \
@@ -124,10 +144,10 @@ LINES.variable-name-exclamation= \
# expect: Parse_PushInput: file variable-name-exclamation.tmp, line 1
# expect: Parse_PushInput: file variable-name-exclamation.tmp, line 1
-# A variable name can contain a '!' in the middle, as that character is
-# interpreted as an ordinary character in conditions as well as on the left
-# side of a variable assignment. For guard variable names, the '!' is not
-# supported in any place, though.
+# In general, a variable name can contain a '!' in the middle, as that
+# character is interpreted as an ordinary character in conditions as well as
+# on the left side of a variable assignment. For guard variable names, the
+# '!' is not supported in any place, though.
INCS+= variable-name-exclamation-middle
LINES.variable-name-exclamation-middle= \
'.ifndef VARIABLE_NAME!MIDDLE' \
Index: src/usr.bin/make/unit-tests/cond-short.mk
diff -u src/usr.bin/make/unit-tests/cond-short.mk:1.20 src/usr.bin/make/unit-tests/cond-short.mk:1.21
--- src/usr.bin/make/unit-tests/cond-short.mk:1.20 Sat Mar 4 13:42:36 2023
+++ src/usr.bin/make/unit-tests/cond-short.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: cond-short.mk,v 1.20 2023/03/04 13:42:36 rillig Exp $
+# $NetBSD: cond-short.mk,v 1.21 2023/10/19 18:24:33 rillig Exp $
#
# Demonstrates that in conditions, the right-hand side of an && or ||
# is only evaluated if it can actually influence the result.
@@ -178,6 +178,23 @@ INDIR_UNDEF= ${UNDEF}
. error
.endif
+
+# Since cond.c 1.76 from 2020.06.28 and before var.c 1.225 from 2020.07.01,
+# the following snippet resulted in the error message 'Variable VAR is
+# recursive'. The condition '0' evaluated to false, which made the right-hand
+# side of the '&&' irrelevant. Back then, irrelevant condition parts were
+# still evaluated, but in "irrelevant mode", which allowed undefined variables
+# to occur in expressions. In this mode, the variable name 'VAR' was
+# unnecessarily evaluated, resulting in the expression '${VAR${:U1}}'. In
+# this expression, the variable name was 'VAR${:U1}', and of this variable
+# name, only the fixed part 'VAR' was evaluated, without the part '${:U1}'.
+# This partial evaluation led to the wrong error message about 'VAR' being
+# recursive.
+VAR= ${VAR${:U1}}
+.if 0 && !empty(VAR)
+.endif
+
+
# Enclosing the expression in double quotes changes how that expression is
# evaluated. In irrelevant expressions that are enclosed in double quotes,
# expressions based on undefined variables are allowed and evaluate to an
Index: src/usr.bin/make/unit-tests/directive-for.exp
diff -u src/usr.bin/make/unit-tests/directive-for.exp:1.19 src/usr.bin/make/unit-tests/directive-for.exp:1.20
--- src/usr.bin/make/unit-tests/directive-for.exp:1.19 Thu Jun 1 20:56:35 2023
+++ src/usr.bin/make/unit-tests/directive-for.exp Thu Oct 19 18:24:33 2023
@@ -18,13 +18,14 @@ make: "directive-for.mk" line 166: inval
make: "directive-for.mk" line 173: invalid character '$' in .for loop variable name
make: "directive-for.mk" line 185: invalid character '$' in .for loop variable name
make: "directive-for.mk" line 196: Unknown modifier "Z"
-make: "directive-for.mk" line 197: XXX: Not reached word1
-make: "directive-for.mk" line 197: XXX: Not reached word3
-make: "directive-for.mk" line 204: no iteration variables in for
-make: "directive-for.mk" line 230: 1 open conditional
-make: "directive-for.mk" line 246: for-less endfor
-make: "directive-for.mk" line 247: if-less endif
-make: "directive-for.mk" line 255: if-less endif
+make: "directive-for.mk" line 197: XXX: Should not reach word1
+make: "directive-for.mk" line 197: XXX: Should not reach before--after
+make: "directive-for.mk" line 197: XXX: Should not reach word3
+make: "directive-for.mk" line 205: no iteration variables in for
+make: "directive-for.mk" line 231: 1 open conditional
+make: "directive-for.mk" line 247: for-less endfor
+make: "directive-for.mk" line 248: if-less endif
+make: "directive-for.mk" line 256: if-less endif
For: new loop 2
For: end for 2
For: end for 1
@@ -35,7 +36,7 @@ For: loop body with outer = o:
endfor
For: end for 1
For: loop body with inner = i:
-make: "directive-for.mk" line 303: newline-item=(a)
+make: "directive-for.mk" line 304: newline-item=(a)
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/varmod-gmtime.mk
diff -u src/usr.bin/make/unit-tests/varmod-gmtime.mk:1.19 src/usr.bin/make/unit-tests/varmod-gmtime.mk:1.20
--- src/usr.bin/make/unit-tests/varmod-gmtime.mk:1.19 Sat Aug 19 11:53:10 2023
+++ src/usr.bin/make/unit-tests/varmod-gmtime.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-gmtime.mk,v 1.19 2023/08/19 11:53:10 rillig Exp $
+# $NetBSD: varmod-gmtime.mk,v 1.20 2023/10/19 18:24:33 rillig Exp $
#
# Tests for the :gmtime variable modifier, which formats a timestamp
# using strftime(3) in UTC.
@@ -174,4 +174,15 @@ TIMESTAMPS+= $t
. endif
.endfor
+
+.if ${year=%Y month=%m day=%d:L:gmtime=1459494000} != "year=2016 month=04 day=01"
+. error
+.endif
+# Slightly contorted syntax to convert a UTC timestamp from an expression to a
+# formatted timestamp.
+.if ${%Y%m%d:L:${gmtime=${:U1459494000}:L}} != "20160401"
+. error
+.endif
+
+
all:
Index: src/usr.bin/make/unit-tests/directive-for.mk
diff -u src/usr.bin/make/unit-tests/directive-for.mk:1.22 src/usr.bin/make/unit-tests/directive-for.mk:1.23
--- src/usr.bin/make/unit-tests/directive-for.mk:1.22 Thu Jun 1 20:56:35 2023
+++ src/usr.bin/make/unit-tests/directive-for.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for.mk,v 1.22 2023/06/01 20:56:35 rillig Exp $
+# $NetBSD: directive-for.mk,v 1.23 2023/10/19 18:24:33 rillig Exp $
#
# Tests for the .for directive.
#
@@ -193,11 +193,12 @@ INDIRECT= direct
# should skip the whole loop. As of 2023-05-09, the loop is expanded as
# usual.
# expect+1: Unknown modifier "Z"
-.for var in word1 ${:Uword2:Z} word3
-. info XXX: Not reached ${var}
+.for var in word1 before-${:Uword2:Z}-after word3
+. info XXX: Should not reach ${var}
.endfor
-# expect-2: XXX: Not reached word1
-# expect-3: XXX: Not reached word3
+# expect-2: XXX: Should not reach word1
+# expect-3: XXX: Should not reach before--after
+# expect-4: XXX: Should not reach word3
# An empty list of variables to the left of the 'in' is a parse error.
Index: src/usr.bin/make/unit-tests/directive-ifndef.mk
diff -u src/usr.bin/make/unit-tests/directive-ifndef.mk:1.8 src/usr.bin/make/unit-tests/directive-ifndef.mk:1.9
--- src/usr.bin/make/unit-tests/directive-ifndef.mk:1.8 Mon Jun 19 20:44:06 2023
+++ src/usr.bin/make/unit-tests/directive-ifndef.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: directive-ifndef.mk,v 1.8 2023/06/19 20:44:06 rillig Exp $
+# $NetBSD: directive-ifndef.mk,v 1.9 2023/10/19 18:24:33 rillig Exp $
#
# Tests for the .ifndef directive, which can be used for multiple-inclusion
# guards. In contrast to C, where #ifndef and #define nicely line up the
@@ -50,4 +50,38 @@ DEFINED=
. error
.endif
+
+# The negation from the 'if-not-defined' directive only applies to bare words,
+# but not to numbers, quoted strings or expressions. Those are evaluated
+# without extra negation, just like in a plain '.if' directive.
+.ifndef 0
+. error
+.endif
+.ifndef 1
+.else
+. error
+.endif
+.ifndef ""
+. error
+.endif
+.ifndef "word"
+.else
+. error
+.endif
+.ifndef ${:UUNDEFINED}
+.else
+. error
+.endif
+.ifndef ${:UDEFINED}
+. error
+.endif
+.ifndef ${:U0}
+. error
+.endif
+.ifndef ${:U1}
+.else
+. error
+.endif
+
+
all:
Index: src/usr.bin/make/unit-tests/directive-include-guard.exp
diff -u src/usr.bin/make/unit-tests/directive-include-guard.exp:1.11 src/usr.bin/make/unit-tests/directive-include-guard.exp:1.12
--- src/usr.bin/make/unit-tests/directive-include-guard.exp:1.11 Fri Aug 11 04:56:31 2023
+++ src/usr.bin/make/unit-tests/directive-include-guard.exp Thu Oct 19 18:24:33 2023
@@ -2,6 +2,10 @@ Parse_PushInput: file variable-ifndef.tm
Skipping 'variable-ifndef.tmp' because 'VARIABLE_IFNDEF' is defined
Parse_PushInput: file variable-ifndef-reuse.tmp, line 1
Skipping 'variable-ifndef-reuse.tmp' because 'VARIABLE_IFNDEF' is defined
+Parse_PushInput: file variable-ifndef-zero.tmp, line 1
+Parse_PushInput: file variable-ifndef-zero.tmp, line 1
+Parse_PushInput: file variable-ifndef-one.tmp, line 1
+Parse_PushInput: file variable-ifndef-one.tmp, line 1
Parse_PushInput: file comments.tmp, line 1
Skipping 'comments.tmp' because 'COMMENTS' is defined
Parse_PushInput: file variable-if.tmp, line 1
Index: src/usr.bin/make/unit-tests/escape.exp
diff -u src/usr.bin/make/unit-tests/escape.exp:1.7 src/usr.bin/make/unit-tests/escape.exp:1.8
--- src/usr.bin/make/unit-tests/escape.exp:1.7 Tue Sep 9 10:22:27 2014
+++ src/usr.bin/make/unit-tests/escape.exp Thu Oct 19 18:24:33 2023
@@ -1,5 +1,4 @@
var-1bs
-printf "%s=:%s:\n" VAR1BS 111\\111; printf "%s=:%s:\n" VAR1BSa 111\\aaa; printf "%s=:%s:\n" VAR1BSA 111\\aaa; printf "%s=:%s:\n" VAR1BSda 111\\\$\{a\}; printf "%s=:%s:\n" VAR1BSdA 111\\\$\{A\}; printf "%s=:%s:\n" VAR1BSc 111\#\ backslash\ escapes\ comment\ char,\ so\ this\ is\ part\ of\ the\ value; printf "%s=:%s:\n" VAR1BSsc 111\\\ ;
VAR1BS=:111\111:
VAR1BSa=:111\aaa:
VAR1BSA=:111\aaa:
@@ -8,25 +7,22 @@ VAR1BSdA=:111\${A}:
VAR1BSc=:111# backslash escapes comment char, so this is part of the value:
VAR1BSsc=:111\ :
var-2bs
-printf "%s=:%s:\n" VAR2BS 222\\\\222; printf "%s=:%s:\n" VAR2BSa 222\\\\aaa; printf "%s=:%s:\n" VAR2BSA 222\\\\aaa; printf "%s=:%s:\n" VAR2BSda 222\\\\\$\{a\}; printf "%s=:%s:\n" VAR2BSdA 222\\\\\$\{A\}; printf "%s=:%s:\n" VAR2BSc 222\\\\; printf "%s=:%s:\n" VAR2BSsc 222\\\\;
-VAR2BS=:222\\222:
-VAR2BSa=:222\\aaa:
-VAR2BSA=:222\\aaa:
-VAR2BSda=:222\\${a}:
-VAR2BSdA=:222\\${A}:
-VAR2BSc=:222\\:
-VAR2BSsc=:222\\:
-var-1bsnl
-printf "%s=:%s:\n" VAR1BSNL 111\ 111; printf "%s=:%s:\n" VAR1BSNLa 111\ aaa; printf "%s=:%s:\n" VAR1BSNLA 111\ aaa; printf "%s=:%s:\n" VAR1BSNLda 111\ \$\{a\}; printf "%s=:%s:\n" VAR1BSNLdA 111\ \$\{A\}; printf "%s=:%s:\n" VAR1BSNLc 111; printf "%s=:%s:\n" VAR1BSNLsc 111;
-VAR1BSNL=:111 111:
-VAR1BSNLa=:111 aaa:
-VAR1BSNLA=:111 aaa:
-VAR1BSNLda=:111 ${a}:
-VAR1BSNLdA=:111 ${A}:
-VAR1BSNLc=:111:
-VAR1BSNLsc=:111:
+VAR2.BS=:222\\222:
+VAR2.BS.a=:222\\aaa:
+VAR2.BS.A=:222\\aaa:
+VAR2.BS.d.a=:222\\${a}:
+VAR2.BS.d.A=:222\\${A}:
+VAR2.BS.c=:222\\:
+VAR2.BS.s.c=:222\\:
+var-1bs-nl
+VAR1.BS-NL=:111 111:
+VAR1.BS-NL.a=:111 aaa:
+VAR1.BS-NL.A=:111 aaa:
+VAR1.BS-NL.d-a=:111 ${a}:
+VAR1.BS-NL.d-A=:111 ${A}:
+VAR1.BS-NL.c=:111:
+VAR1.BS-NL.s-c=:111:
var-2bsnl
-printf "%s=:%s:\n" VAR2BSNL 222\\\\; printf "%s=:%s:\n" VAR2BSNLa 222\\\\; printf "%s=:%s:\n" VAR2BSNLA 222\\\\; printf "%s=:%s:\n" VAR2BSNLda 222\\\\; printf "%s=:%s:\n" VAR2BSNLdA 222\\\\; printf "%s=:%s:\n" VAR2BSNLc 222\\\\; printf "%s=:%s:\n" VAR2BSNLsc 222\\\\;
VAR2BSNL=:222\\:
VAR2BSNLa=:222\\:
VAR2BSNLA=:222\\:
@@ -35,7 +31,6 @@ VAR2BSNLdA=:222\\:
VAR2BSNLc=:222\\:
VAR2BSNLsc=:222\\:
var-3bsnl
-printf "%s=:%s:\n" VAR3BSNL 333\\\\\ 333=; printf "%s=:%s:\n" VAR3BSNLa 333\\\\\ aaa=; printf "%s=:%s:\n" VAR3BSNLA 333\\\\\ aaa=; printf "%s=:%s:\n" VAR3BSNLda 333\\\\\ \$\{a\}=; printf "%s=:%s:\n" VAR3BSNLdA 333\\\\\ \$\{A\}=; printf "%s=:%s:\n" VAR3BSNLc 333\\\\; printf "%s=:%s:\n" VAR3BSNLsc 333\\\\;
VAR3BSNL=:333\\ 333=:
VAR3BSNLa=:333\\ aaa=:
VAR3BSNLA=:333\\ aaa=:
@@ -44,7 +39,6 @@ VAR3BSNLdA=:333\\ ${A}=:
VAR3BSNLc=:333\\:
VAR3BSNLsc=:333\\:
var-1bsnl-space
-printf "%s=:%s:\n" VAR1BSNL00 first\ line; printf "%s=:%s:\n" VAR1BSNL0 first\ line\ no\ space\ on\ second\ line; printf "%s=:%s:\n" VAR1BSNLs first\ line\ one\ space\ on\ second\ line; printf "%s=:%s:\n" VAR1BSNLss first\ line\ two\ spaces\ on\ second\ line; printf "%s=:%s:\n" VAR1BSNLt first\ line\ one\ tab\ on\ second\ line; printf "%s=:%s:\n" VAR1BSNLtt first\ line\ two\ tabs\ on\ second\ line; printf "%s=:%s:\n" VAR1BSNLxx first\ line\ many\ spaces\ and\ tabs\ \[\ \ \ \ \]\ on\ second\ line;
VAR1BSNL00=:first line:
VAR1BSNL0=:first line no space on second line:
VAR1BSNLs=:first line one space on second line:
Index: src/usr.bin/make/unit-tests/escape.mk
diff -u src/usr.bin/make/unit-tests/escape.mk:1.14 src/usr.bin/make/unit-tests/escape.mk:1.15
--- src/usr.bin/make/unit-tests/escape.mk:1.14 Tue Nov 3 17:38:45 2020
+++ src/usr.bin/make/unit-tests/escape.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: escape.mk,v 1.14 2020/11/03 17:38:45 rillig Exp $
+# $NetBSD: escape.mk,v 1.15 2023/10/19 18:24:33 rillig Exp $
#
# Test backslash escaping.
@@ -53,7 +53,7 @@ should continue the comment. \
__printvars: .USE .MADE
@echo ${.TARGET}
- ${.ALLSRC:@v@ printf "%s=:%s:\n" ${v:Q} ${${v}:Q}; @}
+ @${.ALLSRC:@v@ printf "%s=:%s:\n" ${v:Q} ${${v}:Q}; @}
# Embedded backslash in variable should be taken literally.
#
@@ -83,7 +83,8 @@ all: var-2bs
var-2bs: .PHONY __printvars VAR2BS VAR2BSa VAR2BSA VAR2BSda VAR2BSdA \
VAR2BSc VAR2BSsc
-# Backslash-newline in a variable setting is replaced by a single space.
+# In a variable assignment, when the sequence <backslash><newline> occurs at
+# the end of a physical line, it is replaced with a single space.
#
VAR1BSNL= 111\
111
Index: src/usr.bin/make/unit-tests/hanoi-include.mk
diff -u src/usr.bin/make/unit-tests/hanoi-include.mk:1.4 src/usr.bin/make/unit-tests/hanoi-include.mk:1.5
--- src/usr.bin/make/unit-tests/hanoi-include.mk:1.4 Thu Jan 19 22:48:42 2023
+++ src/usr.bin/make/unit-tests/hanoi-include.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: hanoi-include.mk,v 1.4 2023/01/19 22:48:42 rillig Exp $
+# $NetBSD: hanoi-include.mk,v 1.5 2023/10/19 18:24:33 rillig Exp $
#
# Implements the Towers of Hanoi puzzle, demonstrating a bunch of more or less
# useful programming techniques:
@@ -6,14 +6,15 @@
# * default assignment using the ?= assignment operator
# * including the same file recursively (rather unusual)
# * extracting the current value of a variable using the .for loop
-# * using shell commands for calculations since make is a text processor
# * using the :: dependency operator for adding commands to a target
# * on-the-fly variable assignment expressions using the ::= modifier
#
# usage:
# env N=3 make -r -f hanoi-include.mk
#
-# endless loop, since command line variables cannot be overridden:
+# Specifying N in the command line instead of in the environment would produce
+# an endless loop, since variables from the command line cannot be overridden
+# by global variables:
# make -r -f hanoi-include.mk N=3
N?= 5 # Move this number of disks ...
Index: src/usr.bin/make/unit-tests/recursive.exp
diff -u src/usr.bin/make/unit-tests/recursive.exp:1.4 src/usr.bin/make/unit-tests/recursive.exp:1.5
--- src/usr.bin/make/unit-tests/recursive.exp:1.4 Thu Jun 1 20:56:35 2023
+++ src/usr.bin/make/unit-tests/recursive.exp Thu Oct 19 18:24:33 2023
@@ -1,5 +1,5 @@
-make: "recursive.mk" line 37: Unclosed variable "MISSING_PAREN"
-make: "recursive.mk" line 39: Unclosed variable "MISSING_BRACE"
+make: "recursive.mk" line 38: Unclosed variable "MISSING_PAREN"
+make: "recursive.mk" line 40: Unclosed variable "MISSING_BRACE"
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/recursive.mk
diff -u src/usr.bin/make/unit-tests/recursive.mk:1.6 src/usr.bin/make/unit-tests/recursive.mk:1.7
--- src/usr.bin/make/unit-tests/recursive.mk:1.6 Thu Jun 1 20:56:35 2023
+++ src/usr.bin/make/unit-tests/recursive.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: recursive.mk,v 1.6 2023/06/01 20:56:35 rillig Exp $
+# $NetBSD: recursive.mk,v 1.7 2023/10/19 18:24:33 rillig Exp $
#
# In -dL mode, a variable may get expanded before it makes sense.
# This would stop make from doing anything since the "recursive" error
@@ -8,22 +8,23 @@
# whether there are unclosed variables. The variable value is therefore
# parsed with VARE_PARSE_ONLY for that purpose.
#
-# Seen in pkgsrc/x11/libXfixes, and probably many more package that use
-# GNU Automake.
.MAKEFLAGS: -dL
+
AM_V_lt= ${am__v_lt_${V}}
am__v_lt_= ${am__v_lt_${AM_DEFAULT_VERBOSITY}}
am__v_lt_0= --silent
am__v_lt_1=
-# On 2020-08-06, make reported: "Variable am__v_lt_ is recursive."
+# Since parse.c 1.243 from 2020-07-31 and before parse.c 1.249 from
+# 2020-08-06, when make ran in -dL mode, it reported: "Variable am__v_lt_ is
+# recursive."
+#
+# Seen in pkgsrc/x11/libXfixes, and probably many more package that use
+# GNU Automake.
libXfixes_la_LINK= ... ${AM_V_lt} ...
-# somewhere later ...
-AM_DEFAULT_VERBOSITY= 1
-
# The purpose of the -dL flag is to detect unclosed variables. This
# can be achieved by just parsing the variable and not evaluating it.
Index: src/usr.bin/make/unit-tests/unexport.mk
diff -u src/usr.bin/make/unit-tests/unexport.mk:1.5 src/usr.bin/make/unit-tests/unexport.mk:1.6
--- src/usr.bin/make/unit-tests/unexport.mk:1.5 Sat Oct 24 08:50:17 2020
+++ src/usr.bin/make/unit-tests/unexport.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: unexport.mk,v 1.5 2020/10/24 08:50:17 rillig Exp $
+# $NetBSD: unexport.mk,v 1.6 2023/10/19 18:24:33 rillig Exp $
# pick up a bunch of exported vars
FILTER_CMD= grep ^UT_
@@ -10,7 +10,7 @@ UT_TEST= unexport
# Until 2020-08-08, Var_UnExport had special handling for '\n', that code
# was not reachable though. At that point, backslash-newline has already
-# been replaced with a simple space, and variables are not yet expanded.
+# been replaced with a simple space, and expressions are not yet expanded.
UT_BEFORE_NL= before
UT_AFTER_NL= after
.export UT_BEFORE_NL UT_AFTER_NL
Index: src/usr.bin/make/unit-tests/var-eval-short.mk
diff -u src/usr.bin/make/unit-tests/var-eval-short.mk:1.10 src/usr.bin/make/unit-tests/var-eval-short.mk:1.11
--- src/usr.bin/make/unit-tests/var-eval-short.mk:1.10 Thu Jun 1 20:56:35 2023
+++ src/usr.bin/make/unit-tests/var-eval-short.mk Thu Oct 19 18:24:33 2023
@@ -1,4 +1,4 @@
-# $NetBSD: var-eval-short.mk,v 1.10 2023/06/01 20:56:35 rillig Exp $
+# $NetBSD: var-eval-short.mk,v 1.11 2023/10/19 18:24:33 rillig Exp $
#
# Tests for each variable modifier to ensure that they only do the minimum
# necessary computations. If the result of the expression is irrelevant,
@@ -18,7 +18,7 @@ FAIL= ${:!echo unexpected 1>&2!}
# is ignored as well. To do that, it is necessary to step through the code of
# each modifier.
-# TODO: Test the modifiers in the same order as they appear in ApplyModifier.
+# TODO: Test the modifiers in the same order as they occur in ApplyModifier.
.if 0 && ${FAIL}
.endif
Index: src/usr.bin/make/unit-tests/varmisc.exp
diff -u src/usr.bin/make/unit-tests/varmisc.exp:1.17 src/usr.bin/make/unit-tests/varmisc.exp:1.18
--- src/usr.bin/make/unit-tests/varmisc.exp:1.17 Tue Feb 23 15:56:30 2021
+++ src/usr.bin/make/unit-tests/varmisc.exp Thu Oct 19 18:24:33 2023
@@ -17,12 +17,9 @@ false
FALSE
do not evaluate or expand :? if discarding
is set
-year=2016 month=04 day=01
-date=20160401
Version=123.456.789 == 123456789
Literal=3.4.5 == 3004005
We have target specific vars
-MAN= make.1
save-dollars: 0 = $
save-dollars: 1 = $$
save-dollars: 2 = $$
Index: src/usr.bin/make/unit-tests/varmisc.mk
diff -u src/usr.bin/make/unit-tests/varmisc.mk:1.32 src/usr.bin/make/unit-tests/varmisc.mk:1.33
--- src/usr.bin/make/unit-tests/varmisc.mk:1.32 Sun Dec 5 10:02:51 2021
+++ src/usr.bin/make/unit-tests/varmisc.mk Thu Oct 19 18:24:33 2023
@@ -1,9 +1,9 @@
-# $NetBSD: varmisc.mk,v 1.32 2021/12/05 10:02:51 rillig Exp $
+# $NetBSD: varmisc.mk,v 1.33 2023/10/19 18:24:33 rillig Exp $
#
# Miscellaneous variable tests.
all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none \
- strftime cmpv manok
+ cmpv
all: save-dollars
all: export-appended
all: parse-dynamic
@@ -46,13 +46,6 @@ NQ_none:
@echo do not evaluate or expand :? if discarding
@echo ${VSET:U${1:L:?${True}:${False}}}
-April1= 1459494000
-
-# slightly contorted syntax to use utc via variable
-strftime:
- @echo ${year=%Y month=%m day=%d:L:gmtime=1459494000}
- @echo date=${%Y%m%d:L:${gmtime=${April1}:L}}
-
# big jumps to handle 3 digits per step
M_cmpv.units= 1 1000 1000000
M_cmpv= S,., ,g:_:range:@i@+ $${_:[-$$i]} \* $${M_cmpv.units:[$$i]}@:S,^,expr 0 ,1:sh
@@ -65,17 +58,6 @@ cmpv:
@echo Literal=3.4.5 == ${3.4.5:L:${M_cmpv}}
@echo We have ${${.TARGET:T}.only}
-# catch mishandling of nested variables in .for loop
-MAN=
-MAN1= make.1
-.for s in 1 2
-. if defined(MAN$s) && !empty(MAN$s)
-MAN+= ${MAN$s}
-. endif
-.endfor
-
-manok:
- @echo MAN=${MAN}
# Test parsing of boolean values.
# begin .MAKE.SAVE_DOLLARS; see Var_SetWithFlags and ParseBoolean.
@@ -130,10 +112,10 @@ VAR.${PARAM}+= 2
.if ${VAR.+} != "1 2"
. error "${VAR.+}"
.endif
-.for param in + ! ?
+.for param in : + ! ?
VAR.${param}= ${param}
.endfor
-.if ${VAR.+} != "+" || ${VAR.!} != "!" || ${VAR.?} != "?"
+.if ${VAR.${:U\:}} != ":" || ${VAR.+} != "+" || ${VAR.!} != "!" || ${VAR.?} != "?"
. error "${VAR.+}" "${VAR.!}" "${VAR.?}"
.endif