Module Name: src
Committed By: rillig
Date: Sun Jan 23 16:25:54 UTC 2022
Modified Files:
src/distrib/sets/lists/tests: mi
src/usr.bin/make/unit-tests: Makefile
Added Files:
src/usr.bin/make/unit-tests: var-scope-cmdline.exp var-scope-cmdline.mk
var-scope-env.exp var-scope-env.mk var-scope-global.exp
var-scope-global.mk var-scope-local-legacy.exp
var-scope-local-legacy.mk var-scope-local.exp var-scope-local.mk
var-scope.exp var-scope.mk
Removed Files:
src/usr.bin/make/unit-tests: var-class-cmdline.exp var-class-cmdline.mk
var-class-env.exp var-class-env.mk var-class-global.exp
var-class-global.mk var-class-local-legacy.exp
var-class-local-legacy.mk var-class-local.exp var-class-local.mk
var-class.exp var-class.mk
Log Message:
tests/make: rename var-class to var-scope
There is no such concept as a "variable class" in make, these tests
focus on the variable scope instead.
To generate a diff of this commit:
cvs rdiff -u -r1.1183 -r1.1184 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.298 -r1.299 src/usr.bin/make/unit-tests/Makefile
cvs rdiff -u -r1.4 -r0 src/usr.bin/make/unit-tests/var-class-cmdline.exp
cvs rdiff -u -r1.5 -r0 src/usr.bin/make/unit-tests/var-class-cmdline.mk \
src/usr.bin/make/unit-tests/var-class-local.mk
cvs rdiff -u -r1.1 -r0 src/usr.bin/make/unit-tests/var-class-env.exp \
src/usr.bin/make/unit-tests/var-class-global.exp \
src/usr.bin/make/unit-tests/var-class-local-legacy.exp \
src/usr.bin/make/unit-tests/var-class.exp
cvs rdiff -u -r1.2 -r0 src/usr.bin/make/unit-tests/var-class-env.mk \
src/usr.bin/make/unit-tests/var-class-local-legacy.mk \
src/usr.bin/make/unit-tests/var-class.mk
cvs rdiff -u -r1.3 -r0 src/usr.bin/make/unit-tests/var-class-global.mk \
src/usr.bin/make/unit-tests/var-class-local.exp
cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/var-scope-cmdline.exp \
src/usr.bin/make/unit-tests/var-scope-cmdline.mk \
src/usr.bin/make/unit-tests/var-scope-env.exp \
src/usr.bin/make/unit-tests/var-scope-env.mk \
src/usr.bin/make/unit-tests/var-scope-global.exp \
src/usr.bin/make/unit-tests/var-scope-global.mk \
src/usr.bin/make/unit-tests/var-scope-local-legacy.exp \
src/usr.bin/make/unit-tests/var-scope-local-legacy.mk \
src/usr.bin/make/unit-tests/var-scope-local.exp \
src/usr.bin/make/unit-tests/var-scope-local.mk \
src/usr.bin/make/unit-tests/var-scope.exp \
src/usr.bin/make/unit-tests/var-scope.mk
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1183 src/distrib/sets/lists/tests/mi:1.1184
--- src/distrib/sets/lists/tests/mi:1.1183 Sun Jan 23 16:09:38 2022
+++ src/distrib/sets/lists/tests/mi Sun Jan 23 16:25:53 2022
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1183 2022/01/23 16:09:38 rillig Exp $
+# $NetBSD: mi,v 1.1184 2022/01/23 16:25:53 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -5931,18 +5931,18 @@
./usr/tests/usr.bin/make/unit-tests/unexport.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/use-inference.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/use-inference.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-cmdline.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-cmdline.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-env.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-env.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-global.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-global.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-local-legacy.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-local-legacy.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-local.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class-local.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/var-class.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-cmdline.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-cmdline.mk tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-env.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-env.mk tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-global.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-global.mk tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-local-legacy.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-local-legacy.mk tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-local.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class-local.mk tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/var-class.mk tests-obsolete obsolete,atf
./usr/tests/usr.bin/make/unit-tests/var-eval-short.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-eval-short.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-op-append.exp tests-usr.bin-tests compattestfile,atf
@@ -5961,6 +5961,18 @@
./usr/tests/usr.bin/make/unit-tests/var-op.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-recursive.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/var-recursive.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-cmdline.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-cmdline.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-env.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-env.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-global.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-global.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-local-legacy.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-local-legacy.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-local.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope-local.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope.exp tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/var-scope.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/varcmd.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/varcmd.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/vardebug.exp tests-usr.bin-tests compattestfile,atf
Index: src/usr.bin/make/unit-tests/Makefile
diff -u src/usr.bin/make/unit-tests/Makefile:1.298 src/usr.bin/make/unit-tests/Makefile:1.299
--- src/usr.bin/make/unit-tests/Makefile:1.298 Sun Jan 23 16:09:38 2022
+++ src/usr.bin/make/unit-tests/Makefile Sun Jan 23 16:25:54 2022
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.298 2022/01/23 16:09:38 rillig Exp $
+# $NetBSD: Makefile,v 1.299 2022/01/23 16:25:54 rillig Exp $
#
# Unit tests for make(1)
#
@@ -320,12 +320,12 @@ TESTS+= ternary
TESTS+= unexport
TESTS+= unexport-env
TESTS+= use-inference
-TESTS+= var-class
-TESTS+= var-class-cmdline
-TESTS+= var-class-env
-TESTS+= var-class-global
-TESTS+= var-class-local
-TESTS+= var-class-local-legacy
+TESTS+= var-scope
+TESTS+= var-scope-cmdline
+TESTS+= var-scope-env
+TESTS+= var-scope-global
+TESTS+= var-scope-local
+TESTS+= var-scope-local-legacy
TESTS+= var-eval-short
TESTS+= var-op
TESTS+= var-op-append
Added files:
Index: src/usr.bin/make/unit-tests/var-scope-cmdline.exp
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-cmdline.exp:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-cmdline.exp Sun Jan 23 16:25:54 2022
@@ -0,0 +1,4 @@
+make: "var-scope-cmdline.mk" line 67: global
+make: "var-scope-cmdline.mk" line 76: makeflags
+makeflags
+exit status 0
Index: src/usr.bin/make/unit-tests/var-scope-cmdline.mk
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-cmdline.mk:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-cmdline.mk Sun Jan 23 16:25:54 2022
@@ -0,0 +1,80 @@
+# $NetBSD: var-scope-cmdline.mk,v 1.1 2022/01/23 16:25:54 rillig Exp $
+#
+# Tests for variables specified on the command line.
+#
+# Variables that are specified on the command line override those from the
+# global scope.
+#
+# For performance reasons, the actual implementation is more complex than the
+# above single-sentence rule, in order to avoid unnecessary lookups in scopes,
+# which before var.c 1.586 from 2020-10-25 calculated the hash value of the
+# variable name once for each lookup. Instead, when looking up the value of
+# a variable, the search often starts in the global scope since that is where
+# most of the variables are stored. This conflicts with the statement that
+# variables from the cmdline scope override global variables, since after the
+# common case of finding a variable in the global scope, another lookup would
+# be needed in the cmdline scope to ensure that there is no overriding
+# variable there.
+#
+# Instead of this costly lookup scheme, make implements it in a different
+# way:
+#
+# Whenever a global variable is created, this creation is ignored if
+# there is a cmdline variable of the same name.
+#
+# Whenever a cmdline variable is created, any global variable of the
+# same name is deleted.
+#
+# Whenever a global variable is deleted, nothing special happens.
+#
+# Deleting a cmdline variable is not possible.
+#
+# These 4 rules provide the guarantee that whenever a global variable exists,
+# there cannot be a cmdline variable of the same name. Therefore, after
+# finding a variable in the global scope, no additional lookup is needed in
+# the cmdline scope.
+#
+# The above ruleset provides the same guarantees as the simple rule "cmdline
+# overrides global". Due to an implementation mistake, the actual behavior
+# was not entirely equivalent to the simple rule though. The mistake was
+# that when a cmdline variable with '$$' in its name was added, a global
+# variable was deleted, but not with the exact same name as the cmdline
+# variable. Instead, the name of the global variable was expanded one more
+# time than the name of the cmdline variable. For variable names that didn't
+# have a '$$' in their name, it was implemented correctly all the time.
+#
+# The bug was added in var.c 1.183 on 2013-07-16, when Var_Set called
+# Var_Delete to delete the global variable. Just two months earlier, in var.c
+# 1.174 from 2013-05-18, Var_Delete had started to expand the variable name.
+# Together, these two changes made the variable name be expanded twice in a
+# row. This bug was fixed in var.c 1.835 from 2021-02-22.
+#
+# Another bug was the wrong assumption that "deleting a cmdline variable is
+# not possible". Deleting such a variable has been possible since var.c 1.204
+# from 2016-02-19, when the variable modifier ':@' started to delete the
+# temporary loop variable after finishing the loop. It was probably not
+# intended back then that a side effect of this seemingly simple change was
+# that both global and cmdline variables could now be undefined at will as a
+# side effect of evaluating a variable expression. As of 2021-02-23, this is
+# still possible.
+#
+# Most cmdline variables are set at the very beginning, when parsing the
+# command line arguments. Using the special target '.MAKEFLAGS', it is
+# possible to set cmdline variables at any later time.
+
+# A normal global variable, without any cmdline variable nearby.
+VAR= global
+.info ${VAR}
+
+# The global variable is "overridden" by simply deleting it and then
+# installing the cmdline variable instead. Since there is no obvious way to
+# undefine a cmdline variable, there is no need to remember the old value
+# of the global variable could become visible again.
+#
+# See varmod-loop.mk for a non-obvious way to undefine a cmdline variable.
+.MAKEFLAGS: VAR=makeflags
+.info ${VAR}
+
+# If Var_SetWithFlags should ever forget to delete the global variable,
+# the below line would print "global" instead of the current "makeflags".
+.MAKEFLAGS: -V VAR
Index: src/usr.bin/make/unit-tests/var-scope-env.exp
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-env.exp:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-env.exp Sun Jan 23 16:25:54 2022
@@ -0,0 +1 @@
+exit status 0
Index: src/usr.bin/make/unit-tests/var-scope-env.mk
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-env.mk:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-env.mk Sun Jan 23 16:25:54 2022
@@ -0,0 +1,8 @@
+# $NetBSD: var-scope-env.mk,v 1.1 2022/01/23 16:25:54 rillig Exp $
+#
+# Tests for variables specified in the process environment.
+
+# TODO: Implementation
+
+all:
+ @:;
Index: src/usr.bin/make/unit-tests/var-scope-global.exp
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-global.exp:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-global.exp Sun Jan 23 16:25:54 2022
@@ -0,0 +1 @@
+exit status 0
Index: src/usr.bin/make/unit-tests/var-scope-global.mk
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-global.mk:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-global.mk Sun Jan 23 16:25:54 2022
@@ -0,0 +1,18 @@
+# $NetBSD: var-scope-global.mk,v 1.1 2022/01/23 16:25:54 rillig Exp $
+#
+# Tests for global variables, which are the most common variables.
+
+# Global variables can be assigned and appended to.
+GLOBAL= value
+GLOBAL+= addition
+.if ${GLOBAL} != "value addition"
+. error
+.endif
+
+# Global variables can be removed from their scope.
+.undef GLOBAL
+.if defined(GLOBAL)
+. error
+.endif
+
+all: .PHONY
Index: src/usr.bin/make/unit-tests/var-scope-local-legacy.exp
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-local-legacy.exp:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-local-legacy.exp Sun Jan 23 16:25:54 2022
@@ -0,0 +1 @@
+exit status 0
Index: src/usr.bin/make/unit-tests/var-scope-local-legacy.mk
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-local-legacy.mk:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-local-legacy.mk Sun Jan 23 16:25:54 2022
@@ -0,0 +1,8 @@
+# $NetBSD: var-scope-local-legacy.mk,v 1.1 2022/01/23 16:25:54 rillig Exp $
+#
+# Tests for legacy target-local variables, such as ${<F} or ${@D}.
+
+# TODO: Implementation
+
+all:
+ @:;
Index: src/usr.bin/make/unit-tests/var-scope-local.exp
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-local.exp:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-local.exp Sun Jan 23 16:25:54 2022
@@ -0,0 +1,5 @@
+: Making var-scope-local.c out of nothing.
+: Making var-scope-local.o from var-scope-local.c.
+: Making basename "var-scope-local.o" in "." from "var-scope-local.c" in ".".
+: all overwritten
+exit status 0
Index: src/usr.bin/make/unit-tests/var-scope-local.mk
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope-local.mk:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope-local.mk Sun Jan 23 16:25:54 2022
@@ -0,0 +1,45 @@
+# $NetBSD: var-scope-local.mk,v 1.1 2022/01/23 16:25:54 rillig Exp $
+#
+# Tests for target-local variables, such as ${.TARGET} or $@.
+
+# TODO: Implementation
+
+# Ensure that the name of the variable is exactly the given one.
+# The variable "@" is an alias for ".TARGET", so the implementation might
+# canonicalize these aliases at some point, and that might be surprising.
+# This aliasing happens for single-character variable names like $@ or $<
+# (see VarFind, CanonicalVarname), but not for braced or parenthesized
+# expressions like ${@}, ${.TARGET} ${VAR:Mpattern} (see Var_Parse,
+# ParseVarname).
+.if ${@:L} != "@"
+. error
+.endif
+.if ${.TARGET:L} != ".TARGET"
+. error
+.endif
+.if ${@F:L} != "@F"
+. error
+.endif
+.if ${@D:L} != "@D"
+. error
+.endif
+
+all:
+
+.SUFFIXES: .c .o
+
+var-scope-local.c:
+ : Making ${.TARGET} out of nothing.
+
+.c.o:
+ : Making ${.TARGET} from ${.IMPSRC}.
+
+ # The local variables @F, @D, <F, <D are legacy forms.
+ # See the manual page for details.
+ : Making basename "${@F}" in "${@D}" from "${<F}" in "${<D}".
+
+all: var-scope-local.o
+ # The ::= modifier overwrites the .TARGET variable in the node
+ # 'all', not in the global scope. This can be seen with the -dv
+ # option, looking for "all:@ = overwritten".
+ : ${.TARGET} ${.TARGET::=overwritten}${.TARGET}
Index: src/usr.bin/make/unit-tests/var-scope.exp
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope.exp:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope.exp Sun Jan 23 16:25:54 2022
@@ -0,0 +1 @@
+exit status 0
Index: src/usr.bin/make/unit-tests/var-scope.mk
diff -u /dev/null src/usr.bin/make/unit-tests/var-scope.mk:1.1
--- /dev/null Sun Jan 23 16:25:54 2022
+++ src/usr.bin/make/unit-tests/var-scope.mk Sun Jan 23 16:25:54 2022
@@ -0,0 +1,9 @@
+# $NetBSD: var-scope.mk,v 1.1 2022/01/23 16:25:54 rillig Exp $
+#
+# Tests for the different variable scopes (local, command-line, global,
+# environment), and which of them takes precedence over the others.
+
+# TODO: Implementation
+
+all:
+ @:;