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