|
Makefile 对应内核版本:2.6.35.13
no-dot-config-targets 定义在 414 行:
[code=Makefile]no-dot-config-targets := clean mrproper distclean \
cscope TAGS tags help %docs check% \
include/linux/version.h headers_% \
kernelrelease kernelversion[/mw_shl_code]
no-dot-config-targets 的意思是这些目标和 .config 完全无关的。使用 make help 也可以看到这些目标,如:help, kernelversion, kernelrelease, headers_install 等等。
而与 .config 有关的目标(dog-config)则有两种,一种是产生 .config 文件,如 menuconfig, oldconfig, defconfig 等,这些目标也称为配置目标(config targets);另外一种是需要使用 .config 文件的目标,它们必须以 .config 文件中的配置作为构建自己的依据,比如 all, vmlinux, modules, bzImage 等,这些目标也称为构建目标(build targets)。
还有一种目标是混合目标(mixed-targets),它表示在执行 make 命令时,同时指定了 配置目标 和 其它的目标,而不仅仅是指 配置目标 和 构建目标 相混合。比如 make defconfig vmlinux 命令是 配置目标和构建目标的混合;make defconfig kernelversion 中的 kernelversion 则不是构建目标。
顶层 Makefile 文件中与上面所述几个目标的相关变量:no-dot-config-targets, dot-config, mixed-targets 。相关代码定义在 414-436 行:
[code=Makefile]
no-dot-config-targets := clean mrproper distclean \
cscope TAGS tags help %docs check% \
include/linux/version.h headers_% \
kernelrelease kernelversion
config-targets := 0
mixed-targets := 0
dot-config := 1
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
dot-config := 0
endif
endif
ifeq ($(KBUILD_EXTMOD),)
ifneq ($(filter config %config,$(MAKECMDGOALS)),)
config-targets := 1
ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
mixed-targets := 1
endif
endif
endif[/mw_shl_code]
这一段代码,开始对 no-dot-config-targets 变量进行了定义。
然后,将 config-targets, mixed-targets, dot-config 这 3 个变量分别定义为 0, 0, 1 。接下来在在
ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
中判断 make 命令的目标中是否含有 no-dot-config-targets 这些目标,如果有,那么接着执行下面
ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
的判断,这里将 no-dot-config-targets 这种目标从 make 命令中的所有目标都去掉,然后看结果是否为空,若为空的话,则说明 make 命令中仅含有变量 no-dot-config-targets 中指出的目标,这时就将 dot-config 变量值设为 0 ,所以这次所要 make 的目标是和 .config 文件无关的,也就是说,它们既不会产生 .config配置文件,也不需要用 .config 文件来构建其它相关的目标。
继续往下,在
ifeq ($(KBUILD_EXTMOD),)
中判断是否要编译模块,如果 $(KBUILD_EXTMOD) 为空,则说明不是编译外部模块,那么程序来到下面的判断:
ifneq ($(filter config %config,$(MAKECMDGOALS)),)
这里判断 make 命令中指定的目标中是否含有 config 或者 %config 这样的目标,如果有的话,则将 config-targets 变量设置为 1 。
接着继续来到下面的判断语句:
ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
这里判断除了 config 或 %config 这些目标外,是否还要构建其它目标,如果还有的话,那么就是在 make 一个混合目标,此时将 mixed-targets 变量设置为 1 。比如 make defconfig kernelversion 就是构建混合目标的例子。 |
|