Module Name: src Committed By: rillig Date: Sun Dec 17 14:07:22 UTC 2023
Modified Files: src/usr.bin/make/unit-tests: directive-include-guard.exp directive-include-guard.mk var-scope-local-legacy.exp var-scope-local-legacy.mk varmod-mtime.mk varmod-range.exp varmod-range.mk varmod-subst-regex.mk varmod-subst.mk Log Message: tests/make: extend tests for include guards and empty expressions To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 \ src/usr.bin/make/unit-tests/directive-include-guard.exp cvs rdiff -u -r1.15 -r1.16 \ src/usr.bin/make/unit-tests/directive-include-guard.mk cvs rdiff -u -r1.2 -r1.3 \ src/usr.bin/make/unit-tests/var-scope-local-legacy.exp \ src/usr.bin/make/unit-tests/var-scope-local-legacy.mk cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/varmod-mtime.mk cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/varmod-range.exp cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/varmod-range.mk \ src/usr.bin/make/unit-tests/varmod-subst-regex.mk cvs rdiff -u -r1.12 -r1.13 src/usr.bin/make/unit-tests/varmod-subst.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/directive-include-guard.exp diff -u src/usr.bin/make/unit-tests/directive-include-guard.exp:1.13 src/usr.bin/make/unit-tests/directive-include-guard.exp:1.14 --- src/usr.bin/make/unit-tests/directive-include-guard.exp:1.13 Sun Dec 17 09:17:16 2023 +++ src/usr.bin/make/unit-tests/directive-include-guard.exp Sun Dec 17 14:07:22 2023 @@ -99,4 +99,6 @@ Parse_PushInput: file target-name-parent Parse_PushInput: file target-name-parenthesized.tmp, line 1 Parse_PushInput: file target-call-parenthesized.tmp, line 1 Parse_PushInput: file target-call-parenthesized.tmp, line 1 +Parse_PushInput: file multiline.tmp, line 1 +Skipping 'multiline.tmp' because 'MULTILINE' is defined exit status 0 Index: src/usr.bin/make/unit-tests/directive-include-guard.mk diff -u src/usr.bin/make/unit-tests/directive-include-guard.mk:1.15 src/usr.bin/make/unit-tests/directive-include-guard.mk:1.16 --- src/usr.bin/make/unit-tests/directive-include-guard.mk:1.15 Sun Dec 17 09:17:16 2023 +++ src/usr.bin/make/unit-tests/directive-include-guard.mk Sun Dec 17 14:07:22 2023 @@ -1,4 +1,4 @@ -# $NetBSD: directive-include-guard.mk,v 1.15 2023/12/17 09:17:16 rillig Exp $ +# $NetBSD: directive-include-guard.mk,v 1.16 2023/12/17 14:07:22 rillig Exp $ # # Tests for multiple-inclusion guards in makefiles. # @@ -601,6 +601,20 @@ LINES.target-call-parenthesized= \ # expect: Parse_PushInput: file target-call-parenthesized.tmp, line 1 # expect: Parse_PushInput: file target-call-parenthesized.tmp, line 1 +# If the '.if' or '.ifndef' directive spans more than a single line, it is +# still recognized as a guard condition. This case is entirely uncommon, but +# at the point where the guard condition is checked, line continuations have +# already been converted to spaces. +CASES+= multiline +LINES.multiline= \ + '.\' \ + ' ifndef \' \ + ' MULTILINE' \ + 'MULTILINE=' \ + '.endif' +# expect: Parse_PushInput: file multiline.tmp, line 1 +# expect: Skipping 'multiline.tmp' because 'MULTILINE' is defined + # Now run all test cases by including each of the files twice and looking at # the debug output. The files that properly guard against multiple inclusion Index: src/usr.bin/make/unit-tests/var-scope-local-legacy.exp diff -u src/usr.bin/make/unit-tests/var-scope-local-legacy.exp:1.2 src/usr.bin/make/unit-tests/var-scope-local-legacy.exp:1.3 --- src/usr.bin/make/unit-tests/var-scope-local-legacy.exp:1.2 Tue Sep 27 19:18:45 2022 +++ src/usr.bin/make/unit-tests/var-scope-local-legacy.exp Sun Dec 17 14:07:22 2023 @@ -2,5 +2,5 @@ : XY=undef_ : AF=undef_ : %D=undef_ %F=undef_ -: @D=._ @F=all_ +: @D=global-value_ @F=all_ exit status 0 Index: src/usr.bin/make/unit-tests/var-scope-local-legacy.mk diff -u src/usr.bin/make/unit-tests/var-scope-local-legacy.mk:1.2 src/usr.bin/make/unit-tests/var-scope-local-legacy.mk:1.3 --- src/usr.bin/make/unit-tests/var-scope-local-legacy.mk:1.2 Tue Sep 27 19:18:45 2022 +++ src/usr.bin/make/unit-tests/var-scope-local-legacy.mk Sun Dec 17 14:07:22 2023 @@ -1,7 +1,24 @@ -# $NetBSD: var-scope-local-legacy.mk,v 1.2 2022/09/27 19:18:45 rillig Exp $ +# $NetBSD: var-scope-local-legacy.mk,v 1.3 2023/12/17 14:07:22 rillig Exp $ # # Tests for legacy target-local variables, such as ${<F} or ${@D}. + +# In the global or command line scopes, the legacy forms are not recognized, +# as the target-specific variables are not available either. The expressions +# are retained so that they can be resolved later, in the target scope. +.if "${@D}" != "\${@D}" +. error +.endif + +# It's possible to define variables of the legacy name in the global or +# command line scope, and they override the target-local variables, leading to +# unnecessary confusion. +@D= global-value +.if "${@D}" != "global-value" +. error +.endif + + all: .PHONY # Only variables of length 2 can be legacy, this one cannot. : LEN4=${LEN4:Uundef}_ @@ -13,5 +30,6 @@ all: .PHONY # The variable '.MEMBER' is undefined, therefore '%D' and '%F' are # undefined as well. : %D=${%D:Uundef}_ %F=${%F:Uundef}_ - # The directory name of the target is '.', its basename is 'all'. + # The directory name of the target is shadowed by the global variable, + # it would be '.' otherwise. The basename is 'all'. : @D=${@D:Uundef}_ @F=${@F:Uundef}_ Index: src/usr.bin/make/unit-tests/varmod-mtime.mk diff -u src/usr.bin/make/unit-tests/varmod-mtime.mk:1.8 src/usr.bin/make/unit-tests/varmod-mtime.mk:1.9 --- src/usr.bin/make/unit-tests/varmod-mtime.mk:1.8 Sun Nov 19 12:11:34 2023 +++ src/usr.bin/make/unit-tests/varmod-mtime.mk Sun Dec 17 14:07:22 2023 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-mtime.mk,v 1.8 2023/11/19 12:11:34 rillig Exp $ +# $NetBSD: varmod-mtime.mk,v 1.9 2023/12/17 14:07:22 rillig Exp $ # # Tests for the ':mtime' variable modifier, which maps each word of the # expression to that file's modification time. @@ -104,7 +104,7 @@ end:= ${%s:L:gmtime} # If the expression is irrelevant, the ':mtime' modifier is only parsed, it # does not perform any filesystem operations. -.if 0 && ${anything:L:mtime} +.if 0 && ${no/such/file:L:mtime=error} . error .endif @@ -117,3 +117,9 @@ end:= ${%s:L:gmtime} .else . error .endif + + +# An empty word list results in an empty mtime list. +.if ${:U:mtime} != "" +. error +.endif Index: src/usr.bin/make/unit-tests/varmod-range.exp diff -u src/usr.bin/make/unit-tests/varmod-range.exp:1.10 src/usr.bin/make/unit-tests/varmod-range.exp:1.11 --- src/usr.bin/make/unit-tests/varmod-range.exp:1.10 Thu Jun 1 20:56:35 2023 +++ src/usr.bin/make/unit-tests/varmod-range.exp Sun Dec 17 14:07:22 2023 @@ -1,13 +1,14 @@ -make: "varmod-range.mk" line 55: Invalid number "x}Rest" != "Rest"" for ':range' modifier -make: "varmod-range.mk" line 55: Malformed conditional ("${:U:range=x}Rest" != "Rest") -make: "varmod-range.mk" line 66: Unknown modifier "x0" -make: "varmod-range.mk" line 66: Malformed conditional ("${:U:range=0x0}Rest" != "Rest") -make: "varmod-range.mk" line 84: Unknown modifier "rang" -make: "varmod-range.mk" line 84: Malformed conditional ("${a b c:L:rang}Rest" != "Rest") -make: "varmod-range.mk" line 93: Unknown modifier "rango" -make: "varmod-range.mk" line 93: Malformed conditional ("${a b c:L:rango}Rest" != "Rest") -make: "varmod-range.mk" line 102: Unknown modifier "ranger" -make: "varmod-range.mk" line 102: Malformed conditional ("${a b c:L:ranger}Rest" != "Rest") +make: "varmod-range.mk" line 43: Malformed conditional (${:range=5} != "") +make: "varmod-range.mk" line 67: Invalid number "x}Rest" != "Rest"" for ':range' modifier +make: "varmod-range.mk" line 67: Malformed conditional ("${:U:range=x}Rest" != "Rest") +make: "varmod-range.mk" line 78: Unknown modifier "x0" +make: "varmod-range.mk" line 78: Malformed conditional ("${:U:range=0x0}Rest" != "Rest") +make: "varmod-range.mk" line 96: Unknown modifier "rang" +make: "varmod-range.mk" line 96: Malformed conditional ("${a b c:L:rang}Rest" != "Rest") +make: "varmod-range.mk" line 105: Unknown modifier "rango" +make: "varmod-range.mk" line 105: Malformed conditional ("${a b c:L:rango}Rest" != "Rest") +make: "varmod-range.mk" line 114: Unknown modifier "ranger" +make: "varmod-range.mk" line 114: Malformed conditional ("${a b c:L:ranger}Rest" != "Rest") make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/varmod-range.mk diff -u src/usr.bin/make/unit-tests/varmod-range.mk:1.9 src/usr.bin/make/unit-tests/varmod-range.mk:1.10 --- src/usr.bin/make/unit-tests/varmod-range.mk:1.9 Sun Nov 19 21:47:52 2023 +++ src/usr.bin/make/unit-tests/varmod-range.mk Sun Dec 17 14:07:22 2023 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-range.mk,v 1.9 2023/11/19 21:47:52 rillig Exp $ +# $NetBSD: varmod-range.mk,v 1.10 2023/12/17 14:07:22 rillig Exp $ # # Tests for the :range variable modifier, which generates sequences # of integers from the given range. @@ -25,14 +25,26 @@ . error .endif +# An empty expression results in a sequence of a single number, even though +# the expression contains 0 words. +.if ${:U:range} != "1" +. error +.endif + # The :range modifier can be given a parameter, which makes the generated # range independent from the value or the name of the expression. -# -# XXX: As of 2020-09-27, the :range=... modifier does not turn the undefined -# expression into a defined one. This looks like an oversight. .if "${:range=5}" != "" . error .endif +# XXX: As of 2023-12-17, the ':range=n' modifier does not turn the undefined +# expression into a defined one, even though it does not depend on the value +# of the expression. This looks like an oversight. +# expect+1: Malformed conditional (${:range=5} != "") +.if ${:range=5} != "" +. error +.else +. error +.endif # Negative ranges don't make sense. # As of 2020-11-01, they are accepted though, using up all available memory. Index: src/usr.bin/make/unit-tests/varmod-subst-regex.mk diff -u src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.9 src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.10 --- src/usr.bin/make/unit-tests/varmod-subst-regex.mk:1.9 Sun Dec 10 14:30:51 2023 +++ src/usr.bin/make/unit-tests/varmod-subst-regex.mk Sun Dec 17 14:07:22 2023 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-subst-regex.mk,v 1.9 2023/12/10 14:30:51 rillig Exp $ +# $NetBSD: varmod-subst-regex.mk,v 1.10 2023/12/17 14:07:22 rillig Exp $ # # Tests for the :C,from,to, variable modifier. @@ -85,10 +85,10 @@ all: unmatched-subexpression .endif -# Contrary to the ':S' modifier, the ':C' modifier matches on an expression +# Like the ':S' modifier, the ':C' modifier matches on an expression # that contains no words at all, but only if the regular expression matches an # empty string, for example, when the regular expression is anchored at the -# beginning or the end. +# beginning or the end of the word. .if "<${U:S,^,prefix,}> <${:U:C,^,prefix,}>" != "<> <prefix>" . error .endif @@ -126,7 +126,7 @@ mod-regex-limits: @echo $@:22-missing:${:U1 23 456:C,(.).,\2\2,:Q} @echo $@:22-ok:${:U1 23 456:C,(.)(.),\2\2,:Q} # The :C modifier only handles single-digit capturing groups, - # which is more than enough for daily use. + # which is enough for all practical use cases. @echo $@:capture:${:UabcdefghijABCDEFGHIJrest:C,(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.),\9\8\7\6\5\4\3\2\1\0\10\11\12,} mod-regex-errors: Index: src/usr.bin/make/unit-tests/varmod-subst.mk diff -u src/usr.bin/make/unit-tests/varmod-subst.mk:1.12 src/usr.bin/make/unit-tests/varmod-subst.mk:1.13 --- src/usr.bin/make/unit-tests/varmod-subst.mk:1.12 Fri Jun 16 07:20:45 2023 +++ src/usr.bin/make/unit-tests/varmod-subst.mk Sun Dec 17 14:07:22 2023 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-subst.mk,v 1.12 2023/06/16 07:20:45 rillig Exp $ +# $NetBSD: varmod-subst.mk,v 1.13 2023/12/17 14:07:22 rillig Exp $ # # Tests for the :S,from,to, variable modifier. @@ -9,7 +9,8 @@ all: mod-subst-dollar WORDS= sequences of letters -# The empty pattern never matches anything. +# The empty pattern never matches anything, except if it is anchored at the +# beginning or the end of the word. .if ${WORDS:S,,,} != ${WORDS} . error .endif @@ -141,6 +142,22 @@ WORDS= sequences of letters .endif +# In an empty expression, the ':S' modifier matches a single time if the +# search string is anchored at the beginning or at the end. +.if ${:U:S,,out-of-nothing,} != "" +. error +.endif +.if ${:U:S,^,out-of-nothing,} != "out-of-nothing" +. error +.endif +.if ${:U:S,$,out-of-nothing,} != "out-of-nothing" +. error +.endif +.if ${:U:S,^$,out-of-nothing,} != "out-of-nothing" +. error +.endif + + mod-subst: @echo $@: @echo :${:Ua b b c:S,a b,,:Q}: