1 1.1 rillig # $NetBSD: var-recursive.mk,v 1.1 2020/10/31 11:30:57 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.1 rillig TESTS= direct indirect conditional 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.1 rillig .else 38 1.1 rillig . error Unknown test "${TEST}" 39 1.1 rillig .endif 40 1.1 rillig 41 1.1 rillig all: 42