directive-undef.mk revision 1.17 1 # $NetBSD: directive-undef.mk,v 1.17 2025/03/29 19:08:52 rillig Exp $
2 #
3 # Tests for the .undef directive.
4 #
5 # See also:
6 # directive-misspellings.mk
7
8 # Before var.c 1.737 from 2020-12-19, .undef only undefined the first
9 # variable, silently skipping all further variable names.
10 #
11 # Before var.c 1.761 from 2020-12-22, .undef complained about too many
12 # arguments.
13 #
14 # Since var.c 1.761 from 2020-12-22, .undef handles multiple variable names
15 # just like the .export directive.
16 1= 1
17 2= 2
18 3= 3
19 .undef 1 2 3
20 .if ${1:U_}${2:U_}${3:U_} != ___
21 . warning $1$2$3
22 .endif
23
24
25 # Without any arguments, until var.c 1.736 from 2020-12-19, .undef tried
26 # to delete the variable with the empty name, which never exists; see
27 # varname-empty.mk. Since var.c 1.737 from 2020-12-19, .undef complains
28 # about a missing argument.
29 # expect+1: The .undef directive requires an argument
30 .undef
31
32
33 # Trying to delete the variable with the empty name is ok, it just won't
34 # ever do anything since that variable is never defined.
35 .undef ${:U}
36
37
38 # The argument of .undef is first expanded exactly once and then split into
39 # words, just like everywhere else. This prevents variables whose names
40 # contain spaces or unbalanced 'single' or "double" quotes from being
41 # undefined, but these characters do not appear in variables names anyway.
42 1= 1
43 2= 2
44 3= 3
45 ${:U1 2 3}= one two three
46 VARNAMES= 1 2 3
47 .undef ${VARNAMES} # undefines the variables "1", "2" and "3"
48 .if ${${:U1 2 3}} != "one two three" # still there
49 . error
50 .endif
51 .if ${1:U_}${2:U_}${3:U_} != "___" # these have been undefined
52 . error
53 .endif
54
55
56 # A variable named " " cannot be undefined. There's no practical use case
57 # for such variables anyway.
58 SPACE= ${:U }
59 ${SPACE}= space
60 .if !defined(${SPACE})
61 . error
62 .endif
63 .undef ${SPACE}
64 .if !defined(${SPACE})
65 . error
66 .endif
67
68
69 # A variable named "$" can be undefined since the argument to .undef is
70 # expanded exactly once, before being split into words.
71 DOLLAR= $$
72 ${DOLLAR}= dollar
73 .if !defined(${DOLLAR})
74 . error
75 .endif
76 .undef ${DOLLAR}
77 .if defined(${DOLLAR})
78 . error
79 .endif
80
81
82 # Since var.c 1.762 from 2020-12-22, parse errors in the argument should be
83 # properly detected and should stop the .undef directive from doing any work.
84 #
85 # As of var.c 1.762, this doesn't happen though because the error handling
86 # in Var_Parse and Var_Subst is not done properly.
87 # expect+1: Unknown modifier ":Z"
88 .undef ${VARNAMES:L:Z}
89
90
91 UT_EXPORTED= exported-value
92 .export UT_EXPORTED
93 .if ${:!echo "\${UT_EXPORTED:-not-exported}"!} != "exported-value"
94 . error
95 .endif
96 .if !${.MAKE.EXPORTED:MUT_EXPORTED}
97 . error
98 .endif
99 .undef UT_EXPORTED # XXX: does not update .MAKE.EXPORTED
100 .if ${:!echo "\${UT_EXPORTED:-not-exported}"!} != "not-exported"
101 . error
102 .endif
103 .if ${.MAKE.EXPORTED:MUT_EXPORTED}
104 # expect+1: warning: UT_EXPORTED is still listed in .MAKE.EXPORTED even though spaceit is not exported anymore.
105 . warning UT_EXPORTED is still listed in .MAKE.EXPORTED even though $\
106 it is not exported anymore.
107 .endif
108
109
110 # When an exported variable is undefined, the variable is removed both from
111 # the global scope as well as from the environment.
112 DIRECT= direct
113 INDIRECT= in-${DIRECT}
114 .export DIRECT INDIRECT
115 .if ${DIRECT} != "direct"
116 . error
117 .endif
118 .if ${INDIRECT} != "in-direct"
119 . error
120 .endif
121
122 # Deletes the variables from the global scope and also from the environment.
123 # This applies to both variables, even though 'INDIRECT' is not actually
124 # exported yet since it refers to another variable.
125 .undef DIRECT # Separate '.undef' directives,
126 .undef INDIRECT # for backwards compatibility.
127
128 .if ${DIRECT:Uundefined} != "undefined"
129 . error
130 .endif
131 .if ${INDIRECT:Uundefined} != "undefined"
132 . error
133 .endif
134
135
136 # Since var.c 1.570 from 2020-10-06 and before var.c 1.1014 from 2022-03-26,
137 # make ran into an assertion failure when trying to undefine a variable that
138 # was based on an environment variable.
139 .if ${ENV_VAR} != "env-value" # see ./Makefile, ENV.directive-undef
140 . error
141 .endif
142 ENV_VAR+= appended # moves the short-lived variable to the
143 # global scope
144 .undef ENV_VAR # removes the variable from both the global
145 # scope and from the environment
146
147
148 all:
149