Home | History | Annotate | Line # | Download | only in unit-tests
      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