Home | History | Annotate | Line # | Download | only in unit-tests
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