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