xref: /freebsd/contrib/bmake/unit-tests/var-op-shell.mk (revision e2eeea75eb8b6dd50c1298067a0655880d186734)
1*e2eeea75SSimon J. Gerraty# $NetBSD: var-op-shell.mk,v 1.3 2020/11/09 20:39:46 rillig Exp $
22c3632d1SSimon J. Gerraty#
32c3632d1SSimon J. Gerraty# Tests for the != variable assignment operator, which runs its right-hand
42c3632d1SSimon J. Gerraty# side through the shell.
52c3632d1SSimon J. Gerraty
6*e2eeea75SSimon J. Gerraty# The variable OUTPUT gets the output from running the shell command.
7*e2eeea75SSimon J. GerratyOUTPUT!=	echo "success"'ful'
8*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "successful"
9*e2eeea75SSimon J. Gerraty.  error
10*e2eeea75SSimon J. Gerraty.endif
11*e2eeea75SSimon J. Gerraty
12*e2eeea75SSimon J. Gerraty# Since 2014-08-20, the output of the shell command may be empty.
13*e2eeea75SSimon J. Gerraty#
14*e2eeea75SSimon J. Gerraty# On 1996-05-29, when the '!=' assignment operator and Cmd_Exec were added,
15*e2eeea75SSimon J. Gerraty# an empty output produced the error message "Couldn't read shell's output
16*e2eeea75SSimon J. Gerraty# for \"%s\"".
17*e2eeea75SSimon J. Gerraty#
18*e2eeea75SSimon J. Gerraty# The error message is still there but reserved for technical errors.
19*e2eeea75SSimon J. Gerraty# It may be possible to trigger the error message by killing the shell after
20*e2eeea75SSimon J. Gerraty# reading part of its output.
21*e2eeea75SSimon J. GerratyOUTPUT!=	true
22*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != ""
23*e2eeea75SSimon J. Gerraty.  error
24*e2eeea75SSimon J. Gerraty.endif
25*e2eeea75SSimon J. Gerraty
26*e2eeea75SSimon J. Gerraty# The output of a shell command that failed is processed nevertheless.
27*e2eeea75SSimon J. Gerraty# TODO: Make this an error in lint mode.
28*e2eeea75SSimon J. GerratyOUTPUT!=	echo "failed"; false
29*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "failed"
30*e2eeea75SSimon J. Gerraty.  error
31*e2eeea75SSimon J. Gerraty.endif
32*e2eeea75SSimon J. Gerraty
33*e2eeea75SSimon J. Gerraty# A command with empty output may fail as well.
34*e2eeea75SSimon J. GerratyOUTPUT!=	false
35*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != ""
36*e2eeea75SSimon J. Gerraty.  error
37*e2eeea75SSimon J. Gerraty.endif
38*e2eeea75SSimon J. Gerraty
39*e2eeea75SSimon J. Gerraty# In the output of the command, each newline is replaced with a space.
40*e2eeea75SSimon J. Gerraty# Except for the very last one, which is discarded.
41*e2eeea75SSimon J. GerratyOUTPUT!=	echo "line 1"; echo "line 2"
42*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "line 1 line 2"
43*e2eeea75SSimon J. Gerraty.  error
44*e2eeea75SSimon J. Gerraty.endif
45*e2eeea75SSimon J. Gerraty
46*e2eeea75SSimon J. Gerraty# A failing command in the middle results in the exit status 0, which in the
47*e2eeea75SSimon J. Gerraty# end means that the whole sequence of commands succeeded.
48*e2eeea75SSimon J. GerratyOUTPUT!=	echo "before"; false; echo "after"
49*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "before after"
50*e2eeea75SSimon J. Gerraty.  error
51*e2eeea75SSimon J. Gerraty.endif
52*e2eeea75SSimon J. Gerraty
53*e2eeea75SSimon J. Gerraty# NB: The signal number must be numeric since some shells (which ones?) don't
54*e2eeea75SSimon J. Gerraty# accept symbolic signal names.  14 is typically SIGALRM.
55*e2eeea75SSimon J. Gerraty#
56*e2eeea75SSimon J. Gerraty# XXX: The number of the signal is not mentioned in the warning since that
57*e2eeea75SSimon J. Gerraty# would have been difficult to implement; currently the errfmt is a format
58*e2eeea75SSimon J. Gerraty# string containing a single %s conversion.
59*e2eeea75SSimon J. GerratyOUTPUT!=	kill -14 $$$$
60*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != ""
61*e2eeea75SSimon J. Gerraty.  error
62*e2eeea75SSimon J. Gerraty.endif
63*e2eeea75SSimon J. Gerraty
64*e2eeea75SSimon J. Gerraty# A nonexistent command produces a non-zero exit status.
65*e2eeea75SSimon J. GerratyOUTPUT!=	/bin/no/such/command
66*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != ""
67*e2eeea75SSimon J. Gerraty.  error
68*e2eeea75SSimon J. Gerraty.endif
69*e2eeea75SSimon J. Gerraty
70*e2eeea75SSimon J. Gerraty# The output from the shell's stderr is not captured, it just passes through.
71*e2eeea75SSimon J. GerratyOUTPUT!=	echo "stdout"; echo "stderr" 1>&2
72*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "stdout"
73*e2eeea75SSimon J. Gerraty.  error
74*e2eeea75SSimon J. Gerraty.endif
75*e2eeea75SSimon J. Gerraty
76*e2eeea75SSimon J. Gerraty# The 8 dollar signs end up as 4 dollar signs when expanded.  The shell sees
77*e2eeea75SSimon J. Gerraty# the command "echo '$$$$'".  The 4 dollar signs are stored in OUTPUT, and
78*e2eeea75SSimon J. Gerraty# when that variable is expanded, they expand to 2 dollar signs.
79*e2eeea75SSimon J. GerratyOUTPUT!=	echo '$$$$$$$$'
80*e2eeea75SSimon J. Gerraty.if ${OUTPUT} != "\$\$"
81*e2eeea75SSimon J. Gerraty.  error
82*e2eeea75SSimon J. Gerraty.endif
832c3632d1SSimon J. Gerraty
842c3632d1SSimon J. Gerratyall:
85