xref: /freebsd/contrib/bmake/unit-tests/varname-dot-make-level.mk (revision 759b177aecbfc49ebc900739954ac56b1aa5fc53)
1*759b177aSSimon J. Gerraty# $NetBSD: varname-dot-make-level.mk,v 1.6 2025/03/22 12:23:00 rillig Exp $
22c3632d1SSimon J. Gerraty#
38d5c8e21SSimon J. Gerraty# Tests for the special .MAKE.LEVEL variable, which informs about the
48d5c8e21SSimon J. Gerraty# recursion level.  It is related to the environment variable MAKELEVEL,
58d5c8e21SSimon J. Gerraty# even though they don't have the same value.
62c3632d1SSimon J. Gerraty
7*759b177aSSimon J. Gerratyall: .PHONY level_1 set-env-same set-env-different
86a7405f5SSimon J. Gerraty
9*759b177aSSimon J. Gerraty# expect: level 1: variable 0, env 1
108d5c8e21SSimon J. Gerratylevel_1: .PHONY
118d5c8e21SSimon J. Gerraty	@printf 'level 1: variable %s, env %s\n' ${.MAKE.LEVEL} "$$${.MAKE.LEVEL.ENV}"
128d5c8e21SSimon J. Gerraty	@${MAKE} -f ${MAKEFILE} level_2
132c3632d1SSimon J. Gerraty
14*759b177aSSimon J. Gerraty# expect: level 2: variable 1, env 2
158d5c8e21SSimon J. Gerratylevel_2: .PHONY
168d5c8e21SSimon J. Gerraty	@printf 'level 2: variable %s, env %s\n' ${.MAKE.LEVEL} "$$${.MAKE.LEVEL.ENV}"
178d5c8e21SSimon J. Gerraty	@${MAKE} -f ${MAKEFILE} level_3
188d5c8e21SSimon J. Gerraty
198d5c8e21SSimon J. Gerraty# The .unexport-env directive clears the environment, except for the
20*759b177aSSimon J. Gerraty# .MAKE.LEVEL.ENV make variable, which by default refers to the MAKELEVEL
21*759b177aSSimon J. Gerraty# environment variable.
228d5c8e21SSimon J. Gerraty.if make(level_2)
238d5c8e21SSimon J. Gerraty.unexport-env
248d5c8e21SSimon J. Gerraty.endif
256a7405f5SSimon J. Gerraty
26*759b177aSSimon J. Gerraty# expect: level 3: variable 2, env 3
27*759b177aSSimon J. Gerratylevel_3: .PHONY
28*759b177aSSimon J. Gerraty	@printf 'level 3: variable %s, env %s\n' ${.MAKE.LEVEL} "$$${.MAKE.LEVEL.ENV}"
29*759b177aSSimon J. Gerraty
30*759b177aSSimon J. Gerraty
31*759b177aSSimon J. Gerraty# When a variable assignment from the command line tries to override a
32*759b177aSSimon J. Gerraty# read-only global variable with the same value as before, ignore the
33*759b177aSSimon J. Gerraty# assignment, as the variable value would not change.
34*759b177aSSimon J. Gerraty#
35*759b177aSSimon J. Gerraty# This special case allows older versions of make to coexist with newer
36*759b177aSSimon J. Gerraty# versions of make. Older version of make (up to NetBSD 9) stored the internal
37*759b177aSSimon J. Gerraty# .MAKE.LEVEL.ENV variable in the scope for command line variables, and these
38*759b177aSSimon J. Gerraty# variables were passed to sub-makes via .MAKEOVERRIDES and the MAKEFLAGS
39*759b177aSSimon J. Gerraty# environment variable. Newer versions of make (since NetBSD 11) store the
40*759b177aSSimon J. Gerraty# internal .MAKE.LEVEL.ENV variable in the global scope but make it read-only
41*759b177aSSimon J. Gerraty# and prevent any attempts to override it.
42*759b177aSSimon J. Gerraty#
43*759b177aSSimon J. Gerraty# https://gnats.netbsd.org/59184
44*759b177aSSimon J. Gerratyset-env-same: .PHONY
45*759b177aSSimon J. Gerraty	: ${.TARGET}
46*759b177aSSimon J. Gerraty	@${MAKE} -f ${MAKEFILE} ok .MAKE.LEVEL.ENV=${.MAKE.LEVEL.ENV} || echo "${.TARGET}: exit $$?"
47*759b177aSSimon J. Gerraty
486a7405f5SSimon J. Gerraty
496a7405f5SSimon J. Gerraty# expect: make: Cannot override read-only global variable ".MAKE.LEVEL.ENV" with a command line variable
50*759b177aSSimon J. Gerratyset-env-different: .PHONY
51*759b177aSSimon J. Gerraty	: ${.TARGET}
52*759b177aSSimon J. Gerraty	@${MAKE} -f ${MAKEFILE} ok .MAKE.LEVEL.ENV=CUSTOM || echo "${.TARGET}: exit $$?"
53*759b177aSSimon J. Gerraty
54*759b177aSSimon J. Gerratyok: .PHONY
55*759b177aSSimon J. Gerraty	@echo ok
56