1# $NetBSD: sh-flags.mk,v 1.4 2020/12/12 12:19:18 rillig Exp $
2#
3# Tests for the effective RunFlags of a shell command (run/skip, echo/silent,
4# error check, trace), which are controlled by 12 different switches.  These
5# switches interact in various non-obvious ways.  To analyze the interactions,
6# this test runs each possible combination of these switches, for now.
7#
8# As soon as an interaction of switches is identified as obvious and expected,
9# this particular interaction may be removed from the test, to focus on the
10# remaining ones.
11#
12# See also:
13#         Compat_RunCommand
14#         JobPrintSpecials
15
16all: .PHONY
17
18opt-ignerr.yes=               -i
19opt-jobs.yes=                 -j1
20opt-loud.no=                  -d0       # side effect: make stdout unbuffered
21opt-loud.yes=                 -dl       # side effect: make stdout unbuffered
22opt-no-action.yes=  -n
23opt-silent.yes=               -s
24opt-xtrace.yes=               -dx
25tgt-always.yes=               .MAKE
26tgt-ignerr.yes=               .IGNORE
27tgt-silent.yes=               .SILENT
28cmd-always.yes=               +
29cmd-ignerr.yes=               -
30cmd-silent.yes=               @
31
32letter.always.yes=  a
33letter.ignerr.yes=  i
34letter.jobs.yes=    j
35letter.loud.yes=    l
36letter.no-action.yes=         n
37letter.silent.yes=  s
38letter.xtrace.yes=  x
39
40.if !defined(OPT_TARGET)
41.for opt-ignerr in no yes
42.for opt-jobs in no yes
43.for opt-loud in no yes
44.for opt-no-action in no yes
45# Only 'no', not 'yes', since job->echo is based trivially on opts.silent.
46.for opt-silent in no
47# Only 'no', not 'yes', since that would add uncontrollable output from
48# reading /etc/profile or similar files.
49.for opt-xtrace in no
50
51target=             opt-
52target+=  ${letter.ignerr.${opt-ignerr}:U_}
53target+=  ${letter.jobs.${opt-jobs}:U_}
54target+=  ${letter.loud.${opt-loud}:U_}
55target+=  ${letter.no-action.${opt-no-action}:U_}
56target+=  ${letter.silent.${opt-silent}:U_}
57target+=  ${letter.xtrace.${opt-xtrace}:U_}
58
59.for target in ${target:ts}
60
61MAKE_CMD.${target}= ${MAKE}
62MAKE_CMD.${target}+=          ${opt-ignerr.${opt-ignerr}}
63MAKE_CMD.${target}+=          ${opt-jobs.${opt-jobs}}
64MAKE_CMD.${target}+=          ${opt-loud.${opt-loud}}
65MAKE_CMD.${target}+=          ${opt-no-action.${opt-no-action}}
66MAKE_CMD.${target}+=          ${opt-silent.${opt-silent}}
67MAKE_CMD.${target}+=          ${opt-xtrace.${opt-xtrace}}
68MAKE_CMD.${target}+=          -f ${MAKEFILE}
69MAKE_CMD.${target}+=          OPT_TARGET=${target}
70MAKE_CMD.${target}+=          ${target}
71
72all: ${target}
73${target}: .PHONY
74          @${MAKE_CMD.${target}:M*}
75
76.endfor
77.endfor
78.endfor
79.endfor
80.endfor
81.endfor
82.endfor
83.endif
84
85SILENT.yes=         @
86ALWAYS.yes=         +
87IGNERR.yes=         -
88
89.if defined(OPT_TARGET)
90.for tgt-always in no yes
91.for tgt-ignerr in no yes
92.for tgt-silent in no yes
93.for cmd-always in no yes
94.for cmd-ignerr in no yes
95.for cmd-silent in no yes
96
97target=             ${OPT_TARGET}-tgt-
98target+=  ${letter.always.${tgt-always}:U_}
99target+=  ${letter.ignerr.${tgt-ignerr}:U_}
100target+=  ${letter.silent.${tgt-silent}:U_}
101target+=  -cmd-
102target+=  ${letter.always.${cmd-always}:U_}
103target+=  ${letter.ignerr.${cmd-ignerr}:U_}
104target+=  ${letter.silent.${cmd-silent}:U_}
105
106.for target in ${target:ts}
107
108${OPT_TARGET}: .WAIT ${target} .WAIT
109.if ${tgt-always} == yes
110${target}: .MAKE
111.endif
112.if ${tgt-ignerr} == yes
113${target}: .IGNORE
114.endif
115.if ${tgt-silent} == yes
116${target}: .SILENT
117.endif
118
119RUNFLAGS.${target}= ${SILENT.${cmd-silent}}${ALWAYS.${cmd-always}}${IGNERR.${cmd-ignerr}}
120.if ${OPT_TARGET:M*i*} || ${tgt-ignerr} == yes || ${cmd-ignerr} == yes
121CMD.${target}=                echo running; false
122.else
123CMD.${target}=                echo running
124.endif
125
126${target}: .PHONY
127          @+echo hide-from-output
128          @+echo hide-from-output ${target}
129          ${RUNFLAGS.${target}} ${CMD.${target}}
130.endfor
131
132.endfor
133.endfor
134.endfor
135.endfor
136.endfor
137.endfor
138.endif
139