Module Name:    src
Committed By:   rillig
Date:           Sun Mar 30 00:35:52 UTC 2025

Modified Files:
        src/usr.bin/make: var.c
        src/usr.bin/make/unit-tests: moderrs.exp moderrs.mk varmod-sysv.mk
            varmod-to-separator.exp varmod-to-separator.mk varmod.mk

Log Message:
make: let the ":t" modifiers fall back to the ":from=to" modifier

Suggested by https://bugs.freebsd.org/285726.

This means that the ":t" modifiers cannot have future extensions that
include a "=", as that may break existing code.


To generate a diff of this commit:
cvs rdiff -u -r1.1153 -r1.1154 src/usr.bin/make/var.c
cvs rdiff -u -r1.51 -r1.52 src/usr.bin/make/unit-tests/moderrs.exp
cvs rdiff -u -r1.45 -r1.46 src/usr.bin/make/unit-tests/moderrs.mk
cvs rdiff -u -r1.23 -r1.24 src/usr.bin/make/unit-tests/varmod-sysv.mk
cvs rdiff -u -r1.19 -r1.20 \
    src/usr.bin/make/unit-tests/varmod-to-separator.exp
cvs rdiff -u -r1.22 -r1.23 src/usr.bin/make/unit-tests/varmod-to-separator.mk
cvs rdiff -u -r1.24 -r1.25 src/usr.bin/make/unit-tests/varmod.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/var.c
diff -u src/usr.bin/make/var.c:1.1153 src/usr.bin/make/var.c:1.1154
--- src/usr.bin/make/var.c:1.1153	Sat Mar 29 23:50:07 2025
+++ src/usr.bin/make/var.c	Sun Mar 30 00:35:52 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1153 2025/03/29 23:50:07 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1154 2025/03/30 00:35:52 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -128,7 +128,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1153 2025/03/29 23:50:07 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1154 2025/03/30 00:35:52 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -3096,11 +3096,8 @@ ApplyModifier_ToSep(const char **pp, Mod
 		goto ok;
 	}
 
-	/* ":ts<unrecognized><unrecognized>". */
-	if (sep[0] != '\\') {
-		(*pp)++;	/* just for backwards compatibility */
-		return AMR_BAD;
-	}
+	if (sep[0] != '\\')
+		return AMR_UNKNOWN;
 
 	/* ":ts\n" */
 	if (sep[1] == 'n') {
@@ -3124,20 +3121,16 @@ ApplyModifier_ToSep(const char **pp, Mod
 		if (sep[1] == 'x') {
 			base = 16;
 			p++;
-		} else if (!ch_isdigit(sep[1])) {
-			(*pp)++;	/* just for backwards compatibility */
-			return AMR_BAD;	/* ":ts<backslash><unrecognized>". */
-		}
+		} else if (!ch_isdigit(sep[1]))
+			return AMR_UNKNOWN;	/* ":ts\..." */
 
 		if (!TryParseChar(&p, base, &ch->sep)) {
 			Parse_Error(PARSE_FATAL,
 			    "Invalid character number at \"%s\"", p);
 			return AMR_CLEANUP;
 		}
-		if (!IsDelimiter(*p, ch)) {
-			(*pp)++;	/* just for backwards compatibility */
-			return AMR_BAD;
-		}
+		if (!IsDelimiter(*p, ch))
+			return AMR_UNKNOWN;
 
 		*pp = p;
 	}
@@ -3190,18 +3183,14 @@ ApplyModifier_To(const char **pp, ModCha
 	const char *mod = *pp;
 	assert(mod[0] == 't');
 
-	if (IsDelimiter(mod[1], ch)) {
-		*pp = mod + 1;
-		return AMR_BAD;	/* Found ":t<endc>" or ":t:". */
-	}
+	if (IsDelimiter(mod[1], ch))
+		return AMR_UNKNOWN;		/* ":t<endc>" or ":t:" */
 
 	if (mod[1] == 's')
 		return ApplyModifier_ToSep(pp, ch);
 
-	if (!IsDelimiter(mod[2], ch)) {			/* :t<any><any> */
-		*pp = mod + 1;
-		return AMR_BAD;
-	}
+	if (!IsDelimiter(mod[2], ch))
+		return AMR_UNKNOWN;
 
 	if (mod[1] == 'A') {				/* :tA */
 		*pp = mod + 2;
@@ -3236,9 +3225,7 @@ ApplyModifier_To(const char **pp, ModCha
 		return AMR_OK;
 	}
 
-	/* Found ":t<unrecognized>:" or ":t<unrecognized><endc>". */
-	*pp = mod + 1;		/* XXX: unnecessary but observable */
-	return AMR_BAD;
+	return AMR_UNKNOWN;		/* ":t<any>:" or ":t<any><endc>" */
 }
 
 /* :[#], :[1], :[-1..1], etc. */

Index: src/usr.bin/make/unit-tests/moderrs.exp
diff -u src/usr.bin/make/unit-tests/moderrs.exp:1.51 src/usr.bin/make/unit-tests/moderrs.exp:1.52
--- src/usr.bin/make/unit-tests/moderrs.exp:1.51	Sat Mar 29 19:08:52 2025
+++ src/usr.bin/make/unit-tests/moderrs.exp	Sun Mar 30 00:35:52 2025
@@ -107,31 +107,31 @@ make: Unclosed expression, expecting '}'
 7: TheVariable
 112358132134
 15152535558513521534
-make: Bad modifier ":ts\65oct"
+make: Unknown modifier ":ts\65oct"
 	while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${FIB:ts\65oct}	# bad modifier"
 	in target "mod-ts-parse-3"
-make: Bad modifier ":ts\65oct"
+make: Unknown modifier ":ts\65oct"
 	while evaluating "${:U${FIB}:ts\65oct} # bad modifier, variable name is """ with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${:U${FIB}:ts\65oct} # bad modifier, variable name is """
 	in target "mod-ts-parse-4"
-make: Bad modifier ":tsxy"
+make: Unknown modifier ":tsxy"
 	while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${FIB:tsxy}	# modifier too long"
 	in target "mod-ts-parse-5"
-make: Bad modifier ":t"
+make: Unknown modifier ":t"
 	while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${FIB:t"
 	in target "mod-t-parse-1"
-make: Bad modifier ":txy"
+make: Unknown modifier ":txy"
 	while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${FIB:txy}"
 	in target "mod-t-parse-2"
-make: Bad modifier ":t"
+make: Unknown modifier ":t"
 	while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${FIB:t}"
 	in target "mod-t-parse-3"
-make: Bad modifier ":t"
+make: Unknown modifier ":t"
 	while evaluating variable "FIB" with value "1 1 2 3 5 8 13 21 34"
 	in command "@echo ${FIB:t:M*}"
 	in target "mod-t-parse-4"

Index: src/usr.bin/make/unit-tests/moderrs.mk
diff -u src/usr.bin/make/unit-tests/moderrs.mk:1.45 src/usr.bin/make/unit-tests/moderrs.mk:1.46
--- src/usr.bin/make/unit-tests/moderrs.mk:1.45	Sat Mar 29 19:08:52 2025
+++ src/usr.bin/make/unit-tests/moderrs.mk	Sun Mar 30 00:35:52 2025
@@ -1,4 +1,4 @@
-# $NetBSD: moderrs.mk,v 1.45 2025/03/29 19:08:52 rillig Exp $
+# $NetBSD: moderrs.mk,v 1.46 2025/03/30 00:35:52 rillig Exp $
 #
 # various modifier error tests
 
@@ -153,26 +153,26 @@ mod-ts-parse-1:
 mod-ts-parse-2:
 	@echo ${FIB:ts\65}	# octal 065 == U+0035 == '5'
 mod-ts-parse-3:
-# expect: make: Bad modifier ":ts\65oct"
+# expect: make: Unknown modifier ":ts\65oct"
 	@echo ${FIB:ts\65oct}	# bad modifier
 mod-ts-parse-4:
-# expect: make: Bad modifier ":ts\65oct"
+# expect: make: Unknown modifier ":ts\65oct"
 	@echo ${:U${FIB}:ts\65oct} # bad modifier, variable name is ""
 mod-ts-parse-5:
-# expect: make: Bad modifier ":tsxy"
+# expect: make: Unknown modifier ":tsxy"
 	@echo ${FIB:tsxy}	# modifier too long
 
 mod-t-parse-1:
-# expect: make: Bad modifier ":t"
+# expect: make: Unknown modifier ":t"
 	@echo ${FIB:t
 mod-t-parse-2:
-# expect: make: Bad modifier ":txy"
+# expect: make: Unknown modifier ":txy"
 	@echo ${FIB:txy}
 mod-t-parse-3:
-# expect: make: Bad modifier ":t"
+# expect: make: Unknown modifier ":t"
 	@echo ${FIB:t}
 mod-t-parse-4:
-# expect: make: Bad modifier ":t"
+# expect: make: Unknown modifier ":t"
 	@echo ${FIB:t:M*}
 
 mod-ifelse-parse-1:

Index: src/usr.bin/make/unit-tests/varmod-sysv.mk
diff -u src/usr.bin/make/unit-tests/varmod-sysv.mk:1.23 src/usr.bin/make/unit-tests/varmod-sysv.mk:1.24
--- src/usr.bin/make/unit-tests/varmod-sysv.mk:1.23	Sat Mar 29 11:51:54 2025
+++ src/usr.bin/make/unit-tests/varmod-sysv.mk	Sun Mar 30 00:35:52 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-sysv.mk,v 1.23 2025/03/29 11:51:54 rillig Exp $
+# $NetBSD: varmod-sysv.mk,v 1.24 2025/03/30 00:35:52 rillig Exp $
 #
 # Tests for the variable modifier ':from=to', which replaces the suffix
 # "from" with "to".  It can also use '%' as a wildcard.
@@ -260,4 +260,27 @@ INDIRECT=	1:${VALUE} 2:$${VALUE} 4:$$$${
 .endif
 
 
+# The various ":t..." modifiers fall back to the ":from=to" modifier.
+.if ${:Utarget:target=source} != "source"
+.  error
+.endif
+.if ${:Ufile.ts:ts=js} != "file.js"
+.  error
+.endif
+.if ${:Ufile.tsx:tsx=jsx} != "file.jsx"
+.  error
+.endif
+.if ${:Ufile.ts\\part:ts\part=replaced} != "file.replaced"
+.  error
+.endif
+.if ${:Ufile.ts\\123xyz:ts\123xyz=gone} != "file.gone"
+.  error
+.endif
+# Since the ":ts=" modifier is a valid form of the ":ts" modifier, don't fall
+# back to the ":from=to" modifier.
+.if ${:U1 2 3 file.ts:ts=} != "1=2=3=file.ts"
+.  error
+.endif
+
+
 all:

Index: src/usr.bin/make/unit-tests/varmod-to-separator.exp
diff -u src/usr.bin/make/unit-tests/varmod-to-separator.exp:1.19 src/usr.bin/make/unit-tests/varmod-to-separator.exp:1.20
--- src/usr.bin/make/unit-tests/varmod-to-separator.exp:1.19	Sat Jan 11 20:54:46 2025
+++ src/usr.bin/make/unit-tests/varmod-to-separator.exp	Sun Mar 30 00:35:52 2025
@@ -6,21 +6,21 @@ make: "varmod-to-separator.mk" line 177:
 	while evaluating variable "word" with value "word"
 make: "varmod-to-separator.mk" line 183: Invalid character number at "112233445566778899}"
 	while evaluating variable "word" with value "word"
-make: "varmod-to-separator.mk" line 188: Bad modifier ":ts\-300"
+make: "varmod-to-separator.mk" line 188: Unknown modifier ":ts\-300"
 	while evaluating variable "WORDS" with value "one two three"
-make: "varmod-to-separator.mk" line 197: Bad modifier ":ts\8"
+make: "varmod-to-separator.mk" line 197: Unknown modifier ":ts\8"
 	while evaluating variable "1 2 3" with value "1 2 3"
-make: "varmod-to-separator.mk" line 205: Bad modifier ":ts\100L"
+make: "varmod-to-separator.mk" line 205: Unknown modifier ":ts\100L"
 	while evaluating variable "1 2 3" with value "1 2 3"
-make: "varmod-to-separator.mk" line 213: Bad modifier ":ts\x40g"
+make: "varmod-to-separator.mk" line 213: Unknown modifier ":ts\x40g"
 	while evaluating variable "1 2 3" with value "1 2 3"
-make: "varmod-to-separator.mk" line 222: Bad modifier ":tx"
+make: "varmod-to-separator.mk" line 222: Unknown modifier ":tx"
 	while evaluating variable "WORDS" with value "one two three four five six"
-make: "varmod-to-separator.mk" line 230: Bad modifier ":ts\X"
+make: "varmod-to-separator.mk" line 230: Unknown modifier ":ts\X"
 	while evaluating variable "WORDS" with value "one two three four five six"
-make: "varmod-to-separator.mk" line 239: Bad modifier ":t\X"
+make: "varmod-to-separator.mk" line 239: Unknown modifier ":ts\X"
 	while evaluating variable "WORDS" with value "one two three four five six"
-make: "varmod-to-separator.mk" line 255: Bad modifier ":ts\69"
+make: "varmod-to-separator.mk" line 255: Unknown modifier ":ts\69"
 	while evaluating "${:Ua b:ts\69}" with value "a b"
 make: "varmod-to-separator.mk" line 263: Invalid character number at "1F60E}"
 	while evaluating "${:Ua b:ts\x1F60E}" with value "a b"

Index: src/usr.bin/make/unit-tests/varmod-to-separator.mk
diff -u src/usr.bin/make/unit-tests/varmod-to-separator.mk:1.22 src/usr.bin/make/unit-tests/varmod-to-separator.mk:1.23
--- src/usr.bin/make/unit-tests/varmod-to-separator.mk:1.22	Sat Mar 29 17:31:34 2025
+++ src/usr.bin/make/unit-tests/varmod-to-separator.mk	Sun Mar 30 00:35:52 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-to-separator.mk,v 1.22 2025/03/29 17:31:34 rillig Exp $
+# $NetBSD: varmod-to-separator.mk,v 1.23 2025/03/30 00:35:52 rillig Exp $
 #
 # Tests for the :ts variable modifier, which joins the words of the variable
 # using an arbitrary character as word separator.
@@ -184,7 +184,7 @@ WORDS=	one two three four five six
 .endif
 
 # Negative numbers are not allowed for the separator character.
-# expect+1: Bad modifier ":ts\-300"
+# expect+1: Unknown modifier ":ts\-300"
 .if ${WORDS:[1..3]:ts\-300:tu}
 .  error
 .else
@@ -193,7 +193,7 @@ WORDS=	one two three four five six
 
 # The character number is interpreted as octal number by default.
 # The digit '8' is not an octal digit though.
-# expect+1: Bad modifier ":ts\8"
+# expect+1: Unknown modifier ":ts\8"
 .if ${1 2 3:L:ts\8:tu}
 .  error
 .else
@@ -201,7 +201,7 @@ WORDS=	one two three four five six
 .endif
 
 # Trailing characters after the octal character number are rejected.
-# expect+1: Bad modifier ":ts\100L"
+# expect+1: Unknown modifier ":ts\100L"
 .if ${1 2 3:L:ts\100L}
 .  error
 .else
@@ -209,7 +209,7 @@ WORDS=	one two three four five six
 .endif
 
 # Trailing characters after the hexadecimal character number are rejected.
-# expect+1: Bad modifier ":ts\x40g"
+# expect+1: Unknown modifier ":ts\x40g"
 .if ${1 2 3:L:ts\x40g}
 .  error
 .else
@@ -218,7 +218,7 @@ WORDS=	one two three four five six
 
 
 # In the :t modifier, the :t must be followed by any of A, l, s, u.
-# expect+1: Bad modifier ":tx"
+# expect+1: Unknown modifier ":tx"
 .if ${WORDS:tx}
 .  error
 .else
@@ -226,7 +226,7 @@ WORDS=	one two three four five six
 .endif
 
 # The word separator can only be a single character.
-# expect+1: Bad modifier ":ts\X"
+# expect+1: Unknown modifier ":ts\X"
 .if ${WORDS:ts\X}
 .  error
 .else
@@ -235,8 +235,8 @@ WORDS=	one two three four five six
 
 # After the backslash, only n, t, an octal number, or x and a hexadecimal
 # number are allowed.
-# expect+1: Bad modifier ":t\X"
-.if ${WORDS:t\X} != "anything"
+# expect+1: Unknown modifier ":ts\X"
+.if ${WORDS:ts\X} != "anything"
 .  error
 .endif
 
@@ -251,7 +251,7 @@ WORDS=	one two three four five six
 # happens for non-octal digits.  From 2003.07.23.18.06.46 to
 # 2016.02.27.16.20.06, the result was '1E2', since 2016.03.07.20.20.35 make no
 # longer accepts this escape and complains.
-# expect+1: Bad modifier ":ts\69"
+# expect+1: Unknown modifier ":ts\69"
 .if ${:Ua b:ts\69}
 .  error
 .else

Index: src/usr.bin/make/unit-tests/varmod.mk
diff -u src/usr.bin/make/unit-tests/varmod.mk:1.24 src/usr.bin/make/unit-tests/varmod.mk:1.25
--- src/usr.bin/make/unit-tests/varmod.mk:1.24	Sat Mar 29 23:50:07 2025
+++ src/usr.bin/make/unit-tests/varmod.mk	Sun Mar 30 00:35:52 2025
@@ -1,4 +1,4 @@
-# $NetBSD: varmod.mk,v 1.24 2025/03/29 23:50:07 rillig Exp $
+# $NetBSD: varmod.mk,v 1.25 2025/03/30 00:35:52 rillig Exp $
 #
 # Tests for variable modifiers, such as :Q, :S,from,to or :Ufallback.
 #
@@ -62,7 +62,7 @@
 # | q            | strict       |                    | yes      |
 # | range        | strict       |                    | no       |
 # | sh           | strict       |                    | yes      |
-# | t            | strict       |                    | no       |
+# | t            | strict       |                    | yes      |
 # | u            | strict       |                    | yes      |
 # | from=to      | greedy       | SysV, fallback     | ---      |
 

Reply via email to