Linux内核里有makefile吗,对linux内核makefile的一点点研究

对linux内核makefile的一点点研究

包含CONFIG_EXT3_FS=y

等数据的文件include/config/auto.conf

---- include/linux/version.h ----

include $(srctree)/arch/$(SRCARCH)/Makefile

我们的ARCH为arm,所以

将包含进arch/arm/Makefile

而archprepare在这里有了第1依赖文件

archprepare: maketools

maketools: include/linux/version.h FORCE

然后将根据如下顺序,依次执行依赖检查[luther.gliethttp]

prepare3: include/config/kernel.release

prepare2: prepare3 outputmakefile

prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \

include/asm include/config/auto.conf

可以看到prepare1将依次检查依赖prepare2,

include/linux/version.h,include/linux/utsrelease.h

然后include/asm,最后是include/config/auto.conf

当prepare1执行完毕之后,随即archprepare的另一个依赖scripts_basic将被继续执行.

当archprepare所有依赖执行完毕之后,随即prepare0的命令将被执行

archprepare: prepare1 scripts_basic

prepare0: archprepare FORCE

$(Q)$(MAKE) $(build)=.

$(Q)$(MAKE) $(build)=. missing-syscalls

prepare: prepare0

而scripts/Makefile.build首先清除所有变量,然后include Kbuild

而我们可以看到$(builtin-target) $(lib-target) $(extra-y)全为空

同时$(obj-m) $(modorder-target)将因为$(obj-m),而只剩下$(modorder-target)

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \

$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \

$(subdir-ym) $(always)

所以翻译后为

__build: $(modorder-target) $(always)

$(modorder-target): $(subdir-ym) FORCE

$(Q)(cat /dev/null; $(modorder-cmds)) > $@

又因为./Kbuild包含内容为

bounds-file := include/linux/bounds.h

always  := $(bounds-file)

targets := $(bounds-file) kernel/bounds.s

offsets-file := include/asm/asm-offsets.h

always  += $(offsets-file)

targets += $(offsets-file)

targets += arch/$(SRCARCH)/kernel/asm-offsets.s

kernel/bounds.s: kernel/bounds.c FORCE

$(Q)mkdir -p $(dir $@)

$(call if_changed_dep,cc_s_c)

$(obj)/$(bounds-file): kernel/bounds.s Kbuild

$(Q)mkdir -p $(dir $@)

$(call cmd,bounds)

arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c \

$(obj)/$(bounds-file) FORCE

$(Q)mkdir -p $(dir $@)

$(call if_changed_dep,cc_s_c)

$(obj)/$(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s Kbuild

$(call cmd,offsets)

接下来就是检查依赖scripts的具体实现了

scripts: scripts_basic include/config/auto.conf

$(Q)$(MAKE) $(build)=$(@)

因为scripts/Makefile

包含了subdir-y += mod

同时kernel/scripts/Makefile.lib

subdir-ym := $(sort $(subdir-y) $(subdir-m))

又被添加到了subdir-ym变量中

在scripts/Makefile.build中就有定义了处理目标的规则了

$(subdir-ym):

$(Q)$(MAKE) $(build)=$@

而最终目标__build又依赖$(subdir-ym)

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \

$(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \

$(subdir-ym) $(always)

所以可以看到

make $(build)=mod

将被执行

ok上面的所有事情都做完之后,下面是vmlinux包含的所有dirs编译规则统一处理入口[luher.gliehtttp]

$(vmlinux-dirs): prepare scripts

$(Q)$(MAKE) $(build)=$@

比如

1. ARCH=arm make s3c6400_defconfig

2. ARCH=arm CROSS_COMPILE=arm-eabi- make

他默认的$(vmlinux-dirs)内容如下[luther.gliethttp]

init usr arch/arm/kernel arch/arm/mm arch/arm/common arch/arm/mach-s3c6400 arch/arm/mach-s3c6410 arch/arm/plat-s3c64xx arch/arm/plat-s3c arch/arm/vfp kernel mm fs ipc security crypto block drivers sound firmware net arch/arm/lib lib

include $(srctree)/arch/$(SRCARCH)/Makefile

即arch/arm/Makefile

zImage Image xipImage bootpImage uImage: vmlinux

$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

我们看看./Makefile

# vmlinux

#   ^

#   |

#   +-< $(vmlinux-init)

#   |   +--< init/version.o + more

#   |

#   +--< $(vmlinux-main)

#   |    +--< driver/built-in.o mm/built-in.o + more

#   |

#   +-< kallsyms.o (see description in CONFIG_KALLSYMS section)

vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o) FORCE

vmlinux.o: $(modpost-init) $(vmlinux-main) FORCE

$(call if_changed_rule,vmlinux-modpost)

阅读(5548) | 评论(1) | 转发(3) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值