1 1.6 rillig # $NetBSD: var-recursive.mk,v 1.6 2023/11/19 21:47:52 rillig Exp $ 2 1.1 rillig # 3 1.6 rillig # Tests for 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.5 rillig # expect+1: still there 21 1.1 rillig . info still there # Therefore this line is printed. 22 1.1 rillig . info ${DIRECT} # But expanding the variable is an error. 23 1.1 rillig 24 1.1 rillig .elif ${TEST} == indirect 25 1.1 rillig 26 1.1 rillig # The chain of variables that refer to each other may be long. 27 1.1 rillig INDIRECT1= ${INDIRECT2} 28 1.1 rillig INDIRECT2= ${INDIRECT1} 29 1.1 rillig . info ${INDIRECT1} 30 1.1 rillig 31 1.1 rillig .elif ${TEST} == conditional 32 1.1 rillig 33 1.1 rillig # The variable refers to itself, but only in the branch of a condition that 34 1.1 rillig # is never satisfied and is thus not evaluated. 35 1.1 rillig CONDITIONAL= ${1:?ok:${CONDITIONAL}} 36 1.5 rillig # expect+1: ok 37 1.1 rillig . info ${CONDITIONAL} 38 1.1 rillig 39 1.2 rillig .elif ${TEST} == short 40 1.2 rillig 41 1.2 rillig # Short variable names can be expanded using the short-hand $V notation, 42 1.2 rillig # which takes a different code path in Var_Parse for parsing the variable 43 1.2 rillig # name. Ensure that these are checked as well. 44 1.2 rillig V= $V 45 1.2 rillig . info $V 46 1.2 rillig 47 1.3 rillig .elif ${TEST} == target 48 1.3 rillig 49 1.3 rillig # If a recursive variable is accessed in a command of a target, the makefiles 50 1.3 rillig # are not parsed anymore, so there is no location information from the 51 1.4 rillig # .includes and .for directives. In such a case, use the location of the last 52 1.4 rillig # command of the target to provide at least a hint to the location. 53 1.3 rillig VAR= ${VAR} 54 1.3 rillig target: 55 1.3 rillig : OK 56 1.3 rillig : ${VAR} 57 1.3 rillig : OK 58 1.3 rillig 59 1.1 rillig .else 60 1.1 rillig . error Unknown test "${TEST}" 61 1.1 rillig .endif 62 1.1 rillig 63 1.1 rillig all: 64