cond-cmp-string.mk revision 1.12 1 # $NetBSD: cond-cmp-string.mk,v 1.12 2020/11/08 23:00:09 rillig Exp $
2 #
3 # Tests for string comparisons in .if conditions.
4
5 # This is a simple comparison of string literals.
6 # Nothing surprising here.
7 .if "str" != "str"
8 . error
9 .endif
10
11 # The right-hand side of the comparison may be written without quotes.
12 .if "str" != str
13 . error
14 .endif
15
16 # The left-hand side of the comparison must be enclosed in quotes.
17 # This one is not enclosed in quotes and thus generates an error message.
18 .if str != str
19 . error
20 .endif
21
22 # The left-hand side of the comparison requires a defined variable.
23 # The variable named "" is not defined, but applying the :U modifier to it
24 # makes it "kind of defined" (see VAR_KEEP). Therefore it is ok here.
25 .if ${:Ustr} != "str"
26 . error
27 .endif
28
29 # Any character in a string literal may be escaped using a backslash.
30 # This means that "\n" does not mean a newline but a simple "n".
31 .if "string" != "\s\t\r\i\n\g"
32 . error
33 .endif
34
35 # It is not possible to concatenate two string literals to form a single
36 # string.
37 .if "string" != "str""ing"
38 . error
39 .endif
40
41 # There is no = operator for strings.
42 .if !("value" = "value")
43 . error
44 .else
45 . error
46 .endif
47
48 # There is no === operator for strings either.
49 .if !("value" === "value")
50 . error
51 .else
52 . error
53 .endif
54
55 # A variable expression can be enclosed in double quotes.
56 .if ${:Uword} != "${:Uword}"
57 . error
58 .endif
59
60 # Between 2003-01-01 (maybe even earlier) and 2020-10-30, adding one of the
61 # characters " \t!=><" directly after a variable expression resulted in a
62 # "Malformed conditional", even though the string was well-formed.
63 .if ${:Uword } != "${:Uword} "
64 . error
65 .endif
66 # Some other characters worked though, and some didn't.
67 # Those that are mentioned in is_separator didn't work.
68 .if ${:Uword0} != "${:Uword}0"
69 . error
70 .endif
71 .if ${:Uword&} != "${:Uword}&"
72 . error
73 .endif
74 .if ${:Uword!} != "${:Uword}!"
75 . error
76 .endif
77 .if ${:Uword<} != "${:Uword}<"
78 . error
79 .endif
80
81 # Adding another variable expression to the string literal works though.
82 .if ${:Uword} != "${:Uwo}${:Urd}"
83 . error
84 .endif
85
86 # Adding a space at the beginning of the quoted variable expression works
87 # though.
88 .if ${:U word } != " ${:Uword} "
89 . error
90 .endif
91
92 # If at least one side of the comparison is a string literal, the string
93 # comparison is performed.
94 .if 12345 != "12345"
95 . error
96 .endif
97
98 # If at least one side of the comparison is a string literal, the string
99 # comparison is performed. The ".0" in the left-hand side makes the two
100 # sides of the equation unequal.
101 .if 12345.0 == "12345"
102 . error
103 .endif
104