var-op-shell.mk revision 1.8 1 1.8 rillig # $NetBSD: var-op-shell.mk,v 1.8 2024/01/05 23:36:45 rillig Exp $
2 1.1 rillig #
3 1.2 rillig # Tests for the != variable assignment operator, which runs its right-hand
4 1.2 rillig # side through the shell.
5 1.1 rillig
6 1.3 rillig # The variable OUTPUT gets the output from running the shell command.
7 1.3 rillig OUTPUT!= echo "success"'ful'
8 1.3 rillig .if ${OUTPUT} != "successful"
9 1.3 rillig . error
10 1.3 rillig .endif
11 1.3 rillig
12 1.3 rillig # Since 2014-08-20, the output of the shell command may be empty.
13 1.3 rillig #
14 1.3 rillig # On 1996-05-29, when the '!=' assignment operator and Cmd_Exec were added,
15 1.3 rillig # an empty output produced the error message "Couldn't read shell's output
16 1.3 rillig # for \"%s\"".
17 1.3 rillig #
18 1.5 rillig # The error message is still in Cmd_Exec but reserved for technical errors.
19 1.3 rillig # It may be possible to trigger the error message by killing the shell after
20 1.3 rillig # reading part of its output.
21 1.3 rillig OUTPUT!= true
22 1.3 rillig .if ${OUTPUT} != ""
23 1.3 rillig . error
24 1.3 rillig .endif
25 1.3 rillig
26 1.3 rillig # The output of a shell command that failed is processed nevertheless.
27 1.5 rillig # Unlike the other places that run external commands (expression modifier
28 1.5 rillig # '::!=', expression modifier ':!...!'), a failed command generates only a
29 1.5 rillig # warning, not an "error". These "errors" are ignored in default mode, for
30 1.5 rillig # compatibility, but not in lint mode (-dL).
31 1.7 rillig # expect+1: warning: "echo "failed"; false" returned non-zero status
32 1.3 rillig OUTPUT!= echo "failed"; false
33 1.3 rillig .if ${OUTPUT} != "failed"
34 1.3 rillig . error
35 1.3 rillig .endif
36 1.3 rillig
37 1.3 rillig # A command with empty output may fail as well.
38 1.7 rillig # expect+1: warning: "false" returned non-zero status
39 1.3 rillig OUTPUT!= false
40 1.3 rillig .if ${OUTPUT} != ""
41 1.3 rillig . error
42 1.3 rillig .endif
43 1.3 rillig
44 1.3 rillig # In the output of the command, each newline is replaced with a space.
45 1.3 rillig # Except for the very last one, which is discarded.
46 1.3 rillig OUTPUT!= echo "line 1"; echo "line 2"
47 1.3 rillig .if ${OUTPUT} != "line 1 line 2"
48 1.3 rillig . error
49 1.3 rillig .endif
50 1.3 rillig
51 1.3 rillig # A failing command in the middle results in the exit status 0, which in the
52 1.3 rillig # end means that the whole sequence of commands succeeded.
53 1.3 rillig OUTPUT!= echo "before"; false; echo "after"
54 1.3 rillig .if ${OUTPUT} != "before after"
55 1.3 rillig . error
56 1.3 rillig .endif
57 1.3 rillig
58 1.4 sjg # This should result in a warning about "exited on a signal".
59 1.4 sjg # This used to be kill -14 (SIGALRM), but that stopped working on
60 1.4 sjg # Darwin18 after recent update.
61 1.7 rillig # expect+1: warning: "kill $$" exited on a signal
62 1.4 sjg OUTPUT!= kill $$$$
63 1.3 rillig .if ${OUTPUT} != ""
64 1.3 rillig . error
65 1.3 rillig .endif
66 1.3 rillig
67 1.3 rillig # A nonexistent command produces a non-zero exit status.
68 1.7 rillig # expect+1: warning: "/bin/no/such/command" returned non-zero status
69 1.3 rillig OUTPUT!= /bin/no/such/command
70 1.3 rillig .if ${OUTPUT} != ""
71 1.3 rillig . error
72 1.3 rillig .endif
73 1.3 rillig
74 1.3 rillig # The output from the shell's stderr is not captured, it just passes through.
75 1.3 rillig OUTPUT!= echo "stdout"; echo "stderr" 1>&2
76 1.3 rillig .if ${OUTPUT} != "stdout"
77 1.3 rillig . error
78 1.3 rillig .endif
79 1.3 rillig
80 1.3 rillig # The 8 dollar signs end up as 4 dollar signs when expanded. The shell sees
81 1.3 rillig # the command "echo '$$$$'". The 4 dollar signs are stored in OUTPUT, and
82 1.3 rillig # when that variable is expanded, they expand to 2 dollar signs.
83 1.3 rillig OUTPUT!= echo '$$$$$$$$'
84 1.3 rillig .if ${OUTPUT} != "\$\$"
85 1.3 rillig . error
86 1.3 rillig .endif
87 1.1 rillig
88 1.6 rillig
89 1.6 rillig # As a debugging aid, log the exact command that is run via the shell.
90 1.6 rillig .MAKEFLAGS: -dv
91 1.6 rillig OUTPUT!= echo '$$$$$$$$'
92 1.6 rillig .MAKEFLAGS: -d0
93 1.6 rillig
94 1.8 rillig
95 1.8 rillig # Since main.c 1.607 from 2024-01-05, long shell commands are not run directly
96 1.8 rillig # via '$shell -c $command', they are first written to a temporary file that is
97 1.8 rillig # then fed to the shell via '$shell $tmpfile'.
98 1.8 rillig OUTPUT_SHORT!= echo "$$0"
99 1.8 rillig OUTPUT_LONG!= echo "$$0" || : ${:U:range=1000}
100 1.8 rillig # When running '$shell -c $command', '$0' in the shell evaluates to the name
101 1.8 rillig # of the shell.
102 1.8 rillig .if ${OUTPUT_SHORT} != ${.SHELL:T}
103 1.8 rillig . error
104 1.8 rillig .endif
105 1.8 rillig # When running '$shell $tmpfile', '$0' in the shell evaluates to the name of
106 1.8 rillig # the temporary file.
107 1.8 rillig .if !${OUTPUT_LONG:M*/make*}
108 1.8 rillig . error
109 1.8 rillig .endif
110 1.8 rillig
111 1.8 rillig
112 1.1 rillig all:
113