学习kbuild
1)顶层makefile禁用了内建的规则和内建变量。或者叫隐含规则。
make -rR
2) kduild中用到了很多FORCE,强制依赖执行。也就是依赖被认为永远是新的。
怎么做的目的是,对于编译选项的变更,是使用依赖无法感知的,所以必须强制执行。
所以也会用到很多if_changed_rule的函数。即检查依赖的更新又检查命令行参数的更新。
3)p14
静态模式规则
规则存在多个目标,并且不同的目标根据目标文件的名字来自动构造出依赖文件。
注意最终目的是自动构造依赖文件。
target:target-patten:prereq-pattern
从目标模式的名字中取出一部分字符串替代依赖模式中的相应部分来产生依赖文件。
如:
$(single-used-m): $(obj)/%.o: $(src)/%.c FORCE
4)make中如果命令行是以@开头的,则执行时不会回显此命令。
5)set -e 表示如果执行错误则会立即终止。以及使用了make -k (keep going)也不例外。
6)变量的替换引用
将变量中后缀字符串使用指定的字符串替换。
$(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE
$(call if_changed_dep,cc_o_c)
等同于
$(patsubst %.ko, %.mod.o,$(modules))
在字符串中找到%.ko替换为%.mod.o
注意变量替换的语法格式:
$(var: pattern=new_pattern)
所以$(@:_ksplice-revert_%=%)的作用是:
变量是%@,把_ksplice-revert_% 替换为%。
这回就能看明白.mod文件是怎么产生的了:
@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
就是{echo ext2.ko ; echo ext2.o;} > moddir/ext2.mod
$(o:=.KSPLICE)
这里没有提供pattern,所以就是匹配$(o:%=%.KSPLICE),就是直接在o后边加.KSPLICE
7)模式指定变量
相当于临时变量,只在某一个或者符合模式的目标中有效。
$(real-objs-m) : quiet_modtag := [M]
$(real-objs-m:.o=.i) : quiet_modtag := [M]
$(real-objs-m:.o=.s) : quiet_modtag := [M]
$(real-objs-m:.o=.lst): quiet_modtag := [M]
8)
vmlinux-dirs 规则会调用: make -f scripts/Makefile.build obj=
进行实际的编译
.vmlinux-dirs 伪目标是实现 descending down 的关键
prepare1 命令会建立目录 .tmp_versions/ ,该目录下保存所有
.mod ,用于模块编译的第二阶段
9)
$(modules): %.ko :%.o %.mod.o FORCE
$(call if_changed,ld_ko_o)
Static pattern规则,%.ko依赖于%.o和%.mod.o
$(modules:.ko=.mod.o): %.mod.o: %.mod.c FORCE
$(call if_changed_dep,cc_o_c)
Static pattern规则,%.mod.o依赖于%.mod.c
$(modules:.ko=.mod.c): __modpost ;
.mod.c依赖于__modpost
以 ext2.ko 为例,可以看出规则的建立: 变量 modules:= fs/ext2/ext2.ko 缺省规则
_modpost . _modpost 依赖目标为 __modpost 和 fs/ext2/ext2.ko , __modpost 依赖目标为
fs/ext2/ext2.o ,属于强制目标,会产生 fs/ext2/ext2.mod.c
10)vmlinux-dirs 实现递归的关键
$(vmlinux-dirs): prepare scripts
$(Q)$(MAKE) $(build)=$@
make -f scripts/Makefile.build obj=
进入dir目录进行编译。
在Makefile.build中,首先会include dir目录下的Kbuild,然后是Makefile。
在进加入的Makefile中定义了需要此目录需要编译的built-in,或者module。
如果还需要进入下一层:
$(subdir-ym):
$(Q)$(MAKE) $(build)=$@
阅读(2973) | 评论(0) | 转发(2) |