cond-token-string.mk revision 1.11 1 # $NetBSD: cond-token-string.mk,v 1.11 2024/07/05 19:47:22 rillig Exp $
2 #
3 # Tests for quoted string literals in .if conditions.
4 #
5 # See also:
6 # cond-token-plain.mk
7 # Covers string literals without quotes (called "bare words").
8
9 # TODO: Implementation
10
11 # Cover the code in CondParser_String that frees the memory after parsing
12 # an expression based on an undefined variable.
13 # expect+2: Malformed conditional ("" != "${:Uvalue:Z}")
14 # expect+1: while evaluating "${:Uvalue:Z}"" with value "value": Unknown modifier "Z"
15 .if "" != "${:Uvalue:Z}"
16 . error
17 .else
18 . error
19 .endif
20
21 .if x${:Uvalue}
22 . error
23 .else
24 # expect+1: xvalue is not defined.
25 . info xvalue is not defined.
26 .endif
27
28 # The 'x' produces a "Malformed conditional" since the left-hand side of a
29 # comparison in an .if directive must be either an expression, a
30 # quoted string literal or a number that starts with a digit.
31 # expect+1: Malformed conditional (x${:Uvalue} == "")
32 .if x${:Uvalue} == ""
33 . error
34 .else
35 . error
36 .endif
37
38 # In plain words, a '\' can be used to escape any character, just as in
39 # double-quoted string literals. See CondParser_String.
40 .if \x${:Uvalue} == "xvalue"
41 # expect+1: Expected.
42 . info Expected.
43 .else
44 . error
45 .endif
46
47 .MAKEFLAGS: -dc
48
49 # A string in quotes is checked whether it is not empty.
50 .if "UNDEF"
51 # expect+1: The string literal "UNDEF" is not empty.
52 . info The string literal "UNDEF" is not empty.
53 .else
54 . error
55 .endif
56
57 # A space is not empty as well.
58 # This differs from many other places where whitespace is trimmed.
59 .if " "
60 # expect+1: The string literal " " is not empty, even though it consists of whitespace only.
61 . info The string literal " " is not empty, even though it consists of $\
62 whitespace only.
63 .else
64 . error
65 .endif
66
67 .if "${UNDEF}"
68 . error
69 .else
70 # expect+1: An undefined variable in quotes expands to an empty string, which then evaluates to false.
71 . info An undefined variable in quotes expands to an empty string, which $\
72 then evaluates to false.
73 .endif
74
75 .if "${:Uvalue}"
76 # expect+1: A nonempty expression evaluates to true.
77 . info A nonempty expression evaluates to true.
78 .else
79 . error
80 .endif
81
82 .if "${:U}"
83 . error
84 .else
85 # expect+1: An empty variable evaluates to false.
86 . info An empty variable evaluates to false.
87 .endif
88
89 # A non-empty string evaluates to true, no matter if it's a literal string or
90 # if it contains expressions. The parentheses are not necessary for
91 # the parser, in this case their only purpose is to make the code harder to
92 # read for humans.
93 VAR= value
94 .if ("${VAR}")
95 .else
96 . error
97 .endif
98
99 # In the conditions in .if directives, the left-hand side of a comparison must
100 # be enclosed in quotes. The right-hand side does not need to be enclosed in
101 # quotes.
102 .if "quoted" == quoted
103 .else
104 . error
105 .endif
106
107 .MAKEFLAGS: -d0
108
109 all: .PHONY
110