Module Name:    src
Committed By:   rillig
Date:           Sun Nov 15 14:07:53 UTC 2020

Modified Files:
        src/usr.bin/make/unit-tests: archive-suffix.mk archive.mk
            cmd-interrupt.mk cmdline.mk comment.mk cond-cmp-string.exp
            cond-cmp-string.mk cond-func-commands.mk cond-func-defined.exp
            cond-func-defined.mk cond-func-empty.exp cond-func-empty.mk
            cond-func.exp cond-func.mk cond-late.mk

Log Message:
make(1): clean up some tests

Fix some mistakes in comments.

Improve some comments to be easier understandable.

Inline variables that are irrelevant for the test at hand (RUN,
MAKE_CMD).

Remove references to functions and constants that have since been removed
or renamed.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/usr.bin/make/unit-tests/archive-suffix.mk \
    src/usr.bin/make/unit-tests/cmd-interrupt.mk \
    src/usr.bin/make/unit-tests/comment.mk \
    src/usr.bin/make/unit-tests/cond-func-empty.exp \
    src/usr.bin/make/unit-tests/cond-late.mk
cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/archive.mk
cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/cmdline.mk
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/cond-cmp-string.exp
cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/cond-cmp-string.mk
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/cond-func-commands.mk \
    src/usr.bin/make/unit-tests/cond-func-defined.exp \
    src/usr.bin/make/unit-tests/cond-func.exp
cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/cond-func-defined.mk
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/cond-func-empty.mk
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/cond-func.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/archive-suffix.mk
diff -u src/usr.bin/make/unit-tests/archive-suffix.mk:1.2 src/usr.bin/make/unit-tests/archive-suffix.mk:1.3
--- src/usr.bin/make/unit-tests/archive-suffix.mk:1.2	Sat Nov  7 00:07:02 2020
+++ src/usr.bin/make/unit-tests/archive-suffix.mk	Sun Nov 15 14:07:53 2020
@@ -1,11 +1,11 @@
-# $NetBSD: archive-suffix.mk,v 1.2 2020/11/07 00:07:02 rillig Exp $
+# $NetBSD: archive-suffix.mk,v 1.3 2020/11/15 14:07:53 rillig Exp $
 #
 # Between 2020-08-23 and 2020-08-30, the below code produced an assertion
 # failure in Var_SetWithFlags, triggered by Compat_Make, when setting the
 # .IMPSRC of an archive node to its .TARGET.
 #
 # The code assumed that the .TARGET variable of every node would be set, but
-# but that is not guaranteed.
+# that is not guaranteed.
 #
 # Between 2016-03-15 and 2016-03-16 the behavior of the below code changed.
 # Until 2016-03-15, it remade the target, starting with 2016-03-16 it says
Index: src/usr.bin/make/unit-tests/cmd-interrupt.mk
diff -u src/usr.bin/make/unit-tests/cmd-interrupt.mk:1.2 src/usr.bin/make/unit-tests/cmd-interrupt.mk:1.3
--- src/usr.bin/make/unit-tests/cmd-interrupt.mk:1.2	Fri Aug 28 18:16:22 2020
+++ src/usr.bin/make/unit-tests/cmd-interrupt.mk	Sun Nov 15 14:07:53 2020
@@ -1,4 +1,4 @@
-# $NetBSD: cmd-interrupt.mk,v 1.2 2020/08/28 18:16:22 rillig Exp $
+# $NetBSD: cmd-interrupt.mk,v 1.3 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for interrupting a command.
 #
@@ -22,7 +22,7 @@ all: clean-before interrupt-ordinary int
 clean-before clean-after: .PHONY
 	@rm -f cmd-interrupt-ordinary cmd-interrupt-phony cmd-interrupt-precious
 
-interrupt-ordinary: .PHONY
+interrupt-ordinary:
 	@${.MAKE} ${MAKEFLAGS} -f ${MAKEFILE} cmd-interrupt-ordinary || true
 	# The ././ is necessary to work around the file cache.
 	@echo ${.TARGET}: ${exists(././cmd-interrupt-ordinary) :? error : ok }
Index: src/usr.bin/make/unit-tests/comment.mk
diff -u src/usr.bin/make/unit-tests/comment.mk:1.2 src/usr.bin/make/unit-tests/comment.mk:1.3
--- src/usr.bin/make/unit-tests/comment.mk:1.2	Mon Sep  7 19:17:36 2020
+++ src/usr.bin/make/unit-tests/comment.mk	Sun Nov 15 14:07:53 2020
@@ -1,4 +1,4 @@
-# $NetBSD: comment.mk,v 1.2 2020/09/07 19:17:36 rillig Exp $
+# $NetBSD: comment.mk,v 1.3 2020/11/15 14:07:53 rillig Exp $
 #
 # Demonstrate how comments are written in makefiles.
 
@@ -12,7 +12,7 @@ that \
 goes \
 on and on.
 
- # Comments can be indented, but that is rather unusual.
+ # Comments can be indented with spaces, but that is rather unusual.
 
 	# Comments can be indented with a tab.
 	# These are not shell commands, they are just makefile comments.
@@ -21,6 +21,8 @@ on and on.
 .endif			# And after the closing directive.
 
 VAR=			# This comment makes the variable value empty.
+			# ParseGetLine removes any whitespace before the
+			# comment.
 .if ${VAR} != ""
 .  error
 .endif
@@ -35,7 +37,9 @@ VAR=	value
 .  error
 .endif
 
-# This is NOT an escaped comment due to the double backslashes \\
+# This comment ends with 2 backslashes.  An even number of backslashes does
+# not count as a line continuation, therefore the variable assignment that
+# follows is actively interpreted. \\
 VAR=	not part of the comment
 .if ${VAR} != "not part of the comment"
 .  error
@@ -55,7 +59,7 @@ WORDS=	${VAR:[#]} [#
 .  error
 .endif
 
-# An odd number of comment signs makes a line continuation, \\\
+# An odd number of backslashes makes a line continuation, \\\
 no matter if it is 3 or 5 \\\\\
 or 9 backslashes. \\\\\\\\\
 This is the last line of the comment.
Index: src/usr.bin/make/unit-tests/cond-func-empty.exp
diff -u src/usr.bin/make/unit-tests/cond-func-empty.exp:1.2 src/usr.bin/make/unit-tests/cond-func-empty.exp:1.3
--- src/usr.bin/make/unit-tests/cond-func-empty.exp:1.2	Sat Nov  7 14:37:31 2020
+++ src/usr.bin/make/unit-tests/cond-func-empty.exp	Sun Nov 15 14:07:53 2020
@@ -1,5 +1,5 @@
-make: "cond-func-empty.mk" line 150: Unclosed variable "WORD"
-make: "cond-func-empty.mk" line 150: Malformed conditional (empty(WORD)
+make: "cond-func-empty.mk" line 152: Unclosed variable "WORD"
+make: "cond-func-empty.mk" line 152: Malformed conditional (empty(WORD)
 make: Fatal errors encountered -- cannot continue
 make: stopped in unit-tests
 exit status 1
Index: src/usr.bin/make/unit-tests/cond-late.mk
diff -u src/usr.bin/make/unit-tests/cond-late.mk:1.2 src/usr.bin/make/unit-tests/cond-late.mk:1.3
--- src/usr.bin/make/unit-tests/cond-late.mk:1.2	Sat Jul 25 20:37:46 2020
+++ src/usr.bin/make/unit-tests/cond-late.mk	Sun Nov 15 14:07:53 2020
@@ -1,7 +1,9 @@
-# $NetBSD: cond-late.mk,v 1.2 2020/07/25 20:37:46 rillig Exp $
+# $NetBSD: cond-late.mk,v 1.3 2020/11/15 14:07:53 rillig Exp $
 #
 # Using the :? modifier, variable expressions can contain conditional
-# expressions that are evaluated late.  Any variables appearing in these
+# expressions that are evaluated late, at expansion time.
+#
+# Any variables appearing in these
 # conditions are expanded before parsing the condition.  This is
 # different from many other places.
 #
@@ -11,15 +13,15 @@
 # They should also not contain operators like == or <, since these are
 # actually interpreted as these operators. This is demonstrated below.
 #
-# If the order of evaluation were to change to first parse the condition
-# and then expand the variables, the output would change from the
-# current "yes no" to "yes yes", since both variables are non-empty.
 
 all: cond-literal
 
 COND.true=	"yes" == "yes"
 COND.false=	"yes" != "yes"
 
+# If the order of evaluation were to change to first parse the condition
+# and then expand the variables, the output would change from the
+# current "yes no" to "yes yes", since both variables are non-empty.
 cond-literal:
 	@echo ${ ${COND.true} :?yes:no}
 	@echo ${ ${COND.false} :?yes:no}

Index: src/usr.bin/make/unit-tests/archive.mk
diff -u src/usr.bin/make/unit-tests/archive.mk:1.10 src/usr.bin/make/unit-tests/archive.mk:1.11
--- src/usr.bin/make/unit-tests/archive.mk:1.10	Fri Oct  9 06:44:42 2020
+++ src/usr.bin/make/unit-tests/archive.mk	Sun Nov 15 14:07:53 2020
@@ -1,18 +1,15 @@
-# $NetBSD: archive.mk,v 1.10 2020/10/09 06:44:42 rillig Exp $
+# $NetBSD: archive.mk,v 1.11 2020/11/15 14:07:53 rillig Exp $
 #
 # Very basic demonstration of handling archives, based on the description
 # in PSD.doc/tutorial.ms.
 #
 # This test aims at covering the code, not at being an introduction to
-# archive handling. That's why it is more complicated and detailed than
-# strictly necessary.
+# archive handling. That's why it deviates from the tutorial style of
+# several other tests.
 
 ARCHIVE=	libprog.a
 FILES=		archive.mk modmisc.mk varmisc.mk
 
-MAKE_CMD=	${.MAKE} -f ${MAKEFILE}
-RUN?=		@set -eu;
-
 all:
 .if ${.PARSEDIR:tA} != ${.CURDIR:tA}
 	@cd ${MAKEFILE:H} && cp ${FILES} [at]*.mk ${.CURDIR}
@@ -20,13 +17,13 @@ all:
 # The following targets create and remove files.  The filesystem cache in
 # dir.c would probably not handle this correctly, therefore each of the
 # targets is run in its separate sub-make.
-	${RUN} ${MAKE_CMD} remove-archive
-	${RUN} ${MAKE_CMD} create-archive
-	${RUN} ${MAKE_CMD} list-archive
-	${RUN} ${MAKE_CMD} list-archive-wildcard
-	${RUN} ${MAKE_CMD} depend-on-existing-member
-	${RUN} ${MAKE_CMD} depend-on-nonexistent-member
-	${RUN} ${MAKE_CMD} remove-archive
+	@${MAKE} -f ${MAKEFILE} remove-archive
+	@${MAKE} -f ${MAKEFILE} create-archive
+	@${MAKE} -f ${MAKEFILE} list-archive
+	@${MAKE} -f ${MAKEFILE} list-archive-wildcard
+	@${MAKE} -f ${MAKEFILE} depend-on-existing-member
+	@${MAKE} -f ${MAKEFILE} depend-on-nonexistent-member
+	@${MAKE} -f ${MAKEFILE} remove-archive
 
 create-archive: ${ARCHIVE} pre post
 
@@ -43,15 +40,16 @@ list-archive: ${ARCHIVE} pre post
 
 # XXX: I had expected that this dependency would select all *.mk files from
 # the archive.  Instead, the globbing is done in the current directory.
+#
 # To prevent an overly long file list, the pattern is restricted to [at]*.mk.
 list-archive-wildcard: ${ARCHIVE}([at]*.mk) pre post
-	${RUN} printf '%s\n' ${.ALLSRC:O:@member@${.TARGET:Q}': '${member:Q}@}
+	@printf '%s\n' ${.ALLSRC:O:@member@${.TARGET:Q}': '${member:Q}@}
 
 depend-on-existing-member: ${ARCHIVE}(archive.mk) pre post
-	${RUN} echo $@
+	@echo $@
 
 depend-on-nonexistent-member: ${ARCHIVE}(nonexistent.mk) pre post
-	${RUN} echo $@
+	@echo $@
 
 remove-archive: pre post
 	rm -f ${ARCHIVE}

Index: src/usr.bin/make/unit-tests/cmdline.mk
diff -u src/usr.bin/make/unit-tests/cmdline.mk:1.1 src/usr.bin/make/unit-tests/cmdline.mk:1.2
--- src/usr.bin/make/unit-tests/cmdline.mk:1.1	Tue Jul 28 22:44:44 2020
+++ src/usr.bin/make/unit-tests/cmdline.mk	Sun Nov 15 14:07:53 2020
@@ -1,8 +1,7 @@
-# $NetBSD: cmdline.mk,v 1.1 2020/07/28 22:44:44 rillig Exp $
+# $NetBSD: cmdline.mk,v 1.2 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for command line parsing and related special variables.
 
-RUN?=		@set -eu;
 TMPBASE?=	/tmp
 SUB1=		a7b41170-53f8-4cc2-bc5c-e4c3dd93ec45	# just a random UUID
 SUB2=		6a8899d2-d227-4b55-9b6b-f3c8eeb83fd5	# just a random UUID
@@ -14,14 +13,14 @@ all: prepare-dirs
 all: makeobjdir-direct makeobjdir-indirect
 
 prepare-dirs:
-	${RUN} rm -rf ${DIR2} ${DIR12}
-	${RUN} mkdir -p ${DIR2} ${DIR12}
+	@rm -rf ${DIR2} ${DIR12}
+	@mkdir -p ${DIR2} ${DIR12}
 
 # The .OBJDIR can be set via the MAKEOBJDIR command line variable.
 # It must be a command line variable; an environment variable would not work.
 makeobjdir-direct:
 	@echo $@:
-	${RUN} ${MAKE_CMD} MAKEOBJDIR=${DIR2} show-objdir
+	@${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.
@@ -31,7 +30,7 @@ makeobjdir-direct:
 # see MAKE_CMD.
 makeobjdir-indirect:
 	@echo $@:
-	${RUN} ${MAKE_CMD} MAKEOBJDIR='$${TMPBASE}/$${SUB2}' show-objdir
+	@${MAKE_CMD} MAKEOBJDIR='$${TMPBASE}/$${SUB2}' show-objdir
 
 show-objdir:
 	@echo $@: ${.OBJDIR:Q}

Index: src/usr.bin/make/unit-tests/cond-cmp-string.exp
diff -u src/usr.bin/make/unit-tests/cond-cmp-string.exp:1.7 src/usr.bin/make/unit-tests/cond-cmp-string.exp:1.8
--- src/usr.bin/make/unit-tests/cond-cmp-string.exp:1.7	Fri Oct 30 14:51:47 2020
+++ src/usr.bin/make/unit-tests/cond-cmp-string.exp	Sun Nov 15 14:07:53 2020
@@ -1,8 +1,8 @@
 make: "cond-cmp-string.mk" line 18: Malformed conditional (str != str)
-make: "cond-cmp-string.mk" line 37: Malformed conditional ("string" != "str""ing")
-make: "cond-cmp-string.mk" line 42: warning: String comparison operator must be either == or !=
-make: "cond-cmp-string.mk" line 42: Malformed conditional (!("value" = "value"))
-make: "cond-cmp-string.mk" line 49: Malformed conditional (!("value" === "value"))
+make: "cond-cmp-string.mk" line 42: Malformed conditional ("string" != "str""ing")
+make: "cond-cmp-string.mk" line 49: warning: String comparison operator must be either == or !=
+make: "cond-cmp-string.mk" line 49: Malformed conditional (!("value" = "value"))
+make: "cond-cmp-string.mk" line 56: Malformed conditional (!("value" === "value"))
 make: Fatal errors encountered -- cannot continue
 make: stopped in unit-tests
 exit status 1

Index: src/usr.bin/make/unit-tests/cond-cmp-string.mk
diff -u src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.12 src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.13
--- src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.12	Sun Nov  8 23:00:09 2020
+++ src/usr.bin/make/unit-tests/cond-cmp-string.mk	Sun Nov 15 14:07:53 2020
@@ -1,4 +1,4 @@
-# $NetBSD: cond-cmp-string.mk,v 1.12 2020/11/08 23:00:09 rillig Exp $
+# $NetBSD: cond-cmp-string.mk,v 1.13 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for string comparisons in .if conditions.
 
@@ -19,9 +19,14 @@
 .  error
 .endif
 
-# The left-hand side of the comparison requires a defined variable.
-# The variable named "" is not defined, but applying the :U modifier to it
-# makes it "kind of defined" (see VAR_KEEP).  Therefore it is ok here.
+# The left-hand side of the comparison requires that any variable expression
+# is defined.
+#
+# The variable named "" is never defined, nevertheless it can be used as a
+# starting point for variable expressions.  Applying the :U modifier to such
+# an undefined expression turns it into a defined expression.
+#
+# See ApplyModifier_Defined and VEF_DEF.
 .if ${:Ustr} != "str"
 .  error
 .endif
@@ -33,9 +38,11 @@
 .endif
 
 # It is not possible to concatenate two string literals to form a single
-# string.
+# string.  In C, Python and the shell this is possible, but not in make.
 .if "string" != "str""ing"
 .  error
+.else
+.  error
 .endif
 
 # There is no = operator for strings.

Index: src/usr.bin/make/unit-tests/cond-func-commands.mk
diff -u src/usr.bin/make/unit-tests/cond-func-commands.mk:1.4 src/usr.bin/make/unit-tests/cond-func-commands.mk:1.5
--- src/usr.bin/make/unit-tests/cond-func-commands.mk:1.4	Sat Oct 24 08:46:08 2020
+++ src/usr.bin/make/unit-tests/cond-func-commands.mk	Sun Nov 15 14:07:53 2020
@@ -1,10 +1,11 @@
-# $NetBSD: cond-func-commands.mk,v 1.4 2020/10/24 08:46:08 rillig Exp $
+# $NetBSD: cond-func-commands.mk,v 1.5 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for the commands() function in .if conditions.
 
 .MAIN: all
 
-# The target "target" does not exist yet, therefore it cannot have commands.
+# At this point, the target 'target' does not exist yet, therefore it cannot
+# have commands.  Sounds obvious, but good to know that it is really so.
 .if commands(target)
 .  error
 .endif
Index: src/usr.bin/make/unit-tests/cond-func-defined.exp
diff -u src/usr.bin/make/unit-tests/cond-func-defined.exp:1.4 src/usr.bin/make/unit-tests/cond-func-defined.exp:1.5
--- src/usr.bin/make/unit-tests/cond-func-defined.exp:1.4	Sat Nov  7 14:40:51 2020
+++ src/usr.bin/make/unit-tests/cond-func-defined.exp	Sun Nov 15 14:07:53 2020
@@ -2,6 +2,9 @@ make: "cond-func-defined.mk" line 23: wa
 make: "cond-func-defined.mk" line 23: Malformed conditional (!defined(A B))
 make: "cond-func-defined.mk" line 33: warning: Missing closing parenthesis for defined()
 make: "cond-func-defined.mk" line 33: Malformed conditional (defined(DEF)
+make: "cond-func-defined.mk" line 45: In .for loops, variable expressions for the loop variables are
+make: "cond-func-defined.mk" line 46: substituted at evaluation time.  There is no actual variable
+make: "cond-func-defined.mk" line 47: 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/cond-func.exp
diff -u src/usr.bin/make/unit-tests/cond-func.exp:1.4 src/usr.bin/make/unit-tests/cond-func.exp:1.5
--- src/usr.bin/make/unit-tests/cond-func.exp:1.4	Tue Nov 10 20:44:18 2020
+++ src/usr.bin/make/unit-tests/cond-func.exp	Sun Nov 15 14:07:53 2020
@@ -1,15 +1,15 @@
-make: "cond-func.mk" line 34: warning: Missing closing parenthesis for defined()
-make: "cond-func.mk" line 34: Malformed conditional (!defined(A B))
-make: "cond-func.mk" line 49: warning: Missing closing parenthesis for defined()
-make: "cond-func.mk" line 49: Malformed conditional (!defined(A&B))
-make: "cond-func.mk" line 52: warning: Missing closing parenthesis for defined()
-make: "cond-func.mk" line 52: Malformed conditional (!defined(A|B))
-make: "cond-func.mk" line 92: The empty variable is never defined.
-make: "cond-func.mk" line 100: A plain function name is parsed as !empty(...).
-make: "cond-func.mk" line 107: A plain function name is parsed as !empty(...).
-make: "cond-func.mk" line 117: Symbols may start with a function name.
-make: "cond-func.mk" line 122: Symbols may start with a function name.
-make: "cond-func.mk" line 128: Malformed conditional (defined()
+make: "cond-func.mk" line 36: warning: Missing closing parenthesis for defined()
+make: "cond-func.mk" line 36: Malformed conditional (!defined(A B))
+make: "cond-func.mk" line 51: warning: Missing closing parenthesis for defined()
+make: "cond-func.mk" line 51: Malformed conditional (!defined(A&B))
+make: "cond-func.mk" line 54: warning: Missing closing parenthesis for defined()
+make: "cond-func.mk" line 54: Malformed conditional (!defined(A|B))
+make: "cond-func.mk" line 94: The empty variable is never defined.
+make: "cond-func.mk" line 102: A plain function name is parsed as !empty(...).
+make: "cond-func.mk" line 109: A plain function name is parsed as !empty(...).
+make: "cond-func.mk" line 119: Symbols may start with a function name.
+make: "cond-func.mk" line 124: Symbols may start with a function name.
+make: "cond-func.mk" line 130: Malformed conditional (defined()
 make: Fatal errors encountered -- cannot continue
 make: stopped in unit-tests
 exit status 1

Index: src/usr.bin/make/unit-tests/cond-func-defined.mk
diff -u src/usr.bin/make/unit-tests/cond-func-defined.mk:1.6 src/usr.bin/make/unit-tests/cond-func-defined.mk:1.7
--- src/usr.bin/make/unit-tests/cond-func-defined.mk:1.6	Sat Nov  7 14:40:51 2020
+++ src/usr.bin/make/unit-tests/cond-func-defined.mk	Sun Nov 15 14:07:53 2020
@@ -1,4 +1,4 @@
-# $NetBSD: cond-func-defined.mk,v 1.6 2020/11/07 14:40:51 rillig Exp $
+# $NetBSD: cond-func-defined.mk,v 1.7 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for the defined() function in .if conditions.
 
@@ -36,5 +36,17 @@ ${:UA B}=	variable name with spaces
 .  error
 .endif
 
+# Variables from .for loops are not defined.
+# See directive-for.mk for more details.
+.for var in value
+.  if defined(var)
+.    error
+.  else
+.    info In .for loops, variable expressions for the loop variables are
+.    info substituted at evaluation time.  There is no actual variable
+.    info involved, even if it feels like it.
+.  endif
+.endfor
+
 all:
 	@:;

Index: src/usr.bin/make/unit-tests/cond-func-empty.mk
diff -u src/usr.bin/make/unit-tests/cond-func-empty.mk:1.9 src/usr.bin/make/unit-tests/cond-func-empty.mk:1.10
--- src/usr.bin/make/unit-tests/cond-func-empty.mk:1.9	Sat Nov  7 14:37:31 2020
+++ src/usr.bin/make/unit-tests/cond-func-empty.mk	Sun Nov 15 14:07:53 2020
@@ -1,11 +1,10 @@
-# $NetBSD: cond-func-empty.mk,v 1.9 2020/11/07 14:37:31 rillig Exp $
+# $NetBSD: cond-func-empty.mk,v 1.10 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for the empty() function in .if conditions, which tests a variable
 # expression for emptiness.
 #
 # Note that the argument in the parentheses is indeed a variable name,
-# optionally followed by variable modifiers.  This is like the defined()
-# function.
+# optionally followed by variable modifiers.
 #
 
 .undef UNDEF
@@ -25,13 +24,15 @@ WORD=	word
 .  error
 .endif
 
-# The :S modifier replaces the empty value with an actual word, and
-# after that the expression is no longer empty.  Because the variable
-# was undefined in the first place, the expression has the flag VAR_JUNK
-# but not VAR_KEEP, therefore it is still considered undefined.
-# Only very few variable modifiers turn an undefined variable expression
-# into a defined variable expression.  The :U and :D modifiers belong to
-# that group, but :S doesn't (see VAR_KEEP).
+# The :S modifier replaces the empty value with an actual word.  The
+# expression is now no longer empty, but it is still possible to see whether
+# the expression was based on an undefined variable.  The expression has the
+# flag VEF_UNDEF.
+#
+# The expression does not have the flag VEF_DEF though, therefore it is still
+# considered undefined.  Yes, indeed, undefined but not empty.  There are a
+# few variable modifiers that turn an undefined expression into a defined
+# expression, among them :U and :D, but not :S.
 #
 # XXX: This is hard to explain to someone who doesn't know these
 # implementation details.
@@ -49,13 +50,14 @@ WORD=	word
 .endif
 
 # And now to the surprising part.  Applying the following :S modifier to the
-# undefined variable makes it non-empty, but the marker VAR_JUNK is preserved
-# nevertheless.  The :U modifier that follows only looks at VAR_JUNK to decide
-# whether the variable is defined or not.  This kind of makes sense since the
-# :U modifier tests the _variable_, not the _expression_.
+# undefined expression makes it non-empty, but the marker VEF_UNDEF is
+# preserved nevertheless.  The :U modifier that follows only looks at the
+# VEF_UNDEF flag to decide whether the variable is defined or not.  This kind
+# of makes sense since the :U modifier tests the _variable_, not the
+# _expression_.
 #
-# But since the variable was undefined to begin with, the fallback value is
-# used in this expression.
+# But since the variable was undefined to begin with, the fallback value from
+# the :U modifier is used in this expression.
 #
 .if ${UNDEF:S,^$,value,W:Ufallback} != "fallback"
 .  error
@@ -128,7 +130,7 @@ ${:U }=	space
 # If everything goes well, the argument expands to "WORD", and that variable
 # is defined at the beginning of this file.  The surrounding 'W' and 'D'
 # ensure that the parser in ParseEmptyArg has the correct position, both
-# before and after the call to Var_ParsePP.
+# before and after the call to Var_Parse.
 .if empty(W${:UOR}D)
 .  error
 .endif

Index: src/usr.bin/make/unit-tests/cond-func.mk
diff -u src/usr.bin/make/unit-tests/cond-func.mk:1.8 src/usr.bin/make/unit-tests/cond-func.mk:1.9
--- src/usr.bin/make/unit-tests/cond-func.mk:1.8	Tue Nov 10 20:44:18 2020
+++ src/usr.bin/make/unit-tests/cond-func.mk	Sun Nov 15 14:07:53 2020
@@ -1,10 +1,12 @@
-# $NetBSD: cond-func.mk,v 1.8 2020/11/10 20:44:18 rillig Exp $
+# $NetBSD: cond-func.mk,v 1.9 2020/11/15 14:07:53 rillig Exp $
 #
 # Tests for those parts of the functions in .if conditions that are common
 # among several functions.
 #
 # The below test uses the function defined(...) since it has no side-effects,
-# the other functions (except empty(...)) would work equally well.
+# the other functions (except empty(...)) would work equally well.  The
+# function empty is special because it uses a different parsing algorithm for
+# its argument.
 
 DEF=			defined
 ${:UA B}=		variable name with spaces

Reply via email to