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