版本号
MAKEFLAGES变量
20 MAKEFLAGS += -rR --include-dir=$(CURDIR)
- Makefile有两个特殊的变量:“SHELL”和“MAKEFLAGS”,这两个变量除非使用“unexport”声明,否则的话在整个make的执行过程中,它们的值始终自动的传递给子make。
- 在 Makefile 中使用“make”命令来执行其他的 Makefile文件
- 上述代码使用“+=”来给变量 MAKEFLAGS 追加了一些值,“-rR”表示禁止使用内置的隐含规则和变量定义,“--include-dir”指明搜索路径,”$(CURDIR)”表示当前目录。
命令输出
- uboot 默认编译是不会在终端中显示完整的命令,都是短命令。例如CC xxx.o和SYM u-boot.sym
- 可以通过设置变量“V=1“来实现完整的命令输出
实现源码
73 ifeq ("$(origin V)", "command line") 74 KBUILD_VERBOSE = $(V) 75 endif 76 ifndef KBUILD_VERBOSE 77 KBUILD_VERBOSE = 0 78 endif 79 80 ifeq ($(KBUILD_VERBOSE),1) 81 quiet = 82 Q = 83 else 84 quiet=quiet_ 85 Q = @ 86 endif
- 代码中先使用 ifeq 来判断"$(origin V)"和"command line"是否相等
- 函数origin 用于告诉你变量是哪来的。语法为:
$(origin <variable>)
variable 是变量名,o 函数的返回值就是变量来源,因此$(origin V)就是变量 V 的来源- 当这两个相等的时候变量 KBUILD_VERBOSE 就等于 V 的值,比如在命令行中输 入 “ V=1 “ 的 话 那 么 KBUILD_VERBOSE=1 。如果没有在命令行输入V的话KBUILD_VERBOSE=0
- 第 80 行判断 KBUILD_VERBOSE 是否为 1,如果 KBUILD_VERBOSE 为 1 的话变量 quiet和 Q 都为空,如果 KBUILD_VERBOSE=0 的话变量 quiet 为“quiet_“,变量 Q 为“@”
- Makefile 中会用到变量 quiet 和 Q 来控制编译的时候是否在终端输出完整的命令
- Q的作用。在顶层Makefile 中有很多如下所示的命令:$(Q)$(MAKE) $(build)=tools
当 V=0 的话上述命令展开就是“@ make $(build)=tools”,make 在执行的时候默认会在终端输出命令,但是在命令前面加上“@”就不会在终端输出命令了。
当 V=1 的时候 Q 就为空,上述命令就是“make $(build)=tools”,因此在 make 执行的过程,命令会被完整的输出在终端上- quiet的作用。有些命令会有两个版本,比如:
quiet_cmd_sym ?= SYM $@
cmd_sym ?= $(OBJDUMP) -t $< > $@
sym 命令分为“quiet_cmd_sym”和“cmd_sym”两个版本,这两个命令的功能都是一样的,区别在于 make 执行的时候输出的命令不同。quiet_cmd_xxx 命令输出信息少,也就是短命令,而 cmd_xxx 命令输出信息多,也就是完整的命令。那么Makefile中就会使用变量quiet来指向这两个版本中的其中一个,进而控制命令的输出形式- 如果变量 quiet 为空的话,整个命令都会输出。
如果变量 quiet 为“quiet_”的话,仅输出短版本。
如果变量 quiet 为“silent_”的话,整个命令都不会输出
静默输出
- 编译的时候使用“make -s”即可实现静默输出
实现源码
88 # If the user is running make -s (silent mode), suppress echoing of 89 # commands 90 91 ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4 92 ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),) 93 quiet=sil