aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/unit-tests/opt-query.mk
blob: 3554d69afad6681292663ae553b047ebc7658ec8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# $NetBSD: opt-query.mk,v 1.7 2022/08/18 05:37:05 rillig Exp $
#
# Tests for the -q command line option.
#
# The -q option only looks at the dependencies between the targets.
# None of the commands in the targets are run, not even those that are
# prefixed with '+'.

# This test consists of several parts:
#
#	main		Delegates to the actual tests.
#
#	commands	Ensures that none of the targets is made.
#
#	variants	Ensures that the up-to-date status is correctly
#			reported in both compat and jobs mode, and for several
#			kinds of make targets.
PART?=	main

.if ${PART} == "main"

all: .PHONY variants cleanup

_!=	touch -f opt-query-file.up-to-date

variants: .PHONY

.  for target in commands
	@echo 'Making ${target}':
	@${MAKE} -r -f ${MAKEFILE} -q ${mode:Mjobs:%=-j1} ${target} PART=commands \
	&& echo "${target}: query status $$?" \
	|| echo "${target}: query status $$?"
	@echo
.  endfor

.  for mode in compat jobs
.    for target in opt-query-file.out-of-date opt-query-file.up-to-date phony
	@echo 'Making ${target} in ${mode} mode':
	@${MAKE} -r -f ${MAKEFILE} -q ${mode:Mjobs:%=-j1} ${target} PART=variants \
	&& echo "${target} in ${mode} mode: query status $$?" \
	|| echo "${target} in ${mode} mode: query status $$?"
	@echo
.    endfor
.  endfor

# Between 1994 and before 2022-08-17, the exit status for '-q' was always 1,
# the cause for that exit code varied over time though.
#
# expect: opt-query-file.out-of-date in compat mode: query status 1
# expect: opt-query-file.up-to-date in compat mode: query status 0
# expect: phony in compat mode: query status 1
# expect: opt-query-file.out-of-date in jobs mode: query status 1
# expect: opt-query-file.up-to-date in jobs mode: query status 0
# expect: phony in jobs mode: query status 1

cleanup: .PHONY
	@rm -f opt-query-file.up-to-date

.elif ${PART} == "commands"

# This command cannot be prevented from being run since it is used at parse
# time, and any later variable assignments may depend on its result.
!=	echo 'command during parsing' 1>&2; echo

# None of these commands are run.
.BEGIN:
	@echo '$@: hidden command'
	@+echo '$@: run always'

# None of these commands are run.
commands:
	@echo '$@: hidden command'
	@+echo '$@: run always'
# The exit status 1 is because the "commands" target has to be made, that is,
# it is not up-to-date.

.elif ${PART} == "variants"

opt-query-file.out-of-date: ${MAKEFILE}
opt-query-file.up-to-date: ${MAKEFILE}
phony: .PHONY

.else
.  error Invalid part '${PART}'
.endif