Home | History | Annotate | Line # | Download | only in unit-tests
var-recursive.mk revision 1.5
      1 # $NetBSD: var-recursive.mk,v 1.5 2023/06/01 20:56:35 rillig Exp $
      2 #
      3 # Tests for variable expressions that refer to themselves and thus
      4 # cannot be evaluated.
      5 
      6 TESTS=	direct indirect conditional short target
      7 
      8 # Since make exits immediately when it detects a recursive expression,
      9 # the actual tests are run in sub-makes.
     10 TEST?=	# none
     11 .if ${TEST} == ""
     12 all:
     13 .for test in ${TESTS}
     14 	@${.MAKE} -f ${MAKEFILE} TEST=${test} || :
     15 .endfor
     16 
     17 .elif ${TEST} == direct
     18 
     19 DIRECT=	${DIRECT}	# Defining a recursive variable is not yet an error.
     20 # expect+1: still there
     21 .  info still there	# Therefore this line is printed.
     22 .  info ${DIRECT}	# But expanding the variable is an error.
     23 
     24 .elif ${TEST} == indirect
     25 
     26 # The chain of variables that refer to each other may be long.
     27 INDIRECT1=	${INDIRECT2}
     28 INDIRECT2=	${INDIRECT1}
     29 .  info ${INDIRECT1}
     30 
     31 .elif ${TEST} == conditional
     32 
     33 # The variable refers to itself, but only in the branch of a condition that
     34 # is never satisfied and is thus not evaluated.
     35 CONDITIONAL=	${1:?ok:${CONDITIONAL}}
     36 # expect+1: ok
     37 .  info ${CONDITIONAL}
     38 
     39 .elif ${TEST} == short
     40 
     41 # Short variable names can be expanded using the short-hand $V notation,
     42 # which takes a different code path in Var_Parse for parsing the variable
     43 # name.  Ensure that these are checked as well.
     44 V=	$V
     45 .  info $V
     46 
     47 .elif ${TEST} == target
     48 
     49 # If a recursive variable is accessed in a command of a target, the makefiles
     50 # are not parsed anymore, so there is no location information from the
     51 # .includes and .for directives.  In such a case, use the location of the last
     52 # command of the target to provide at least a hint to the location.
     53 VAR=	${VAR}
     54 target:
     55 	: OK
     56 	: ${VAR}
     57 	: OK
     58 
     59 .else
     60 .  error Unknown test "${TEST}"
     61 .endif
     62 
     63 all:
     64