|
kbuild系统主要涉及几个文件。
Makefile:内核源代码顶层目录的Makefile文件。
scripts/Makefile.build:通常在进行递归make时会用到的Makefile文件。
scripts/Makefile.host:如果需要生成可执行文件时会用到的文件。例如:在编译内核之前需要配置内核,此时会编译生成配置程序,在这个过程中会用到这个文件。
scripts/Kbuild.include:可以看作是kbuild系统的头文件。定义了一些常用的变量。其中有一个变量很重要:build。
scripts/Makefile.lib:这个文件里主要也是定义了一些变量。
scripts/Makefile.modinst:在安装模块时会用到的文件。
除此之外还有一些文件,他们的作用我还没有完全研究透。
scripts/Makefile.build会通过include指令引用 scripts/Makefile.host 、 scripts/Kbuild.include 、 scripts/Makefile.lib 、 scripts/Makefile.modinst 等文件。
以下是scripts/Makefile.build的部分代码:
# 引用scripts/Kbuild.include
include scripts/Kbuild.include
# 在递归时引用子目录的Kbuild(如果存在的话)或者Makefile文件
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)
# 引用Makefile.lib文件
include scripts/Makefile.lib
# 如果在上步“include $(kbuild-file)”时发现引用的文件中含有 hostprogs-y 或者 hostprogs-m 变量,则引用scripts/Makefile.host 文件,在 scripts/Makefile.host 文件中有编译生成可执行文件的相关规则
ifneq ($(hostprogs-y)$(hostprogs-m),)
include scripts/Makefile.host
endif
# 以下两个规则就是用来编译目标文件的,需要说明的是变量src和obj的值是相同的,因为在 scripts/Makefile.build 的第一行就有“src := $(obj)”而且我还没有发现能使src和obj值不同的代码。但是尽管他们的值相同,但由于有 VPATH 变量存在——在顶层Makefile文件中输出了该变量,所以源文件的目录和目标文件的目录可能不同。但这仅仅是在编译内核时,因为编译内核时可以使用O变量来指定输出目录;而在编译外部模块时,src和obj是指的同一个目录,目前我还没有找到在编译外部模块时能使src和obj不同的方法
# Built-in and composite module parts
$(obj)/%.o: $(src)/%.c FORCE
$(call cmd,force_checksrc)
$(call if_changed_rule,cc_o_c)
# Single-part modules are special since we need to mark them in $(MODVERDIR)
$(single-used-m): $(obj)/%.o: $(src)/%.c FORCE
$(call cmd,force_checksrc)
$(call if_changed_rule,cc_o_c)
@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
|
|