默认情况下,只有环境变量和通过命令行方式定义的变量才会被传递给子make进程。需要将一个在上层定义的变量传递给子 make,应该在上层 Makefile 中使用指示符“export”指示符来对它声明,格式为
export VARIABLE ...
;当不希望将一个变量传递给子 make 时,可以使用指示符“unexport”来声明这个变量,格式如下:unexport VARIABLE ...
。最后一个出现的指示符“export”或者“unexport”决定整个 make 运行过程中变量是否进行传递。三个特殊变量:
“SHELL”和“MAKEFLAGS”在整个 make 的执行过程中始终被自动的传递给所有的子 make。
“MAKEFILES”如果不为空也会被自动的传递给子 make。使用环境变量传递上层所定义的变量时,上层所传递给子 make 过程的变量定义不会覆盖子 make 过程所执行makefile 文件中的同名变量定义,除非使用make的“-e”选项(该选项代表使用环境变量的值)。
指示符“export”或者“unexport”的参数(变量部分),如果它是对一个变量或者函数的引用,这些变量或者函数将会被立即展开,并赋值给export或者unexport的变量。export 时对变量进行展开,是为了保证传递给子 make 的变量使用当前 Makefile 中定义的变量值。
一个不带任何参数的指示符“export”指示符的含义是将此 Makefile 中定义的所有变量传递给子 make 过程。那些名字中包含其它字符(除字母、数字和下划线以外的字符)的变量可能不会被传递给子 make,对这类特殊命名的变量传递需要明确的使用“export”指示符对它进行声明。虽然不带任何参数的“export”指示符具有特殊的含义,但是一个不带任何参数的“unexport”指示符却是没有任何意义的,它不会对 make 的执行过程(变量的传递)产生任何影响。
通过MAKELEVEL的值可以了解当前 make 递归调用的深度。最上一级时“MAKELEVEL”的值为“0”、下一级时为“1”、再下一级为“2”…….这个变量主要用在条件测试指令,如不允许直接在此目录下执行 make可使用如下限制条件
ifeq ($(MAKELEVEL),0)
all : msg
else
all : other
endif
……
msg:
@echo ”Can not make in this directory!”
最上层主控make 的命令行选项“-k”、“-s”等会被自动的通过环境变量“MAKEFLAGS”传递给子 make 进程;执行 make 时命令行中给定的一个变量定义,如
make CFLAGS+=-g
,此变量和它的值(CFLAGS+=-g)也会借助环境变量“MAKEFLAGS”传递给子 make进程。如果在执行 make 时通过命令行指定了“-k”和“-s”选项,那么“MAKEFLAGS”的值会被自动设置为“ks”。“-C”、“-f”、“-o”和“-W”这些命令行选项是不会被赋值给变量“MAKEFLAGS”。执行多级的 make 调用时,当不希望传递“MAKEFLAGS”的给子 make 时,需要在调用子 make 时对这个变量进行赋空。子 make在执行时,首先将会对变量“MAKEFLAGS”的值进行分析。当变量的值不是以连字符开始时,将变量的值按字用空格分开并将这些字作为命令行的选项对待(除了选项“-C”、“-f”、“-h”、“-o”和“-W”以及他们的长格式),如果其中包含无效的选项不会提示错误。