kbuild Makefile的优先级

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值