cond-token-var.mk revision 1.9 1 1.9 rillig # $NetBSD: cond-token-var.mk,v 1.9 2024/08/06 18:00:17 rillig Exp $
2 1.1 rillig #
3 1.8 rillig # Tests for expressions in .if conditions.
4 1.5 rillig #
5 1.8 rillig # Note the fine distinction between a variable and an expression.
6 1.8 rillig # A variable has a name and a value. To access the value, one writes an
7 1.8 rillig # expression of the form ${VAR}. This is a simple
8 1.8 rillig # expression. Expressions can get more complicated by adding
9 1.5 rillig # variable modifiers such as in ${VAR:Mpattern}.
10 1.5 rillig #
11 1.5 rillig # XXX: Strictly speaking, variable modifiers should be called expression
12 1.5 rillig # modifiers instead since they only modify the expression, not the variable.
13 1.5 rillig # Well, except for the assignment modifiers, these do indeed change the value
14 1.5 rillig # of the variable.
15 1.1 rillig
16 1.3 rillig DEF= defined
17 1.1 rillig
18 1.3 rillig # A defined variable may appear on either side of the comparison.
19 1.3 rillig .if ${DEF} == ${DEF}
20 1.7 rillig # expect+1: ok
21 1.4 rillig . info ok
22 1.3 rillig .else
23 1.4 rillig . error
24 1.3 rillig .endif
25 1.3 rillig
26 1.3 rillig # A variable that appears on the left-hand side must be defined.
27 1.9 rillig # expect+1: Malformed conditional '${UNDEF} == ${DEF}'
28 1.3 rillig .if ${UNDEF} == ${DEF}
29 1.4 rillig . error
30 1.3 rillig .endif
31 1.3 rillig
32 1.3 rillig # A variable that appears on the right-hand side must be defined.
33 1.9 rillig # expect+1: Malformed conditional '${DEF} == ${UNDEF}'
34 1.3 rillig .if ${DEF} == ${UNDEF}
35 1.4 rillig . error
36 1.3 rillig .endif
37 1.3 rillig
38 1.3 rillig # A defined variable may appear as an expression of its own.
39 1.3 rillig .if ${DEF}
40 1.3 rillig .endif
41 1.3 rillig
42 1.5 rillig # An undefined variable on its own generates a parse error.
43 1.9 rillig # expect+1: Malformed conditional '${UNDEF}'
44 1.3 rillig .if ${UNDEF}
45 1.3 rillig .endif
46 1.3 rillig
47 1.5 rillig # The :U modifier turns an undefined expression into a defined expression.
48 1.5 rillig # Since the expression is defined now, it doesn't generate any parse error.
49 1.3 rillig .if ${UNDEF:U}
50 1.3 rillig .endif
51 1.6 rillig
52 1.8 rillig # If the value of the expression is a number, it is compared against
53 1.6 rillig # zero.
54 1.6 rillig .if ${:U0}
55 1.6 rillig . error
56 1.6 rillig .endif
57 1.6 rillig .if !${:U1}
58 1.6 rillig . error
59 1.6 rillig .endif
60 1.6 rillig
61 1.8 rillig # If the value of the expression is not a number, any non-empty
62 1.6 rillig # value evaluates to true, even if there is only whitespace.
63 1.6 rillig .if ${:U}
64 1.6 rillig . error
65 1.6 rillig .endif
66 1.6 rillig .if !${:U }
67 1.6 rillig . error
68 1.6 rillig .endif
69 1.6 rillig .if !${:Uanything}
70 1.6 rillig . error
71 1.6 rillig .endif
72