1. origin
- # To put more focus on warnings, be less verbose as default
-
# Use 'make V=1' to see the full commands
-
ifdef V
-
ifeq ("$(origin V)", "command line")
-
KBUILD_VERBOSE = $(V)
-
endif
-
endif
-
ifndef KBUILD_VERBOSE
-
KBUILD_VERBOSE =0
-
endif
代码中注释的意思是,为了能将精力集中在警告信息上面,默认上不输出详细而显得冗余的编译信息,如果想看到完整的命令执行情况,可以在 make 时使用参数 V=1 。
下面根据代码分析这 4 个符号的作用,实际上它们和 C 语言中的意思是一样的。
- ifdef V 表示如果 V 变量被定义过,那么会执行下面的 ifeq 语句。V 变量的定义来源可以有不同,如在文件中定义,在命令行中定义,在环境变量中定义等。
-
- ifeq ("$(origin V)", "command line") 表示若 V 是在命令行里已被定义,那么执行下面的 KBUILD_VERBOSE = $(V) 语句。也就是说,ifeq 用以判断后面括号里的两个值是否相等,如果相等则执行下面的语句。如果不相等,则不执行。关于 origin 函数的用法见:
2. ?= /:=
- KBUILD_EXTMOD ?= $(SUBDIRS)
- KBUILD_EXTMOD := $(M)
- PHONY := _all
如果操作符“?=”前面的变量KBUILD_EXTMOD没有定义过,那么就将SUBDIRS赋给KBUILD_EXTMOD; 在使用“:=”定义变量时,变量值中对另外变量的引用或者函数的引用在定义时被展开(对变量进行替换)而=是在使用时才进行替换
- 举例:
-
CFLAGS = $(include_dirs) -O
-
include_dirs = -Ifoo -Ibar
-
“CFLAGS”会在命令中被展开为“-Ifoo -Ibar -O”
-
CFLAGS := $(include_dirs) -O
-
include_dirs := -Ifoo -Ibar
-
由于在变量“include_dirs”的定义出现在“CFLAGS”定义之后。因此在“CFLAGS”的定义中,
-
“include_dirs”的值为空。“CFLAGS”的值为“-O”而不是“-Ifoo -Ibar -O”。
3. if
- $(if $(KBUILD_OUTPUT),, \
-
$(error output directory "$(saved-output)" does not exist))
函数if对在函数上下文中扩展条件提供了支持(相对于GNU make makefile文件中的条件语句,例如ifeq指令。)函数的语法是:$(if ,) 或是 $(if ,,)。如果条件$(KBUILD_OUTPUT)为真(非空字符串),那么两个逗号之间的空字符(注意连续两个逗号的作用)将会是整个函数的返回值,如果$(KBUILD_OUTPUT)为假(空字符串),那么$(error output directory "$(saved-output)" does not exist)会是整个函数的返回值。此时如果没有被定义,那么,整个函数返回空字串。
函数error的语法是:$(error ;)。 函数error的功能是:产生一个致命的错误,output directory "$(saved-output)" does not exist是错误信息。注意,error函数不会在一被使用就会产生错误信息,所以如果你把其定义在某个变量中,并在后续的脚本中使用这个变量,那么也是可以的。
命令“$(if $(KBUILD_OUTPUT),, \”中最后的“\”的作用是:紧接在“\”下面的“哪一行”的命令是“\”所在行的命令的延续。4. flter-out
- $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
反过滤函数——filter-out,语法是:$(filter-out ;,;), 函数filter-out的功能是:去掉$(MAKECMDGOALS)中符合规则_all的所有字符串后,剩下的作为返回值。
函数filter-out调用与伪目标_all在同一行。伪目标_all下面的以tab开头的三行是命令,因为每行最后都有"\",所以这三行命令应该是写在同一行的,即后面的命令要受到处于它之前的那些命令的影响。5. :1= $(KBUILD_VERBOSE:1=)为变量替换,如果为1就替换为空。
6. %:: FORCE
$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
#从代码中可以看出,这里使用了一个双冒号的模式匹配规则。
#百分号代表任何目标都使用这个规则,其中
#$(srctree) 为内核代码树所在目 录 , KBUILD_SRC 定义为空 。
#所以如果 make 命令为 : make s3c2410_defconfig all
#那么构建系统就会分别执行下面两条命令:
#make -C $(srctree) KBUILD_SRC= s3c2410_defconfig
#make -C $(srctree) KBUILD_SRC= all
#这其实和简单的用手动的输入两条连续命令
#(make s3c2410_defconfig 和 make all) 是一样效果的。
- %config: scripts_basic outputmakefile FORCE
%config 跟 “make menuconfig”匹配
阅读(1028) | 评论(0) | 转发(0) |