Module Name:    src
Committed By:   rillig
Date:           Sun Jan 16 09:38:04 UTC 2022

Modified Files:
        src/usr.bin/make/unit-tests: var-op-sunsh.mk

Log Message:
tests/make: document more edge cases for the assignment modifier ':sh'


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/var-op-sunsh.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/var-op-sunsh.mk
diff -u src/usr.bin/make/unit-tests/var-op-sunsh.mk:1.8 src/usr.bin/make/unit-tests/var-op-sunsh.mk:1.9
--- src/usr.bin/make/unit-tests/var-op-sunsh.mk:1.8	Sun Apr  4 10:13:09 2021
+++ src/usr.bin/make/unit-tests/var-op-sunsh.mk	Sun Jan 16 09:38:04 2022
@@ -1,8 +1,8 @@
-# $NetBSD: var-op-sunsh.mk,v 1.8 2021/04/04 10:13:09 rillig Exp $
+# $NetBSD: var-op-sunsh.mk,v 1.9 2022/01/16 09:38:04 rillig Exp $
 #
 # Tests for the :sh= variable assignment operator, which runs its right-hand
 # side through the shell.  It is a seldom-used alternative to the !=
-# assignment operator, adopted from Sun make.
+# assignment operator, adopted from SUN make.
 
 .MAKEFLAGS: -dL			# Enable sane error messages
 
@@ -24,9 +24,12 @@ VAR :sh =	echo colon-sh-spaced
 # This was neither documented by NetBSD make nor by Solaris make and was
 # an implementation error.
 #
-# Since 2020-10-04, this is a normal variable assignment using the '='
-# assignment operator.
+# Since 2020-10-04, this is a normal variable assignment to the variable named
+# 'VAR:shell', using the '=' assignment operator.
 VAR:shell=	echo colon-shell
+# The variable name needs to be generated using a ${:U...} expression because
+# it is not possible to express the ':' as part of a literal variable name,
+# see ParseVarname.
 .if ${${:UVAR\:shell}} != "echo colon-shell"
 .  error
 .endif
@@ -95,30 +98,52 @@ VAR :sh :sh :sh :sh=	echo multiple
 # expanding nested expressions, the token ' :sh' can be used to add arbitrary
 # text between the variable name and the assignment operator, it just has to
 # be enclosed in braces or parentheses.
+#
+# Since the text to the left of the assignment operator '=' does not end with
+# ':sh', the effective assignment operator becomes '=', not '!='.
 VAR :sh(Put a comment here)=	comment in parentheses
 .if ${VAR} != "comment in parentheses"
 .  error
 .endif
 
 # The unintended comment can include multiple levels of nested braces and
-# parentheses, they don't even need to be balanced since they are only
-# counted by Parse_IsVar and ignored by Parse_Var.
+# parentheses.  Braces and parentheses are interchangeable, that is, a '(' can
+# be closed by either ')' or '}'.  These braces and parentheses are only
+# counted by Parse_IsVar, in particular Parse_Var doesn't see them.
 VAR :sh{Put}((((a}{comment}}}}{here}=	comment in braces
 .if ${VAR} != "comment in braces"
 .  error
 .endif
 
-# Syntactically, the ':sh' modifier can be combined with the '+=' assignment
-# operator.  In such a case the ':sh' modifier is silently ignored.
+# The assignment modifier ':sh' can be combined with the assignment operator
+# '+='.  In such a case the ':sh' is silently ignored, and the effective
+# assignment operator is '+='.
 #
-# XXX: This combination should not be allowed at all.
+# XXX: This combination should not be allowed at all, as it is confusing.
 VAR=		one
 VAR :sh +=	echo two
 .if ${VAR} != "one echo two"
 .  error ${VAR}
 .endif
 
-# TODO: test VAR:sh!=command
+# The assignment modifier ':sh' can be combined with the assignment operator
+# '!='.  In such a case the ':sh' is silently ignored, and the effective
+# assignment operator is '!=', just like with '+=' or the other compound
+# assignment operators.
+#
+# XXX: This combination should not be allowed at all, as it is confusing.
+VAR :sh !=	echo echo echo echo spaces-around
+.if ${VAR} != "echo echo echo spaces-around"
+.  error ${VAR}
+.endif
+
+# If there is no space between the variable name and the assignment modifier
+# ':sh', the ':sh' becomes part of the variable name, as the parser only
+# expects a single assignment modifier to the left of the '=', which in this
+# case is the '!'.
+VAR:sh !=	echo echo echo echo space-after
+.if ${${:UVAR\:sh}} != "echo echo echo space-after"
+.  error ${${:UVAR\:sh}}
+.endif
 
-all:
-	@:;
+all: .PHONY

Reply via email to