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