Module Name: src
Committed By: rillig
Date: Sun May 8 06:51:27 UTC 2022
Modified Files:
src/distrib/sets/lists/tests: mi
src/usr.bin/make/unit-tests: Makefile comment.mk compat-error.mk
cond-cmp-string.mk cond-func-defined.mk cond-token-string.exp
cond-token-string.mk directive-for-lines.mk directive-for-null.mk
directive-info.mk opt-jobs-no-action.mk varmod-ifelse.mk
varmod-match.mk
Removed Files:
src/usr.bin/make/unit-tests: cond1.exp cond1.mk
Log Message:
tests/make: migrate cond1 test to other, more specific tests
The tests in cond1 were a mixture of "everything related to conditions",
and the test cases were heavily dependent on each other, which made them
hard to understand. Move each test case to its corresponding
special-purpose test.
To generate a diff of this commit:
cvs rdiff -u -r1.1201 -r1.1202 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.313 -r1.314 src/usr.bin/make/unit-tests/Makefile
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/comment.mk \
src/usr.bin/make/unit-tests/compat-error.mk \
src/usr.bin/make/unit-tests/cond-token-string.mk
cvs rdiff -u -r1.15 -r1.16 src/usr.bin/make/unit-tests/cond-cmp-string.mk
cvs rdiff -u -r1.8 -r1.9 src/usr.bin/make/unit-tests/cond-func-defined.mk \
src/usr.bin/make/unit-tests/varmod-match.mk
cvs rdiff -u -r1.7 -r1.8 src/usr.bin/make/unit-tests/cond-token-string.exp
cvs rdiff -u -r1.5 -r0 src/usr.bin/make/unit-tests/cond1.exp
cvs rdiff -u -r1.3 -r0 src/usr.bin/make/unit-tests/cond1.mk
cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/directive-for-lines.mk
cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/directive-for-null.mk
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/directive-info.mk \
src/usr.bin/make/unit-tests/opt-jobs-no-action.mk
cvs rdiff -u -r1.18 -r1.19 src/usr.bin/make/unit-tests/varmod-ifelse.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.1201 src/distrib/sets/lists/tests/mi:1.1202
--- src/distrib/sets/lists/tests/mi:1.1201 Fri Apr 29 22:17:50 2022
+++ src/distrib/sets/lists/tests/mi Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1201 2022/04/29 22:17:50 pgoyette Exp $
+# $NetBSD: mi,v 1.1202 2022/05/08 06:51:27 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -5459,8 +5459,8 @@
./usr/tests/usr.bin/make/unit-tests/cond-token-var.mk tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/cond-undef-lint.exp tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/make/unit-tests/cond-undef-lint.mk tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/cond1.exp tests-usr.bin-tests compattestfile,atf
-./usr/tests/usr.bin/make/unit-tests/cond1.mk tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/make/unit-tests/cond1.exp tests-obsolete obsolete,atf
+./usr/tests/usr.bin/make/unit-tests/cond1.mk tests-obsolete obsolete,atf
./usr/tests/usr.bin/make/unit-tests/cond2.exp obsolete-tests obsolete
./usr/tests/usr.bin/make/unit-tests/cond2.mk obsolete-tests obsolete
./usr/tests/usr.bin/make/unit-tests/counter-append.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.313 src/usr.bin/make/unit-tests/Makefile:1.314
--- src/usr.bin/make/unit-tests/Makefile:1.313 Sat May 7 17:49:47 2022
+++ src/usr.bin/make/unit-tests/Makefile Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.313 2022/05/07 17:49:47 rillig Exp $
+# $NetBSD: Makefile,v 1.314 2022/05/08 06:51:27 rillig Exp $
#
# Unit tests for make(1)
#
@@ -84,7 +84,6 @@ TESTS+= cond-token-plain
TESTS+= cond-token-string
TESTS+= cond-token-var
TESTS+= cond-undef-lint
-TESTS+= cond1
TESTS+= counter
TESTS+= counter-append
TESTS+= dep
Index: src/usr.bin/make/unit-tests/comment.mk
diff -u src/usr.bin/make/unit-tests/comment.mk:1.4 src/usr.bin/make/unit-tests/comment.mk:1.5
--- src/usr.bin/make/unit-tests/comment.mk:1.4 Sun Jan 23 18:00:53 2022
+++ src/usr.bin/make/unit-tests/comment.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: comment.mk,v 1.4 2022/01/23 18:00:53 rillig Exp $
+# $NetBSD: comment.mk,v 1.5 2022/05/08 06:51:27 rillig Exp $
#
# Demonstrate how comments are written in makefiles.
@@ -23,7 +23,7 @@ on and on.
.endif # And after the closing directive.
VAR= # This comment makes the variable value empty.
- # ParseGetLine removes any whitespace before the
+ # ParseRawLine removes any whitespace before the
# comment.
.if ${VAR} != ""
. error
Index: src/usr.bin/make/unit-tests/compat-error.mk
diff -u src/usr.bin/make/unit-tests/compat-error.mk:1.4 src/usr.bin/make/unit-tests/compat-error.mk:1.5
--- src/usr.bin/make/unit-tests/compat-error.mk:1.4 Sat May 7 08:01:20 2022
+++ src/usr.bin/make/unit-tests/compat-error.mk Sun May 8 06:51:27 2022
@@ -1,14 +1,21 @@
-# $NetBSD: compat-error.mk,v 1.4 2022/05/07 08:01:20 rillig Exp $
+# $NetBSD: compat-error.mk,v 1.5 2022/05/08 06:51:27 rillig Exp $
#
# Test detailed error handling in compat mode.
#
-# Until 2020-12-13, .ERROR_TARGET was success3, which was wrong.
-# Since compat.c 1.215 from 2020-12-13, it is 'fail1', which is the first
-# failed top-level target. XXX: Even better would be if .ERROR_TARGET were
-# the smallest target that caused the build to fail, even if it were a
-# sub-sub-sub-dependency of a top-level target.
+# Make several targets that alternately succeed and fail.
#
-# XXX: As of 2020-12-13, .ERROR_CMD is empty, which is wrong.
+# The first failing top-level target is recorded in '.ERROR_TARGET'. While
+# this information may give a hint as to which target failed, it would be more
+# useful at that point to know the actual target that failed, or the complete
+# chain from root cause to top-level target.
+#
+# Historic bugs
+# Before compat.c 1.215 from 2020-12-13, '.ERROR_TARGET' was 'success3',
+# which was obviously wrong.
+#
+# Bugs
+# As of 2020-12-13, '.ERROR_CMD' is empty, which does not provide any
+# insight into the command that actually failed.
#
# See also:
# Compat_MakeAll
@@ -20,10 +27,10 @@
# 2020: LstNode_SetNull(cmdNode);
#
# The commit that skipped NULL commands for .ERROR_CMD:
-# CVS: 2016.08.11.19.53.??
+# CVS: 2016.08.11.19.53.17
# Git: 58b23478b7353d46457089e726b07a49197388e4
-.MAKEFLAGS: success1 fail1 success2 fail2 success3
+.MAKEFLAGS: -k success1 fail1 success2 fail2 success3
success1 success2 success3:
: Making ${.TARGET} out of nothing.
Index: src/usr.bin/make/unit-tests/cond-token-string.mk
diff -u src/usr.bin/make/unit-tests/cond-token-string.mk:1.4 src/usr.bin/make/unit-tests/cond-token-string.mk:1.5
--- src/usr.bin/make/unit-tests/cond-token-string.mk:1.4 Thu Jan 21 00:38:28 2021
+++ src/usr.bin/make/unit-tests/cond-token-string.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: cond-token-string.mk,v 1.4 2021/01/21 00:38:28 rillig Exp $
+# $NetBSD: cond-token-string.mk,v 1.5 2022/05/08 06:51:27 rillig Exp $
#
# Tests for quoted string literals in .if conditions.
#
@@ -76,7 +76,22 @@
. info An empty variable evaluates to false.
.endif
+# A non-empty string evaluates to true, no matter if it's a literal string or
+# if it contains variable expressions.
+VAR= value
+.if ("${VALUE}")
+.else
+. error
+.endif
+
+# In the conditions in .if directives, the left-hand side of a comparison must
+# be enclosed in quotes. The right-hand side does not need to be enclosed in
+# quotes.
+.if "quoted" == quoted
+.else
+. error
+.endif
+
.MAKEFLAGS: -d0
-all:
- @:;
+all: .PHONY
Index: src/usr.bin/make/unit-tests/cond-cmp-string.mk
diff -u src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.15 src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.16
--- src/usr.bin/make/unit-tests/cond-cmp-string.mk:1.15 Sat Dec 11 09:53:53 2021
+++ src/usr.bin/make/unit-tests/cond-cmp-string.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: cond-cmp-string.mk,v 1.15 2021/12/11 09:53:53 rillig Exp $
+# $NetBSD: cond-cmp-string.mk,v 1.16 2022/05/08 06:51:27 rillig Exp $
#
# Tests for string comparisons in .if conditions.
@@ -136,3 +136,11 @@
.else
. error
.endif
+
+# Two variables with different values compare unequal.
+VAR1= value1
+VAR2= value2
+.if ${VAR1} != ${VAR2}
+.else
+. error
+.endif
Index: src/usr.bin/make/unit-tests/cond-func-defined.mk
diff -u src/usr.bin/make/unit-tests/cond-func-defined.mk:1.8 src/usr.bin/make/unit-tests/cond-func-defined.mk:1.9
--- src/usr.bin/make/unit-tests/cond-func-defined.mk:1.8 Sun Dec 12 08:55:28 2021
+++ src/usr.bin/make/unit-tests/cond-func-defined.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: cond-func-defined.mk,v 1.8 2021/12/12 08:55:28 rillig Exp $
+# $NetBSD: cond-func-defined.mk,v 1.9 2022/05/08 06:51:27 rillig Exp $
#
# Tests for the defined() function in .if conditions.
@@ -48,5 +48,10 @@ ${:UA B}= variable name with spaces
. endif
.endfor
-all:
- @:;
+# Neither of the conditions is true. Before July 2020, the right-hand
+# condition was evaluated even though it was irrelevant.
+.if defined(UNDEF) && ${UNDEF:Mx} != ""
+. error
+.endif
+
+all: .PHONY
Index: src/usr.bin/make/unit-tests/varmod-match.mk
diff -u src/usr.bin/make/unit-tests/varmod-match.mk:1.8 src/usr.bin/make/unit-tests/varmod-match.mk:1.9
--- src/usr.bin/make/unit-tests/varmod-match.mk:1.8 Sun Mar 27 18:39:01 2022
+++ src/usr.bin/make/unit-tests/varmod-match.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-match.mk,v 1.8 2022/03/27 18:39:01 rillig Exp $
+# $NetBSD: varmod-match.mk,v 1.9 2022/05/08 06:51:27 rillig Exp $
#
# Tests for the :M variable modifier, which filters words that match the
# given pattern.
@@ -184,3 +184,19 @@ ${:U*}= asterisk
.if ${ plain string :L:M*} != "plain string"
. error
.endif
+
+
+# The pattern can come from a variable expression. For single-letter
+# variables, either the short form or the long form can be used, just as
+# everywhere else.
+PRIMES= 2 3 5 7 11
+n= 2
+.if ${PRIMES:M$n} != "2"
+. error
+.endif
+.if ${PRIMES:M${n}} != "2"
+. error
+.endif
+.if ${PRIMES:M${:U2}} != "2"
+. error
+.endif
Index: src/usr.bin/make/unit-tests/cond-token-string.exp
diff -u src/usr.bin/make/unit-tests/cond-token-string.exp:1.7 src/usr.bin/make/unit-tests/cond-token-string.exp:1.8
--- src/usr.bin/make/unit-tests/cond-token-string.exp:1.7 Sat Jan 8 20:21:34 2022
+++ src/usr.bin/make/unit-tests/cond-token-string.exp Sun May 8 06:51:27 2022
@@ -13,6 +13,10 @@ CondParser_Eval: "${:Uvalue}"
make: "cond-token-string.mk" line 68: A nonempty variable expression evaluates to true.
CondParser_Eval: "${:U}"
make: "cond-token-string.mk" line 76: An empty variable evaluates to false.
+CondParser_Eval: ("${VALUE}")
+make: "cond-token-string.mk" line 84: Missing argument for ".error"
+CondParser_Eval: "quoted" == quoted
+Comparing "quoted" == "quoted"
make: Fatal errors encountered -- cannot continue
make: stopped in unit-tests
exit status 1
Index: src/usr.bin/make/unit-tests/directive-for-lines.mk
diff -u src/usr.bin/make/unit-tests/directive-for-lines.mk:1.3 src/usr.bin/make/unit-tests/directive-for-lines.mk:1.4
--- src/usr.bin/make/unit-tests/directive-for-lines.mk:1.3 Sat Dec 19 12:40:00 2020
+++ src/usr.bin/make/unit-tests/directive-for-lines.mk Sun May 8 06:51:27 2022
@@ -1,9 +1,9 @@
-# $NetBSD: directive-for-lines.mk,v 1.3 2020/12/19 12:40:00 rillig Exp $
+# $NetBSD: directive-for-lines.mk,v 1.4 2022/05/08 06:51:27 rillig Exp $
#
# Tests for the line numbers that are reported in .for loops.
#
-# Between 2007-01-01 (git 4d3c468f96e1080e, parse.c 1.127) and 2020-12-19
-# (parse.c 1.494), the line numbers for the .info directives and error
+# Since parse.c 1.127 from 2007-01-01 and before parse.c 1.494 from
+# 2020-12-19, the line numbers for the .info directives and error
# messages inside .for loops had been wrong since ParseGetLine skipped empty
# lines, even when collecting the lines for the .for loop body.
Index: src/usr.bin/make/unit-tests/directive-for-null.mk
diff -u src/usr.bin/make/unit-tests/directive-for-null.mk:1.1 src/usr.bin/make/unit-tests/directive-for-null.mk:1.2
--- src/usr.bin/make/unit-tests/directive-for-null.mk:1.1 Sat Dec 19 16:00:17 2020
+++ src/usr.bin/make/unit-tests/directive-for-null.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: directive-for-null.mk,v 1.1 2020/12/19 16:00:17 rillig Exp $
+# $NetBSD: directive-for-null.mk,v 1.2 2022/05/08 06:51:27 rillig Exp $
#
# Test for parsing a .for loop that accidentally contains a null byte.
#
@@ -9,7 +9,7 @@
# make: "(stdin)" line 3: Zero byte read from file
#
# The one about "end of file" might be misleading but is due to the
-# implementation. On both errors and EOF, ParseGetLine returns NULL.
+# implementation. On both errors and EOF, ParseRawLine returns NULL.
#
# The one about the "zero byte" in line 3 is surprising since the only
# line that contains a null byte is line 2.
Index: src/usr.bin/make/unit-tests/directive-info.mk
diff -u src/usr.bin/make/unit-tests/directive-info.mk:1.9 src/usr.bin/make/unit-tests/directive-info.mk:1.10
--- src/usr.bin/make/unit-tests/directive-info.mk:1.9 Sat Jan 8 20:21:34 2022
+++ src/usr.bin/make/unit-tests/directive-info.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: directive-info.mk,v 1.9 2022/01/08 20:21:34 rillig Exp $
+# $NetBSD: directive-info.mk,v 1.10 2022/05/08 06:51:27 rillig Exp $
#
# Tests for the .info directive.
#
@@ -18,7 +18,7 @@
.info.man: # not a message, but possibly a suffix rule
# Even if lines would have trailing whitespace, this would be trimmed by
-# ParseGetLine.
+# ParseRawLine.
.info
.info # comment
Index: src/usr.bin/make/unit-tests/opt-jobs-no-action.mk
diff -u src/usr.bin/make/unit-tests/opt-jobs-no-action.mk:1.9 src/usr.bin/make/unit-tests/opt-jobs-no-action.mk:1.10
--- src/usr.bin/make/unit-tests/opt-jobs-no-action.mk:1.9 Sun Apr 4 09:58:51 2021
+++ src/usr.bin/make/unit-tests/opt-jobs-no-action.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: opt-jobs-no-action.mk,v 1.9 2021/04/04 09:58:51 rillig Exp $
+# $NetBSD: opt-jobs-no-action.mk,v 1.10 2022/05/08 06:51:27 rillig Exp $
#
# Tests for the combination of the options -j and -n, which prints the
# commands instead of actually running them.
@@ -21,7 +21,7 @@
# The shell attributes are handled by Job_ParseShell.
# The shell attributes 'quiet' and 'echo' don't need a trailing newline,
# this is handled by the [0] != '\0' checks in Job_ParseShell.
-# The '\#' is handled by ParseGetLine.
+# The '\#' is handled by ParseRawLine.
# The '\n' is handled by Str_Words in Job_ParseShell.
# The '$$' is handled by Var_Subst in ParseDependencyLine.
.SHELL: \
Index: src/usr.bin/make/unit-tests/varmod-ifelse.mk
diff -u src/usr.bin/make/unit-tests/varmod-ifelse.mk:1.18 src/usr.bin/make/unit-tests/varmod-ifelse.mk:1.19
--- src/usr.bin/make/unit-tests/varmod-ifelse.mk:1.18 Sat Jan 15 20:16:55 2022
+++ src/usr.bin/make/unit-tests/varmod-ifelse.mk Sun May 8 06:51:27 2022
@@ -1,4 +1,4 @@
-# $NetBSD: varmod-ifelse.mk,v 1.18 2022/01/15 20:16:55 rillig Exp $
+# $NetBSD: varmod-ifelse.mk,v 1.19 2022/05/08 06:51:27 rillig Exp $
#
# Tests for the ${cond:?then:else} variable modifier, which evaluates either
# the then-expression or the else-expression, depending on the condition.
@@ -133,7 +133,7 @@ VAR= value
# When parsing such an expression, the parser used to be strict. It first
# evaluated the left-hand side of the operator '&&' and then started parsing
# the right-hand side 'no >= 10'. The word 'no' is obviously a string
-# literal, not enclosed in quotes, which is ok, even on the left-hand side of
+# literal, not enclosed in quotes, which is OK, even on the left-hand side of
# the comparison operator, but only because this is a condition in the
# modifier ':?'. In an ordinary directive '.if', this would be a parse error.
# For strings, only the comparison operators '==' and '!=' are defined,
@@ -169,3 +169,16 @@ EMPTY= # empty
.info ${${ASTERISK} :?true:false}
# syntax error since the condition is completely blank.
.info ${${EMPTY} :?true:false}
+
+
+# Since the condition of the '?:' modifier is expanded before being parsed and
+# evaluated, it is common practice to enclose expressions in quotes, to avoid
+# producing syntactically invalid conditions such as ' == value'. This only
+# works if the expanded values neither contain quotes nor backslashes. For
+# strings containing quotes or backslashes, the '?:' modifier should not be
+# used.
+PRIMES= 2 3 5 7 11
+.if ${1 2 3 4 5:L:@n@$n:${ ("${PRIMES:M$n}" != "") :?prime:not_prime}@} != \
+ "1:not_prime 2:prime 3:prime 4:not_prime 5:prime"
+. error
+.endif