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