二、顶层Makefile前面部分分析
1.递归调用make(20-29)
在源码内有许许多多的目录,顶层Makefile也要调用子目录(subdir)中的makefile。
$(MAKE) -C subdir
export :用于给子makefile传入变量
unexport :用于不给子makefile导入变量
SHELL / MAKEFLAGS :无论用不用export , 都会将变量直接传给子makefile的。
MAKEFLAGS += -rR --include-dir=$(CURDIR)
# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC
# Avoid interference with shell env settings
unexport GREP_OPTIONS
2.命令行编译V=1的用处(73-86)
看代码不难发先,它会比较V在命令行中输入的值,如果为非0,就会给KBUILD_VERBOSE变量赋值。为1的时候就会给quiet与Q附一个空值。也就是说在给每一个编译命令都会调用quiet与Q之来判断是否要打印出详细的命令代码。其中Q=@。在makefile中,如果在命令前面使用@,就不会打印在终端了。其中quiet_cmd_socboot , 与cmd_socboot命令等效,quiet=quiet_的话,输出较短版本的命令。
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
ifeq ($(KBUILD_VERBOSE),1)
quiet =
Q =
else
quiet=quiet_
Q = @
endif
$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \
-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))
quiet_cmd_socboot = SOCBOOT $@
cmd_socboot = cat spl/u-boot-spl.sfp spl/u-boot-spl.sfp \
spl/u-boot-spl.sfp spl/u-boot-spl.sfp \
u-boot.img > $@ || rm -f $@
3.静默编译(91-101)
使用make -s可以执行静默编译,编译全程不会打印命令信息,很少用。quiet = silent_。
ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
quiet=silent_
endif
else # make-3.8x
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
quiet=silent_
endif
endif
export quiet Q KBUILD_VERBOSE