directive-ifndef.mk revision 1.9 1 # $NetBSD: directive-ifndef.mk,v 1.9 2023/10/19 18:24:33 rillig Exp $
2 #
3 # Tests for the .ifndef directive, which can be used for multiple-inclusion
4 # guards. In contrast to C, where #ifndef and #define nicely line up the
5 # macro name, there is no such syntax in make. Therefore, it is more
6 # common to use .if !defined(GUARD) instead.
7 #
8 # See also:
9 # directive-include-guard.mk
10
11 .ifndef GUARD
12 GUARD= # defined
13 # expect+1: guarded section
14 . info guarded section
15 .endif
16
17 .ifndef GUARD
18 GUARD= # defined
19 . info guarded section
20 .endif
21
22 .if !defined(GUARD)
23 GUARD= # defined
24 . info guarded section
25 .endif
26
27
28 # The '.ifndef' directive can be used with multiple arguments, even negating
29 # them. Since these conditions are confusing for humans, they should be
30 # replaced with easier-to-understand plain '.if' directives.
31 DEFINED=
32 .ifndef UNDEFINED && UNDEFINED
33 .else
34 . error
35 .endif
36 .ifndef UNDEFINED && DEFINED
37 . error
38 .endif
39 .ifndef DEFINED && DEFINED
40 . error
41 .endif
42 .ifndef !UNDEFINED && !UNDEFINED
43 . error
44 .endif
45 .ifndef !UNDEFINED && !DEFINED
46 . error
47 .endif
48 .ifndef !DEFINED && !DEFINED
49 .else
50 . error
51 .endif
52
53
54 # The negation from the 'if-not-defined' directive only applies to bare words,
55 # but not to numbers, quoted strings or expressions. Those are evaluated
56 # without extra negation, just like in a plain '.if' directive.
57 .ifndef 0
58 . error
59 .endif
60 .ifndef 1
61 .else
62 . error
63 .endif
64 .ifndef ""
65 . error
66 .endif
67 .ifndef "word"
68 .else
69 . error
70 .endif
71 .ifndef ${:UUNDEFINED}
72 .else
73 . error
74 .endif
75 .ifndef ${:UDEFINED}
76 . error
77 .endif
78 .ifndef ${:U0}
79 . error
80 .endif
81 .ifndef ${:U1}
82 .else
83 . error
84 .endif
85
86
87 all:
88