mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
50 lines
1.3 KiB
Makefile
50 lines
1.3 KiB
Makefile
|
# $NetBSD: var-recursive.mk,v 1.2 2020/10/31 13:45:00 rillig Exp $
|
||
|
#
|
||
|
# Tests for variable expressions that refer to themselves and thus
|
||
|
# cannot be evaluated.
|
||
|
|
||
|
TESTS= direct indirect conditional short
|
||
|
|
||
|
# Since make exits immediately when it detects a recursive expression,
|
||
|
# the actual tests are run in sub-makes.
|
||
|
TEST?= # none
|
||
|
.if ${TEST} == ""
|
||
|
all:
|
||
|
.for test in ${TESTS}
|
||
|
@${.MAKE} -f ${MAKEFILE} TEST=${test} || :
|
||
|
.endfor
|
||
|
|
||
|
.elif ${TEST} == direct
|
||
|
|
||
|
DIRECT= ${DIRECT} # Defining a recursive variable is not yet an error.
|
||
|
. info still there # Therefore this line is printed.
|
||
|
. info ${DIRECT} # But expanding the variable is an error.
|
||
|
|
||
|
.elif ${TEST} == indirect
|
||
|
|
||
|
# The chain of variables that refer to each other may be long.
|
||
|
INDIRECT1= ${INDIRECT2}
|
||
|
INDIRECT2= ${INDIRECT1}
|
||
|
. info ${INDIRECT1}
|
||
|
|
||
|
.elif ${TEST} == conditional
|
||
|
|
||
|
# The variable refers to itself, but only in the branch of a condition that
|
||
|
# is never satisfied and is thus not evaluated.
|
||
|
CONDITIONAL= ${1:?ok:${CONDITIONAL}}
|
||
|
. info ${CONDITIONAL}
|
||
|
|
||
|
.elif ${TEST} == short
|
||
|
|
||
|
# Short variable names can be expanded using the short-hand $V notation,
|
||
|
# which takes a different code path in Var_Parse for parsing the variable
|
||
|
# name. Ensure that these are checked as well.
|
||
|
V= $V
|
||
|
. info $V
|
||
|
|
||
|
.else
|
||
|
. error Unknown test "${TEST}"
|
||
|
.endif
|
||
|
|
||
|
all:
|