1# $NetBSD: opt-query.mk,v 1.7 2022/08/18 05:37:05 rillig Exp $
2#
3# Tests for the -q command line option.
4#
5# The -q option only looks at the dependencies between the targets.
6# None of the commands in the targets are run, not even those that are
7# prefixed with '+'.
8
9# This test consists of several parts:
10#
11#         main                Delegates to the actual tests.
12#
13#         commands  Ensures that none of the targets is made.
14#
15#         variants  Ensures that the up-to-date status is correctly
16#                             reported in both compat and jobs mode, and for several
17#                             kinds of make targets.
18PART?=    main
19
20.if ${PART} == "main"
21
22all: .PHONY variants cleanup
23
24_!=       touch -f opt-query-file.up-to-date
25
26variants: .PHONY
27
28.  for target in commands
29          @echo 'Making ${target}':
30          @${MAKE} -r -f ${MAKEFILE} -q ${mode:Mjobs:%=-j1} ${target} PART=commands \
31          && echo "${target}: query status $$?" \
32          || echo "${target}: query status $$?"
33          @echo
34.  endfor
35
36.  for mode in compat jobs
37.    for target in opt-query-file.out-of-date opt-query-file.up-to-date phony
38          @echo 'Making ${target} in ${mode} mode':
39          @${MAKE} -r -f ${MAKEFILE} -q ${mode:Mjobs:%=-j1} ${target} PART=variants \
40          && echo "${target} in ${mode} mode: query status $$?" \
41          || echo "${target} in ${mode} mode: query status $$?"
42          @echo
43.    endfor
44.  endfor
45
46# Between 1994 and before 2022-08-17, the exit status for '-q' was always 1,
47# the cause for that exit code varied over time though.
48#
49# expect: opt-query-file.out-of-date in compat mode: query status 1
50# expect: opt-query-file.up-to-date in compat mode: query status 0
51# expect: phony in compat mode: query status 1
52# expect: opt-query-file.out-of-date in jobs mode: query status 1
53# expect: opt-query-file.up-to-date in jobs mode: query status 0
54# expect: phony in jobs mode: query status 1
55
56cleanup: .PHONY
57          @rm -f opt-query-file.up-to-date
58
59.elif ${PART} == "commands"
60
61# This command cannot be prevented from being run since it is used at parse
62# time, and any later variable assignments may depend on its result.
63!=        echo 'command during parsing' 1>&2; echo
64
65# None of these commands are run.
66.BEGIN:
67          @echo '$@: hidden command'
68          @+echo '$@: run always'
69
70# None of these commands are run.
71commands:
72          @echo '$@: hidden command'
73          @+echo '$@: run always'
74# The exit status 1 is because the "commands" target has to be made, that is,
75# it is not up-to-date.
76
77.elif ${PART} == "variants"
78
79opt-query-file.out-of-date: ${MAKEFILE}
80opt-query-file.up-to-date: ${MAKEFILE}
81phony: .PHONY
82
83.else
84.  error Invalid part '${PART}'
85.endif
86