文章目录
000-016
定义变量 prefix 和 src
由于输入的是:
make -f ./scripts/Makefile.build obj=scripts/basic
make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
第 8 行就是在“scripts/basic”或“scripts/kconfig ”中查找符合“tpl/%”的部分,然后将“tpl/”取消掉,但是“scripts/basic”或“scripts/kconfig ”没有“tpl/”,所以 src= “scripts/basic”或“scripts/kconfig ”即src=$(obj)$(patsubst <pattern>,<replacement>,<text>)
作用:
替换函数,用于在 text 中查找符合 pattern 的部分,如果匹配的话就用 replacement 替换掉。
参数:
pattenr 是可以包含通配符“%”,如果 replacement 中也包含通配符“%”,那么 replacement 中的这个“%”将是 pattern 中的那个“%”所代表的字符串。
返回值:
替换后的字符串。
017-018
Makefile.build 的默认目标和依赖
019-042
初始化 kbuild 文件中使用的所有相关变量
043-050
引用文件: include/config/auto.conf
引用文件:./include/autoconf.mk
引用文件: scripts/Makefile.uncmd_spl
引用文件: scripts/Kbuild.include
051-070
kbuild-dir = ./$(obj)
kbuild-file = ./$(obj)/Makefile
include ./$(obj)/Makefile
第55行:由000-016行可知,src=$(obj)
(obj=scripts/basic 或 scripts/kconfig),没有以“/”为开头的单词,所以最终kbuild-dir=./$(obj)
第56行:由于./$(obj)
里面没有kbuild文件存在,所以kbuild-file=./$(obj)/Makefile
071-100
默认目标 _build 的依赖与实现
第71行:引用 scripts/Makefile.lib 文件,编译时用到这个文件中是一些变量和函数。
第74-76行:由于第57行对./$(obj)/Makefile
的引用,这里$(hostprogs-y)
必定不为空,条件成立,最终会引用scripts/Makefile.host
,编译时用到这个文件中是一些变量和函数。
第78-80行:由前面可知 obj 已经定义并赋值了,这里条件不成立。
第84-86行:由第23-41行定义可知,strip返回值为空,这里条件不成立。
第88-90行:由第23-41行定义可知,strip返回值为空,这里条件不成立。
第96-99行:__build 是默认目标
,因为命令“make -f ./scripts/Makefile.build obj=scripts/basic”没有指定目标,所以会使用到默认目标:__build。在顶层 Makefile 中,第339-340行中KBUILD_MODULES =,KBUILD_BUILTIN = 1
,
$(strip STR)
作用:
去掉字符串中多余的空格符(若干单词,使用若干空字符分割)。
参数:
“STR”开头和结尾的空字符,并将其中多个连续空字符合并为一个空字符。
返回值:
无前导和结尾空字符、使用单一空格分割的多单词字符串。
例如:
STR = a b c LOSTR = $(strip $(STR)) 结果:a b c
100-152
一些变量的定义和赋值
第102-110行: KBUILD_CHECKSRC 未定义,所有为0,这里条件不成立。
第113-115行: CONFIG_DEBUG_SECTION_MISMATCH 未定义,这里条件不成立。
第121-125行:由于part-of-module
未定义,所有modkern_cflags = $(KBUILD_CFLAGS_KERNEL) $(CFLAGS_KERNEL),并且KBUILD_CFLAGS_KERNEL
和CFLAGS_KERNEL
也未定义,所以最终modkern_cflags为空。
第125行:empty
未定义,所以quiet_modtag为空。
第127-137行:由于part-of-module
和quiet_modtag
未定义,所以这里的目标没有依赖也为空。
第140-149行:由于basetarget
未定义,导致modname
为空,所以这里的目标没有依赖也为空。
第151-152行:定义quiet_cmd_cc_s_c
和cmd_cc_s_c
变量。
153-155
$(obj)/%.s : $(src)/%.c 的依赖与实现
第154行:由输入make -f ./scripts/Makefile.build obj=scripts/basic
和make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig
可知,这里的obj =scripts/basic
或scripts/kconfig
,由第007-015行可知,src =$(OBJ)
,所以这里src = scripts/basic
或scripts/kconfig
,其实这里最终目标是将scripts/basic
或scripts/kconfig
目录下的所有.c文件变成成.s文件,这里使用第155行的执行命令来完成。
第155行:调用if_changed_dep
函数(此函数定义在 scripts/Kbuild.include 文件中,在第47行引用此文件 [ include scripts/Kbuild.include ]),参数为cc_s_c
。
$(call VARIABLE, PARAM, PARAM,…)
作用:
用于实现对用户自己定义函数引用。在执行时,将它的参数“ PARAM”依次赋值给临时变量“ $(1)”、“ $(2)”(这些临时变量定义在“ VARIABLE”的值中)…… call 函数对参数的数目没有限制,也可以没有参数值,没有参数值的“ call”没有任何实际存在的意义。执行时变量“ VARIABLE”被展开为在函数上下文有效的临时变量,变量定义中的“ $(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“ ( 2 ) ”一样被赋值为函数的第二个参数值;依此类推(变量 (2)”一样被赋值为函数的第二个参数值;依此类推(变量 (2)”一样被赋值为函数的第二个参数值;依此类推(变量(0)代表变量“ VARIABLE”本身)。
返回值:
参数值“ PARAM”依次替换“ $(1)”、“ $(2)”…… 之后变量“ VARIABLE”定义的表达式的计算值。
156-162
$(obj)/%.i : $(src)/%.c 的依赖与实现
163-177
$(obj)/%.symtypes : $(src)/%.c 的依赖与实现
178-273
$(obj)/%.o: $(src)/%.c 的依赖与实现
: $(obj)/%.o: $(src)/%.c 的依赖与实现
第184-186行:由于CONFIG_MODVERSIONS
未定义,满足条件,进入。
第187-261行:由于CONFIG_MODVERSIONS
未定义,不满足条件,不进入。
第264-266行:由于第187-261行不进入,所以recordmcount_source
未定义,为空。
第270-273行:由于第187-261行不进入,所以recordmcount_source
未定义,为空。当同一个目标出现在多个双冒号规则中时,规则的执行顺序和普通规则的执行顺序一样,按照其在 Makefile 中的书写顺序执行。
274-281
$(obj)/%.lst: $(src)/%.c 的依赖与实现
282-295
$(obj)/%.s: $(src)/%.S 的依赖与实现
296-301
$(obj)/%.o: $(src)/%.S 的依赖与实现
302-305
targets 变量赋值
306-314
$(obj)/%.lds: $(src)/%.lds.S 的依赖与实现
315-323
$(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/tools/asn1_compiler 的依赖与实现
324-329
对 $(subdir-obj-y) 和 $(subdir-ym) 变量内容进行排序
330-345
$(builtin-target): $(obj-y) 的依赖与实现
由于没有定义builtin-target
变量,所以这里条件不成立
346-358
$(modorder-target): $(subdir-ym) 的依赖与实现
359-371
$(lib-target): $(lib-y) 的依赖与实现
由于这里没有定义lib-target
变量,所以这里条件不成立。
372-399
执行 multi_depend 命令
400-413
追加 targets 目标内容
414-444
默认目标的追加和设置为伪目标