Linux内核顶层Makefile的make过程说明一

一.  Linux内核源码的make编译

使用命令“make xxx_defconfig”配置好 Linux 内核以后就可以使用“make”或者“make all” 命令进行编译。

二.  Linux内核源码的make过程

使用命令“ make xxx_defconfig ”配置好 Linux 内核以后就可以使用“ make ”或者“ make all
命令进行编译。顶层 Makefile 有如下代码:
125 PHONY := _all
126 _all:
......
192 PHONY += all
193 ifeq ($(KBUILD_EXTMOD),)
194 _all: all
195 else
196 _all: modules
197 endif
......
608 all: vmlinux

126 行, _all 是默认目标,如果使用命令“ make ”编译 Linux 的话此目标就会被匹配。
193 行,如果 KBUILD_EXTMOD 为空的话 194 行的代码成立, 默认目标 _all 依赖 all
608 行,目标 all 依赖 vmlinux,所以接下来的重点就是 vmlinux

顶层 Makefile 中有如下代码:
905 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
906 export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y)
$(net-y)
907 export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
908 export LDFLAGS_vmlinux
909 # used by scripts/pacmage/Makefile
910 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinuxalldirs)) arch Documentation include samples scripts tools virt)
911
912 vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
913
914 # Final link of vmlinux
915 cmd_link-vmlinux = $(CONFIG_SHELL) $< $(LD) $(LDFLAGS)
$(LDFLAGS_vmlinux)
916 quiet_cmd_link-vmlinux = LINK $@
917
918 # Include targets which we want to
919 # execute if the rest of the kernel build went well.
920 vmlinux: scripts/link-vmlinux.sh $(vmlinux-deps) FORCE
921 ifdef CONFIG_HEADERS_CHECK
922 $(Q)$(MAKE) -f $(srctree)/Makefile headers_check
923 endif
924 ifdef CONFIG_SAMPLES
925 $(Q)$(MAKE) $(build)=samples
926 endif
927 ifdef CONFIG_BUILD_DOCSRC
928 $(Q)$(MAKE) $(build)=Documentation
929 endif
930 ifdef CONFIG_GDB_SCRIPTS
931 $(Q)ln -fsn `cd $(srctree) && /bin/pwd`/scripts/gdb/vmlinuxgdb.py
932 endif
933 +$(call if_changed,link-vmlinux)

上面的代码可以看出:

920 行,可以看出目标 vmlinux 依赖 scripts/link-vmlinux.sh、 $(vmlinux-deps)、 FORCE
第912 行定义了 vmlinux-deps ,值为:
vmlinux-deps= $(KBUILD_LDS) $(KBUILD_VMLINUX_INIT) $(KBUILD_VMLINUX_MAIN)
905 行, KBUILD_VMLINUX_INIT= $(head-y) $(init-y)
906 行, KBUILD_VMLINUX_MAIN = $(core-y) $(libs-y) $(drivers-y) $(net-y)
907 行, KBUILD_LDS= arch/$(SRCARCH)/kernel/vmlinux.lds ,其中 SRCARCH=arm ,因此, KBUILD_LDS= arch/arm/kernel/vmlinux.lds

综上所述,vmlinux 的依赖为:scripts/link-vmlinux.sh、$(head-y) 、$(init-y)、$(core-y) 、 $(libs-y) 、$(drivers-y) 、$(net-y)、arch/arm/kernel/vmlinux.lds 和 FORCE。

933 行的命令用于链接生成 vmlinux

下一篇重点来看一下 $(head-y) $(init-y) $(core-y) $(libs-y) $(drivers-y) $(net-y) 这六个变量的值。

猜你喜欢

转载自blog.csdn.net/wojiaxiaohuang2014/article/details/133135072