Module Name: src Committed By: rillig Date: Sun Apr 4 13:20:52 UTC 2021
Modified Files: src/distrib/sets/lists/tests: mi src/usr.bin/make/unit-tests: Makefile varmod-loop.exp varmod-loop.mk Added Files: src/usr.bin/make/unit-tests: varmod-loop-varname.exp varmod-loop-varname.mk varmod-loop-varname.out varmod-loop-varname.rawout varmod-loop-varname.status Log Message: tests/make: split test for modifier ':@' into separate files The file varmod-loop.mk has grown too large to be single-purpose, plus it combined parse-time and run-time tests. This has the downside that as soon as a parse-time test results in an error, the run-time tests are not run anymore. To generate a diff of this commit: cvs rdiff -u -r1.1035 -r1.1036 src/distrib/sets/lists/tests/mi cvs rdiff -u -r1.274 -r1.275 src/usr.bin/make/unit-tests/Makefile cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/varmod-loop-varname.exp \ src/usr.bin/make/unit-tests/varmod-loop-varname.mk \ src/usr.bin/make/unit-tests/varmod-loop-varname.out \ src/usr.bin/make/unit-tests/varmod-loop-varname.rawout \ src/usr.bin/make/unit-tests/varmod-loop-varname.status cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/varmod-loop.exp cvs rdiff -u -r1.13 -r1.14 src/usr.bin/make/unit-tests/varmod-loop.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.1035 src/distrib/sets/lists/tests/mi:1.1036 --- src/distrib/sets/lists/tests/mi:1.1035 Fri Apr 2 17:25:04 2021 +++ src/distrib/sets/lists/tests/mi Sun Apr 4 13:20:52 2021 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.1035 2021/04/02 17:25:04 rillig Exp $ +# $NetBSD: mi,v 1.1036 2021/04/04 13:20:52 rillig Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -5777,6 +5777,8 @@ ./usr/tests/usr.bin/make/unit-tests/varmod-l-name-to-value.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-localtime.exp tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-localtime.mk tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/make/unit-tests/varmod-loop-varname.exp tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/make/unit-tests/varmod-loop-varname.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-loop.exp tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-loop.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/varmod-match-escape.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.274 src/usr.bin/make/unit-tests/Makefile:1.275 --- src/usr.bin/make/unit-tests/Makefile:1.274 Sat Apr 3 11:08:40 2021 +++ src/usr.bin/make/unit-tests/Makefile Sun Apr 4 13:20:52 2021 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.274 2021/04/03 11:08:40 rillig Exp $ +# $NetBSD: Makefile,v 1.275 2021/04/04 13:20:52 rillig Exp $ # # Unit tests for make(1) # @@ -347,6 +347,7 @@ TESTS+= varmod-indirect TESTS+= varmod-l-name-to-value TESTS+= varmod-localtime TESTS+= varmod-loop +TESTS+= varmod-loop-varname TESTS+= varmod-match TESTS+= varmod-match-escape TESTS+= varmod-no-match Index: src/usr.bin/make/unit-tests/varmod-loop.exp diff -u src/usr.bin/make/unit-tests/varmod-loop.exp:1.9 src/usr.bin/make/unit-tests/varmod-loop.exp:1.10 --- src/usr.bin/make/unit-tests/varmod-loop.exp:1.9 Sun Apr 4 10:13:09 2021 +++ src/usr.bin/make/unit-tests/varmod-loop.exp Sun Apr 4 13:20:52 2021 @@ -1,16 +1,12 @@ -ParseReadLine (144): 'USE_8_DOLLARS= ${:U1:@var@${8_DOLLARS}@} ${8_DOLLARS} $$$$$$$$' +ParseReadLine (75): 'USE_8_DOLLARS= ${:U1:@var@${8_DOLLARS}@} ${8_DOLLARS} $$$$$$$$' CondParser_Eval: ${USE_8_DOLLARS} != "\$\$\$\$ \$\$\$\$ \$\$\$\$" lhs = "$$$$ $$$$ $$$$", rhs = "$$$$ $$$$ $$$$", op = != -ParseReadLine (149): 'SUBST_CONTAINING_LOOP:= ${USE_8_DOLLARS}' +ParseReadLine (80): 'SUBST_CONTAINING_LOOP:= ${USE_8_DOLLARS}' CondParser_Eval: ${SUBST_CONTAINING_LOOP} != "\$\$ \$\$\$\$ \$\$\$\$" lhs = "$$ $$$$ $$$$", rhs = "$$ $$$$ $$$$", op = != -ParseReadLine (174): '.MAKEFLAGS: -d0' +ParseReadLine (105): '.MAKEFLAGS: -d0' ParseDependency(.MAKEFLAGS: -d0) :varname-overwriting-target: :x1y x2y x3y: :: -mod-loop-resolve:w1d2d3w w2i3w w1i2d3 2i${RES3}w w1d2d3 2i${RES3} 1i${RES2}w: -mod-loop-varname-dollar:(1) (2) (3). -mod-loop-varname-dollar:() () (). -mod-loop-varname-dollar:() () (). mod-loop-dollar:1: mod-loop-dollar:${word}$: mod-loop-dollar:$3$: Index: src/usr.bin/make/unit-tests/varmod-loop.mk diff -u src/usr.bin/make/unit-tests/varmod-loop.mk:1.13 src/usr.bin/make/unit-tests/varmod-loop.mk:1.14 --- src/usr.bin/make/unit-tests/varmod-loop.mk:1.13 Mon Mar 15 17:54:49 2021 +++ src/usr.bin/make/unit-tests/varmod-loop.mk Sun Apr 4 13:20:52 2021 @@ -1,34 +1,12 @@ -# $NetBSD: varmod-loop.mk,v 1.13 2021/03/15 17:54:49 rillig Exp $ +# $NetBSD: varmod-loop.mk,v 1.14 2021/04/04 13:20:52 rillig Exp $ # # Tests for the :@var@...${var}...@ variable modifier. .MAKE.SAVE_DOLLARS= yes all: varname-overwriting-target -all: mod-loop-resolve -all: mod-loop-varname-dollar all: mod-loop-dollar -# In the :@ modifier, the name of the loop variable can even be generated -# dynamically. There's no practical use-case for this, and hopefully nobody -# will ever depend on this, but technically it's possible. -# Therefore, in -dL mode, this is forbidden, see lint.mk. -.if ${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+" -. error -.endif - -# ":::" is a very creative variable name, unlikely in practice. -# The expression ${\:\:\:} would not work since backslashes can only -# be escaped in the modifiers, but not in the variable name. -.if ${:U1 2 3:@:::@x${${:U\:\:\:}}y@} != "x1y x2y x3y" -. error -.endif - -# "@@" is another creative variable name. -.if ${:U1 2 3:@\@\@@x${@@}y@} != "x1y x2y x3y" -. error -.endif - varname-overwriting-target: # Even "@" works as a variable name since the variable is installed # in the "current" scope, which in this case is the one from the @@ -37,54 +15,7 @@ varname-overwriting-target: # even trigger an assertion failure somewhere. @echo :$@: :${:U1 2 3:@\@@x${@}y@}: :$@: -# In extreme cases, even the backslash can be used as variable name. -# It needs to be doubled though. -.if ${:U1 2 3:@\\@x${${:Ux:S,x,\\,}}y@} != "x1y x2y x3y" -. error -.endif - -# The variable name can technically be empty, and in this situation -# the variable value cannot be accessed since the empty "variable" -# is protected to always return an empty string. -.if ${:U1 2 3:@@x${}y@} != "xy xy xy" -. error -.endif - -# The :@ modifier resolves the variables from the replacement text once more -# than expected. In particular, it resolves _all_ variables from the scope, -# and not only the loop variable (in this case v). -SRCS= source -CFLAGS.source= before -ALL_CFLAGS:= ${SRCS:@src@${CFLAGS.${src}}@} # note the ':=' -CFLAGS.source+= after -.if ${ALL_CFLAGS} != "before" -. error -.endif - - -# In the following example, the modifier ':@' expands the '$$' to '$'. This -# means that when the resulting expression is evaluated, these resulting '$' -# will be interpreted as starting a subexpression. -# -# The d means direct reference, the i means indirect reference. -RESOLVE= ${RES1} $${RES1} -RES1= 1d${RES2} 1i$${RES2} -RES2= 2d${RES3} 2i$${RES3} -RES3= 3 - -# TODO: convert to '.if'. -mod-loop-resolve: - @echo $@:${RESOLVE:@v@w${v}w@:Q}: - - -# Until 2020-07-20, the variable name of the :@ modifier could end with one -# or two dollar signs, which were silently ignored. -# There's no point in allowing a dollar sign in that position. -mod-loop-varname-dollar: - @echo $@:${1 2 3:L:@v$@($v)@:Q}. - @echo $@:${1 2 3:L:@v$$@($v)@:Q}. - @echo $@:${1 2 3:L:@v$$$@($v)@:Q}. # Demonstrate that it is possible to generate dollar signs using the # :@ modifier. Added files: Index: src/usr.bin/make/unit-tests/varmod-loop-varname.exp diff -u /dev/null src/usr.bin/make/unit-tests/varmod-loop-varname.exp:1.1 --- /dev/null Sun Apr 4 13:20:52 2021 +++ src/usr.bin/make/unit-tests/varmod-loop-varname.exp Sun Apr 4 13:20:52 2021 @@ -0,0 +1 @@ +exit status 0 Index: src/usr.bin/make/unit-tests/varmod-loop-varname.mk diff -u /dev/null src/usr.bin/make/unit-tests/varmod-loop-varname.mk:1.1 --- /dev/null Sun Apr 4 13:20:52 2021 +++ src/usr.bin/make/unit-tests/varmod-loop-varname.mk Sun Apr 4 13:20:52 2021 @@ -0,0 +1,119 @@ +# $NetBSD: varmod-loop-varname.mk,v 1.1 2021/04/04 13:20:52 rillig Exp $ +# +# Tests for the first part of the variable modifier ':@var@...@', which +# contains the variable name to use during the loop. + +.MAKE.SAVE_DOLLARS= yes + + +# In the :@ modifier, the name of the loop variable can be generated +# dynamically. There's no practical use-case for this, and hopefully nobody +# will ever depend on this, but technically it's possible. +# Therefore, in -dL mode, this is forbidden, see lint.mk. +.if ${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@} != "+one+ +two+ +three+" +. error +.endif + + +# ":::" is a very creative variable name, unlikely to occur in practice. +# The expression ${\:\:\:} would not work since backslashes can only +# be escaped in the modifiers, but not in the variable name, therefore +# the extra indirection via the modifier ':U'. +.if ${:U1 2 3:@:::@x${${:U\:\:\:}}y@} != "x1y x2y x3y" +. error +.endif + + +# "@@" is another creative variable name. +.if ${:U1 2 3:@\@\@@x${@@}y@} != "x1y x2y x3y" +. error +.endif + + +# In extreme cases, even the backslash can be used as variable name. +# It needs to be doubled though. +.if ${:U1 2 3:@\\@x${${:Ux:S,x,\\,}}y@} != "x1y x2y x3y" +. error +.endif + + +# The variable name can technically be empty, and in this situation +# the variable value cannot be accessed since the empty "variable" +# is protected to always return an empty string. +.if ${:U1 2 3:@@x${}y@} != "xy xy xy" +. error +.endif + + +# The :@ modifier resolves the variables from the replacement text once more +# than expected. In particular, it resolves _all_ variables from the scope, +# and not only the loop variable (in this case v). +SRCS= source +CFLAGS.source= before +ALL_CFLAGS:= ${SRCS:@src@${CFLAGS.${src}}@} # note the ':=' +CFLAGS.source+= after +.if ${ALL_CFLAGS} != "before" +. error +.endif + + +# In the following example, the modifier ':@' expands the '$$' to '$'. This +# means that when the resulting expression is evaluated, these resulting '$' +# will be interpreted as starting a subexpression. +# +# The d means direct reference, the i means indirect reference. +RESOLVE= ${RES1} $${RES1} +RES1= 1d${RES2} 1i$${RES2} +RES2= 2d${RES3} 2i$${RES3} +RES3= 3 + +.if ${RESOLVE:@v@w${v}w@} != "w1d2d3w w2i3w w1i2d3 2i\${RES3}w w1d2d3 2i\${RES3} 1i\${RES2}w" +. error +.endif + + +# Until 2020-07-20, the variable name of the :@ modifier could end with one +# or two dollar signs, which were silently ignored. +# There's no point in allowing a dollar sign in that position. +.if ${1 2 3:L:@v$@($v)@} != "(1) (2) (3)" +. error +.endif +.if ${1 2 3:L:@v$$@($v)@} != "() () ()" +. error +.endif +.if ${1 2 3:L:@v$$$@($v)@} != "() () ()" +. error +.endif + + +# It may happen that there are nested :@ modifiers that use the same name for +# for the loop variable. These modifiers influence each other. +# +# As of 2020-10-18, the :@ modifier is implemented by actually setting a +# variable in the scope of the expression and deleting it again after the +# loop. This is different from the .for loops, which substitute the variable +# expression with ${:Uvalue}, leading to different unwanted side effects. +# +# To make the behavior more predictable, the :@ modifier should restore the +# loop variable to the value it had before the loop. This would result in +# the string "1a b c1 2a b c2 3a b c3", making the two loops independent. +.if ${:U1 2 3:@i@$i${:Ua b c:@i@$i@}${i:Uu}@} != "1a b cu 2a b cu 3a b cu" +. error +.endif + +# During the loop, the variable is actually defined and nonempty. +# If the loop were implemented in the same way as the .for loop, the variable +# would be neither defined nor nonempty since all expressions of the form +# ${var} would have been replaced with ${:Uword} before evaluating them. +.if defined(var) +. error +.endif +.if ${:Uword:@var@${defined(var):?def:undef} ${empty(var):?empty:nonempty}@} \ + != "def nonempty" +. error +.endif +.if defined(var) +. error +.endif + +all: .PHONY Index: src/usr.bin/make/unit-tests/varmod-loop-varname.out diff -u /dev/null src/usr.bin/make/unit-tests/varmod-loop-varname.out:1.1 --- /dev/null Sun Apr 4 13:20:52 2021 +++ src/usr.bin/make/unit-tests/varmod-loop-varname.out Sun Apr 4 13:20:52 2021 @@ -0,0 +1 @@ +exit status 0 Index: src/usr.bin/make/unit-tests/varmod-loop-varname.status diff -u /dev/null src/usr.bin/make/unit-tests/varmod-loop-varname.status:1.1 --- /dev/null Sun Apr 4 13:20:52 2021 +++ src/usr.bin/make/unit-tests/varmod-loop-varname.status Sun Apr 4 13:20:52 2021 @@ -0,0 +1 @@ +0