Module Name: src Committed By: rillig Date: Sun Jan 23 21:48:59 UTC 2022
Modified Files: src/usr.bin/make/unit-tests: deptgt-main.exp deptgt-main.mk directive-dinclude.exp directive-dinclude.mk directive-hyphen-include.exp directive-hyphen-include.mk directive-if.exp directive-if.mk directive-ifdef.exp directive-ifdef.mk directive-sinclude.mk varmod-to-separator.mk varname-dot-make-pid.mk varname-dot-make-ppid.mk Log Message: tests/make: add a few more tests To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/usr.bin/make/unit-tests/deptgt-main.exp \ src/usr.bin/make/unit-tests/directive-dinclude.exp \ src/usr.bin/make/unit-tests/directive-dinclude.mk \ src/usr.bin/make/unit-tests/directive-hyphen-include.exp \ src/usr.bin/make/unit-tests/directive-hyphen-include.mk cvs rdiff -u -r1.3 -r1.4 src/usr.bin/make/unit-tests/deptgt-main.mk \ src/usr.bin/make/unit-tests/directive-ifdef.exp \ src/usr.bin/make/unit-tests/directive-sinclude.mk cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/directive-if.exp \ src/usr.bin/make/unit-tests/varmod-to-separator.mk cvs rdiff -u -r1.10 -r1.11 src/usr.bin/make/unit-tests/directive-if.mk cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/directive-ifdef.mk cvs rdiff -u -r1.2 -r1.3 src/usr.bin/make/unit-tests/varname-dot-make-pid.mk \ src/usr.bin/make/unit-tests/varname-dot-make-ppid.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/deptgt-main.exp diff -u src/usr.bin/make/unit-tests/deptgt-main.exp:1.1 src/usr.bin/make/unit-tests/deptgt-main.exp:1.2 --- src/usr.bin/make/unit-tests/deptgt-main.exp:1.1 Sun Aug 16 12:07:51 2020 +++ src/usr.bin/make/unit-tests/deptgt-main.exp Sun Jan 23 21:48:59 2022 @@ -1 +1,2 @@ +This target real-main is the one that is made. exit status 0 Index: src/usr.bin/make/unit-tests/directive-dinclude.exp diff -u src/usr.bin/make/unit-tests/directive-dinclude.exp:1.1 src/usr.bin/make/unit-tests/directive-dinclude.exp:1.2 --- src/usr.bin/make/unit-tests/directive-dinclude.exp:1.1 Sun Sep 13 09:20:23 2020 +++ src/usr.bin/make/unit-tests/directive-dinclude.exp Sun Jan 23 21:48:59 2022 @@ -1 +1,4 @@ -exit status 0 +make: "directive-dinclude-error.inc" line 1: Invalid line type +make: Fatal errors encountered -- cannot continue +make: stopped in unit-tests +exit status 1 Index: src/usr.bin/make/unit-tests/directive-dinclude.mk diff -u src/usr.bin/make/unit-tests/directive-dinclude.mk:1.1 src/usr.bin/make/unit-tests/directive-dinclude.mk:1.2 --- src/usr.bin/make/unit-tests/directive-dinclude.mk:1.1 Sun Sep 13 09:20:23 2020 +++ src/usr.bin/make/unit-tests/directive-dinclude.mk Sun Jan 23 21:48:59 2022 @@ -1,9 +1,24 @@ -# $NetBSD: directive-dinclude.mk,v 1.1 2020/09/13 09:20:23 rillig Exp $ +# $NetBSD: directive-dinclude.mk,v 1.2 2022/01/23 21:48:59 rillig Exp $ # # Tests for the .dinclude directive, which includes another file, -# typically named .depend. +# silently skipping it if it cannot be opened. This is primarily used for +# including '.depend' files, that's where the 'd' comes from. +# +# The 'silently skipping' only applies to the case where the file cannot be +# opened. Parse errors and other errors are handled the same way as in the +# other .include directives. + +# No complaint that there is no such file. +.dinclude "${.CURDIR}/directive-dinclude-nonexistent.inc" + +# No complaint either, even though the operating system error is ENOTDIR, not +# ENOENT. +.dinclude "${MAKEFILE}/subdir" -# TODO: Implementation +# Errors that are not related to opening the file are still reported. +# expect: make: "directive-dinclude-error.inc" line 1: Invalid line type +_!= echo 'syntax error' > directive-dinclude-error.inc +.dinclude "${.CURDIR}/directive-dinclude-error.inc" +_!= rm directive-dinclude-error.inc -all: - @:; +all: .PHONY Index: src/usr.bin/make/unit-tests/directive-hyphen-include.exp diff -u src/usr.bin/make/unit-tests/directive-hyphen-include.exp:1.1 src/usr.bin/make/unit-tests/directive-hyphen-include.exp:1.2 --- src/usr.bin/make/unit-tests/directive-hyphen-include.exp:1.1 Sun Sep 13 09:20:23 2020 +++ src/usr.bin/make/unit-tests/directive-hyphen-include.exp Sun Jan 23 21:48:59 2022 @@ -1 +1,4 @@ -exit status 0 +make: "directive-hyphen-include-error.inc" line 1: Invalid line type +make: Fatal errors encountered -- cannot continue +make: stopped in unit-tests +exit status 1 Index: src/usr.bin/make/unit-tests/directive-hyphen-include.mk diff -u src/usr.bin/make/unit-tests/directive-hyphen-include.mk:1.1 src/usr.bin/make/unit-tests/directive-hyphen-include.mk:1.2 --- src/usr.bin/make/unit-tests/directive-hyphen-include.mk:1.1 Sun Sep 13 09:20:23 2020 +++ src/usr.bin/make/unit-tests/directive-hyphen-include.mk Sun Jan 23 21:48:59 2022 @@ -1,9 +1,23 @@ -# $NetBSD: directive-hyphen-include.mk,v 1.1 2020/09/13 09:20:23 rillig Exp $ +# $NetBSD: directive-hyphen-include.mk,v 1.2 2022/01/23 21:48:59 rillig Exp $ # # Tests for the .-include directive, which includes another file, # silently skipping it if it cannot be opened. +# +# The 'silently skipping' only applies to the case where the file cannot be +# opened. Parse errors and other errors are handled the same way as in the +# other .include directives. + +# No complaint that there is no such file. +.-include "${.CURDIR}/directive-hyphen-include-nonexistent.inc" + +# No complaint either, even though the operating system error is ENOTDIR, not +# ENOENT. +.-include "${MAKEFILE}/subdir" -# TODO: Implementation +# Errors that are not related to opening the file are still reported. +# expect: make: "directive-hyphen-include-error.inc" line 1: Invalid line type +_!= echo 'syntax error' > directive-hyphen-include-error.inc +.-include "${.CURDIR}/directive-hyphen-include-error.inc" +_!= rm directive-hyphen-include-error.inc -all: - @:; +all: .PHONY Index: src/usr.bin/make/unit-tests/deptgt-main.mk diff -u src/usr.bin/make/unit-tests/deptgt-main.mk:1.3 src/usr.bin/make/unit-tests/deptgt-main.mk:1.4 --- src/usr.bin/make/unit-tests/deptgt-main.mk:1.3 Sun Nov 15 20:20:58 2020 +++ src/usr.bin/make/unit-tests/deptgt-main.mk Sun Jan 23 21:48:59 2022 @@ -1,10 +1,29 @@ -# $NetBSD: deptgt-main.mk,v 1.3 2020/11/15 20:20:58 rillig Exp $ +# $NetBSD: deptgt-main.mk,v 1.4 2022/01/23 21:48:59 rillig Exp $ # # Tests for the special target .MAIN in dependency declarations, which defines # the main target. This main target is built if no target has been specified # on the command line or via MAKEFLAGS. -# TODO: Implementation +# The first target becomes the main target by default. It can be overridden +# though. +all: .PHONY + @echo 'This target is not made.' -all: - @:; +# This target is not the first to be defined, but it lists '.MAIN' as one of +# its sources. The word '.MAIN' only has a special meaning when it appears as +# a _target_ in a dependency declaration, not as a _source_. It is thus +# ignored. +depsrc-main: .PHONY .MAIN + @echo 'This target is not made either.' + +# This target is the first to be marked with '.MAIN', so it replaces the +# previous main target, which was 'all'. +.MAIN: real-main +real-main: .PHONY + @echo 'This target ${.TARGET} is the one that is made.' + +# This target is marked with '.MAIN' but there already is a main target. The +# attribute '.MAIN' is thus ignored. +.MAIN: too-late +too-late: .PHONY + @echo 'This target comes too late, there is already a .MAIN target.' Index: src/usr.bin/make/unit-tests/directive-ifdef.exp diff -u src/usr.bin/make/unit-tests/directive-ifdef.exp:1.3 src/usr.bin/make/unit-tests/directive-ifdef.exp:1.4 --- src/usr.bin/make/unit-tests/directive-ifdef.exp:1.3 Thu Jan 21 23:03:41 2021 +++ src/usr.bin/make/unit-tests/directive-ifdef.exp Sun Jan 23 21:48:59 2022 @@ -1,4 +1 @@ -make: "directive-ifdef.mk" line 12: Function calls in .ifdef are possible. -make: "directive-ifdef.mk" line 23: String literals are tested for emptiness. -make: "directive-ifdef.mk" line 27: String literals are tested for emptiness. Whitespace is non-empty. exit status 0 Index: src/usr.bin/make/unit-tests/directive-sinclude.mk diff -u src/usr.bin/make/unit-tests/directive-sinclude.mk:1.3 src/usr.bin/make/unit-tests/directive-sinclude.mk:1.4 --- src/usr.bin/make/unit-tests/directive-sinclude.mk:1.3 Sun Jan 23 16:09:38 2022 +++ src/usr.bin/make/unit-tests/directive-sinclude.mk Sun Jan 23 21:48:59 2022 @@ -1,4 +1,4 @@ -# $NetBSD: directive-sinclude.mk,v 1.3 2022/01/23 16:09:38 rillig Exp $ +# $NetBSD: directive-sinclude.mk,v 1.4 2022/01/23 21:48:59 rillig Exp $ # # Tests for the .sinclude directive, which includes another file, # silently skipping it if it cannot be opened. @@ -20,4 +20,4 @@ _!= echo 'syntax error' > directive-incl .sinclude "${.CURDIR}/directive-include-error.inc" _!= rm directive-include-error.inc -all: +all: .PHONY Index: src/usr.bin/make/unit-tests/directive-if.exp diff -u src/usr.bin/make/unit-tests/directive-if.exp:1.9 src/usr.bin/make/unit-tests/directive-if.exp:1.10 --- src/usr.bin/make/unit-tests/directive-if.exp:1.9 Sun Jan 9 20:21:44 2022 +++ src/usr.bin/make/unit-tests/directive-if.exp Sun Jan 23 21:48:59 2022 @@ -1,18 +1,18 @@ make: "directive-if.mk" line 13: 0 evaluates to false. make: "directive-if.mk" line 17: 1 evaluates to true. -make: "directive-if.mk" line 40: Unknown directive "ifx" -make: "directive-if.mk" line 41: This is not conditional. -make: "directive-if.mk" line 42: if-less else +make: "directive-if.mk" line 41: Unknown directive "ifx" make: "directive-if.mk" line 43: This is not conditional. -make: "directive-if.mk" line 44: if-less endif -make: "directive-if.mk" line 47: Malformed conditional () -make: "directive-if.mk" line 57: Quotes in plain words are probably a mistake. -make: "directive-if.mk" line 66: Don't do this, always put a space after a directive. -make: "directive-if.mk" line 70: Don't do this, always put a space after a directive. -make: "directive-if.mk" line 76: Don't do this, always put a space around comparison operators. -make: "directive-if.mk" line 82: Don't do this, always put a space after a directive. -make: "directive-if.mk" line 86: Don't do this, always put a space after a directive. -make: "directive-if.mk" line 94: Unknown directive "ifn" +make: "directive-if.mk" line 45: if-less else +make: "directive-if.mk" line 47: This is not conditional. +make: "directive-if.mk" line 49: if-less endif +make: "directive-if.mk" line 53: Malformed conditional () +make: "directive-if.mk" line 63: Quotes in plain words are probably a mistake. +make: "directive-if.mk" line 72: Don't do this, always put a space after a directive. +make: "directive-if.mk" line 76: Don't do this, always put a space after a directive. +make: "directive-if.mk" line 82: Don't do this, always put a space around comparison operators. +make: "directive-if.mk" line 88: Don't do this, always put a space after a directive. +make: "directive-if.mk" line 92: Don't do this, always put a space after a directive. +make: "directive-if.mk" line 100: Unknown directive "ifn" make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/varmod-to-separator.mk diff -u src/usr.bin/make/unit-tests/varmod-to-separator.mk:1.9 src/usr.bin/make/unit-tests/varmod-to-separator.mk:1.10 --- src/usr.bin/make/unit-tests/varmod-to-separator.mk:1.9 Sun Jan 23 18:59:18 2022 +++ src/usr.bin/make/unit-tests/varmod-to-separator.mk Sun Jan 23 21:48:59 2022 @@ -1,4 +1,4 @@ -# $NetBSD: varmod-to-separator.mk,v 1.9 2022/01/23 18:59:18 rillig Exp $ +# $NetBSD: varmod-to-separator.mk,v 1.10 2022/01/23 21:48:59 rillig Exp $ # # Tests for the :ts variable modifier, which joins the words of the variable # using an arbitrary character as word separator. @@ -201,7 +201,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: Bad modifier ":tx" for variable "WORDS" +# expect: make: Bad modifier ":tx" for variable "WORDS" .if ${WORDS:tx} . error .else @@ -209,7 +209,7 @@ WORDS= one two three four five six .endif # The word separator must be can only be a single character. -# expect: Bad modifier ":ts\X" for variable "WORDS" +# expect: make: Bad modifier ":ts\X" for variable "WORDS" .if ${WORDS:ts\X} . error .else Index: src/usr.bin/make/unit-tests/directive-if.mk diff -u src/usr.bin/make/unit-tests/directive-if.mk:1.10 src/usr.bin/make/unit-tests/directive-if.mk:1.11 --- src/usr.bin/make/unit-tests/directive-if.mk:1.10 Sun Jan 9 20:21:44 2022 +++ src/usr.bin/make/unit-tests/directive-if.mk Sun Jan 23 21:48:59 2022 @@ -1,4 +1,4 @@ -# $NetBSD: directive-if.mk,v 1.10 2022/01/09 20:21:44 rillig Exp $ +# $NetBSD: directive-if.mk,v 1.11 2022/01/23 21:48:59 rillig Exp $ # # Tests for the .if directive. # @@ -37,13 +37,19 @@ # longer interpreted as a variant of '.if', therefore the '.error' and '.else' # are interpreted as ordinary directives, producing the error messages # "if-less else" and "if-less endif". +# expect+1: Unknown directive "ifx" .ifx 123 +# expect+1: This is not conditional. .info This is not conditional. +# expect+1: if-less else .else +# expect+1: This is not conditional. .info This is not conditional. +# expect+1: if-less endif .endif # Missing condition. +# expect+1: Malformed conditional () .if . error .else Index: src/usr.bin/make/unit-tests/directive-ifdef.mk diff -u src/usr.bin/make/unit-tests/directive-ifdef.mk:1.4 src/usr.bin/make/unit-tests/directive-ifdef.mk:1.5 --- src/usr.bin/make/unit-tests/directive-ifdef.mk:1.4 Thu Jan 21 23:03:41 2021 +++ src/usr.bin/make/unit-tests/directive-ifdef.mk Sun Jan 23 21:48:59 2022 @@ -1,33 +1,51 @@ -# $NetBSD: directive-ifdef.mk,v 1.4 2021/01/21 23:03:41 rillig Exp $ +# $NetBSD: directive-ifdef.mk,v 1.5 2022/01/23 21:48:59 rillig Exp $ # -# Tests for the .ifdef directive. - -# TODO: Implementation +# Tests for the .ifdef directive, which evaluates bare words by calling +# 'defined(word)'. DEFINED= defined +# There is no variable named 'UNDEF', therefore the condition evaluates to +# false. +.ifdef UNDEF +. error +.endif + +# There is a variable named 'DEFINED', so the condition evaluates to true. +.ifdef DEFINED +.else +. error +.endif + +# Since a bare word is an abbreviation for 'defined(word)', these can be +# used to construct complex conditions. +.ifdef UNDEF && DEFINED +. error +.endif +.ifdef UNDEF || DEFINED +.else +. error +.endif + # It looks redundant to have a call to defined() in an .ifdef, but it's -# possible. The .ifdef only affects plain symbols, not function calls. +# possible. The '.ifdef' only affects bare words, not function calls. .ifdef defined(DEFINED) -. info Function calls in .ifdef are possible. .else . error .endif -# String literals are handled the same in all variants of the .if directive. -# They evaluate to true if they are not empty. Whitespace counts as non-empty -# as well. +# String literals are handled the same in all variants of the '.if' directive, +# they evaluate to true if they are not empty, therefore this particular +# example looks confusing and is thus not found in practice. .ifdef "" . error .else -. info String literals are tested for emptiness. .endif +# Whitespace counts as non-empty as well. .ifdef " " -. info String literals are tested for emptiness. Whitespace is non-empty. .else . error .endif -all: - @:; +all: .PHONY Index: src/usr.bin/make/unit-tests/varname-dot-make-pid.mk diff -u src/usr.bin/make/unit-tests/varname-dot-make-pid.mk:1.2 src/usr.bin/make/unit-tests/varname-dot-make-pid.mk:1.3 --- src/usr.bin/make/unit-tests/varname-dot-make-pid.mk:1.2 Sun Aug 16 14:25:16 2020 +++ src/usr.bin/make/unit-tests/varname-dot-make-pid.mk Sun Jan 23 21:48:59 2022 @@ -1,8 +1,16 @@ -# $NetBSD: varname-dot-make-pid.mk,v 1.2 2020/08/16 14:25:16 rillig Exp $ +# $NetBSD: varname-dot-make-pid.mk,v 1.3 2022/01/23 21:48:59 rillig Exp $ # -# Tests for the special .MAKE.PID variable. +# Tests for the special .MAKE.PID variable, which contains the process ID of +# the make process itself. -# TODO: Implementation +# The process ID must be a positive integer. +.if ${.MAKE.PID:C,[0-9],,g} != "" +. error +.elif !(${.MAKE.PID} > 0) +. error +.endif -all: - @:; +# Ensure that the process exists. +_!= kill -0 ${.MAKE.PID} + +all: .PHONY Index: src/usr.bin/make/unit-tests/varname-dot-make-ppid.mk diff -u src/usr.bin/make/unit-tests/varname-dot-make-ppid.mk:1.2 src/usr.bin/make/unit-tests/varname-dot-make-ppid.mk:1.3 --- src/usr.bin/make/unit-tests/varname-dot-make-ppid.mk:1.2 Sun Aug 16 14:25:16 2020 +++ src/usr.bin/make/unit-tests/varname-dot-make-ppid.mk Sun Jan 23 21:48:59 2022 @@ -1,8 +1,23 @@ -# $NetBSD: varname-dot-make-ppid.mk,v 1.2 2020/08/16 14:25:16 rillig Exp $ +# $NetBSD: varname-dot-make-ppid.mk,v 1.3 2022/01/23 21:48:59 rillig Exp $ # -# Tests for the special .MAKE.PPID variable. +# Tests for the special .MAKE.PPID variable, which contains the process ID of +# make's parent process. -# TODO: Implementation +# The parent process ID must be a positive integer. +.if ${.MAKE.PPID:C,[0-9],,g} != "" +. error +.elif !(${.MAKE.PPID} > 0) +. error +.endif -all: - @:; +# Ensure that the process exists. +_!= kill -0 ${.MAKE.PPID} + +# The parent process ID must be different from the process ID. If they were +# the same, make would run as process 1, which is not a good idea because make +# is not prepared to clean up after other processes. +.if ${.MAKE.PPID} == ${.MAKE.PID} +. error +.endif + +all: .PHONY