aboutsummaryrefslogtreecommitdiff
path: root/contrib/bmake/unit-tests/sh-flags.mk
blob: a4e17ca883840012dba03a5452d4bd2f28703ad9 (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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# $NetBSD: sh-flags.mk,v 1.4 2020/12/12 12:19:18 rillig Exp $
#
# Tests for the effective RunFlags of a shell command (run/skip, echo/silent,
# error check, trace), which are controlled by 12 different switches.  These
# switches interact in various non-obvious ways.  To analyze the interactions,
# this test runs each possible combination of these switches, for now.
#
# As soon as an interaction of switches is identified as obvious and expected,
# this particular interaction may be removed from the test, to focus on the
# remaining ones.
#
# See also:
#	Compat_RunCommand
#	JobPrintSpecials

all: .PHONY

opt-ignerr.yes=		-i
opt-jobs.yes=		-j1
opt-loud.no=		-d0	# side effect: make stdout unbuffered
opt-loud.yes=		-dl	# side effect: make stdout unbuffered
opt-no-action.yes=	-n
opt-silent.yes=		-s
opt-xtrace.yes=		-dx
tgt-always.yes=		.MAKE
tgt-ignerr.yes=		.IGNORE
tgt-silent.yes=		.SILENT
cmd-always.yes=		+
cmd-ignerr.yes=		-
cmd-silent.yes=		@

letter.always.yes=	a
letter.ignerr.yes=	i
letter.jobs.yes=	j
letter.loud.yes=	l
letter.no-action.yes=	n
letter.silent.yes=	s
letter.xtrace.yes=	x

.if !defined(OPT_TARGET)
.for opt-ignerr in no yes
.for opt-jobs in no yes
.for opt-loud in no yes
.for opt-no-action in no yes
# Only 'no', not 'yes', since job->echo is based trivially on opts.silent.
.for opt-silent in no
# Only 'no', not 'yes', since that would add uncontrollable output from
# reading /etc/profile or similar files.
.for opt-xtrace in no

target=		opt-
target+=	${letter.ignerr.${opt-ignerr}:U_}
target+=	${letter.jobs.${opt-jobs}:U_}
target+=	${letter.loud.${opt-loud}:U_}
target+=	${letter.no-action.${opt-no-action}:U_}
target+=	${letter.silent.${opt-silent}:U_}
target+=	${letter.xtrace.${opt-xtrace}:U_}

.for target in ${target:ts}

MAKE_CMD.${target}=	${MAKE}
MAKE_CMD.${target}+=	${opt-ignerr.${opt-ignerr}}
MAKE_CMD.${target}+=	${opt-jobs.${opt-jobs}}
MAKE_CMD.${target}+=	${opt-loud.${opt-loud}}
MAKE_CMD.${target}+=	${opt-no-action.${opt-no-action}}
MAKE_CMD.${target}+=	${opt-silent.${opt-silent}}
MAKE_CMD.${target}+=	${opt-xtrace.${opt-xtrace}}
MAKE_CMD.${target}+=	-f ${MAKEFILE}
MAKE_CMD.${target}+=	OPT_TARGET=${target}
MAKE_CMD.${target}+=	${target}

all: ${target}
${target}: .PHONY
	@${MAKE_CMD.${target}:M*}

.endfor
.endfor
.endfor
.endfor
.endfor
.endfor
.endfor
.endif

SILENT.yes=	@
ALWAYS.yes=	+
IGNERR.yes=	-

.if defined(OPT_TARGET)
.for tgt-always in no yes
.for tgt-ignerr in no yes
.for tgt-silent in no yes
.for cmd-always in no yes
.for cmd-ignerr in no yes
.for cmd-silent in no yes

target=		${OPT_TARGET}-tgt-
target+=	${letter.always.${tgt-always}:U_}
target+=	${letter.ignerr.${tgt-ignerr}:U_}
target+=	${letter.silent.${tgt-silent}:U_}
target+=	-cmd-
target+=	${letter.always.${cmd-always}:U_}
target+=	${letter.ignerr.${cmd-ignerr}:U_}
target+=	${letter.silent.${cmd-silent}:U_}

.for target in ${target:ts}

${OPT_TARGET}: .WAIT ${target} .WAIT
.if ${tgt-always} == yes
${target}: .MAKE
.endif
.if ${tgt-ignerr} == yes
${target}: .IGNORE
.endif
.if ${tgt-silent} == yes
${target}: .SILENT
.endif

RUNFLAGS.${target}=	${SILENT.${cmd-silent}}${ALWAYS.${cmd-always}}${IGNERR.${cmd-ignerr}}
.if ${OPT_TARGET:M*i*} || ${tgt-ignerr} == yes || ${cmd-ignerr} == yes
CMD.${target}=		echo running; false
.else
CMD.${target}=		echo running
.endif

${target}: .PHONY
	@+echo hide-from-output
	@+echo hide-from-output ${target}
	${RUNFLAGS.${target}} ${CMD.${target}}
.endfor

.endfor
.endfor
.endfor
.endfor
.endfor
.endfor
.endif