varname-dot-make-level.mk revision 1.3.2.1 1 1.3.2.1 perseant # $NetBSD: varname-dot-make-level.mk,v 1.3.2.1 2025/08/02 05:58:40 perseant Exp $
2 1.1 rillig #
3 1.3 rillig # Tests for the special .MAKE.LEVEL variable, which informs about the
4 1.3 rillig # recursion level. It is related to the environment variable MAKELEVEL,
5 1.3 rillig # even though they don't have the same value.
6 1.1 rillig
7 1.3.2.1 perseant all: .PHONY level_1 set-env-same set-env-different
8 1.3.2.1 perseant
9 1.3.2.1 perseant # expect: level 1: variable 0, env 1
10 1.3 rillig level_1: .PHONY
11 1.3 rillig @printf 'level 1: variable %s, env %s\n' ${.MAKE.LEVEL} "$$${.MAKE.LEVEL.ENV}"
12 1.3 rillig @${MAKE} -f ${MAKEFILE} level_2
13 1.1 rillig
14 1.3.2.1 perseant # expect: level 2: variable 1, env 2
15 1.3 rillig level_2: .PHONY
16 1.3 rillig @printf 'level 2: variable %s, env %s\n' ${.MAKE.LEVEL} "$$${.MAKE.LEVEL.ENV}"
17 1.3 rillig @${MAKE} -f ${MAKEFILE} level_3
18 1.3 rillig
19 1.3 rillig # The .unexport-env directive clears the environment, except for the
20 1.3.2.1 perseant # .MAKE.LEVEL.ENV make variable, which by default refers to the MAKELEVEL
21 1.3.2.1 perseant # environment variable.
22 1.3 rillig .if make(level_2)
23 1.3 rillig .unexport-env
24 1.3 rillig .endif
25 1.3.2.1 perseant
26 1.3.2.1 perseant # expect: level 3: variable 2, env 3
27 1.3.2.1 perseant level_3: .PHONY
28 1.3.2.1 perseant @printf 'level 3: variable %s, env %s\n' ${.MAKE.LEVEL} "$$${.MAKE.LEVEL.ENV}"
29 1.3.2.1 perseant
30 1.3.2.1 perseant
31 1.3.2.1 perseant # When a variable assignment from the command line tries to override a
32 1.3.2.1 perseant # read-only global variable with the same value as before, ignore the
33 1.3.2.1 perseant # assignment, as the variable value would not change.
34 1.3.2.1 perseant #
35 1.3.2.1 perseant # This special case allows older versions of make to coexist with newer
36 1.3.2.1 perseant # versions of make. Older version of make (up to NetBSD 9) stored the internal
37 1.3.2.1 perseant # .MAKE.LEVEL.ENV variable in the scope for command line variables, and these
38 1.3.2.1 perseant # variables were passed to sub-makes via .MAKEOVERRIDES and the MAKEFLAGS
39 1.3.2.1 perseant # environment variable. Newer versions of make (since NetBSD 11) store the
40 1.3.2.1 perseant # internal .MAKE.LEVEL.ENV variable in the global scope but make it read-only
41 1.3.2.1 perseant # and prevent any attempts to override it.
42 1.3.2.1 perseant #
43 1.3.2.1 perseant # https://gnats.netbsd.org/59184
44 1.3.2.1 perseant set-env-same: .PHONY
45 1.3.2.1 perseant : ${.TARGET}
46 1.3.2.1 perseant @${MAKE} -f ${MAKEFILE} ok .MAKE.LEVEL.ENV=${.MAKE.LEVEL.ENV} || echo "${.TARGET}: exit $$?"
47 1.3.2.1 perseant
48 1.3.2.1 perseant
49 1.3.2.1 perseant # expect: make: Cannot override read-only global variable ".MAKE.LEVEL.ENV" with a command line variable
50 1.3.2.1 perseant set-env-different: .PHONY
51 1.3.2.1 perseant : ${.TARGET}
52 1.3.2.1 perseant @${MAKE} -f ${MAKEFILE} ok .MAKE.LEVEL.ENV=CUSTOM || echo "${.TARGET}: exit $$?"
53 1.3.2.1 perseant
54 1.3.2.1 perseant ok: .PHONY
55 1.3.2.1 perseant @echo ok
56