Linux内核Makefile笔记
周亦行
2014年11月
参考文档
① linux源码Makefile的详细分析
② if_changed_rule/cc_o_c/any-prereq/arg-check
③ Makefile中的伪目标
④ Linux kernel 3.18.5
一、Makefile组成
(一)基本组成
- 顶层 Makefile
它是所有Makefile文件的核心,从总体上控制着内核的编译、连接 - arch/$(ARCH)/Makefile
对应体系结构的Makefile,它用来决定哪些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像 - scripts/Makefile.*
Makefile公用的通用规则、脚本等 - 子目录kbuild Makefiles
各级子目录的Makefile相对简单,被上一层Makefile.build调用来编译当前目录的文件。 - 顶层.config
配置文件,配置内核时生成。所有的Makefile文件(包括顶层目录和各级子目录)都是根据.config来决定使用哪些文件的
(二)通用规则 - Makefile.build
被顶层Makefile所调用,与各级子目录的Makefile合起来构成一个完整的Makefile文件,定义built-in.o、.lib以及目标文件.o的生成规则。这个Makefile文件生成了子目录的.lib、built-in.o以及目标文件.o - Makefile.clean
被顶层Makefile所调用,用来删除目标文件等 - Makefile.lib
被Makefile.build所调用,主要是对一些变量的处理,比如说在obj-y前边加上obj目录 - Kbuild.include
被Makefile.build所调用,定义了一些函数,如if_changed、if_changed_rule、echo-cmd
(三)总结 - Linux内核Makefile体系核心的Makefile文件就两个:顶层Makefile、scripts/Makefile.build。
- 子目录中的Makefile、kbuild不是Makefile文件(完整的Makefile文件),只能算作是Makefile的包含文件。
- 顶层Makefile文件负责将各个目录生成的*.built-in.o、lib.a等文件连接到一起。而scripts/Makefile.build
包含子目录中的Makefile文件来生成这些*.built-in.o、lib.a、*.o等文件。
二、内核编译
以s3c6400编译uImage过程为例。一般来说内核的编译过程为
make ARCH=arm s3c6400_defconfig
make ARCH=arm menuconfig
make ARCH=arm -j2 CROSS_COMPILE=arm-linux-gnueabihf- uImage
三、目标文件
编译uImage,自然uImage就是目标文件。内核配置完成后,在顶层目录开始编译内核。但是,uImage却不是在顶层Makefile中定义,而是在arch/$(ARCH)/Makefile中定义。
顶层Makefile文件
534 include $(srctree)/arch/$(SRCARCH)/Makefile
SRCARCH := $(ARCH),即该变量等于架构名称,s3c6400为arm架构。
arch/arm/Makefile文件
300 BOOT_TARGETS = zImage Image xipImage bootpImage uImage
305 $(BOOT_TARGETS): vmlinux
306 $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
uImage依赖vmlinux。通过$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
指令编译生成。
- Q的定义:选择静态编译与否(是否打印编译信息)
顶层Makefile文件:
75 ifeq ($(KBUILD_VERBOSE),1)
76 quiet =
77 Q =
78 else
79 quiet=quiet_
80 Q = @
81 endif
- build:值为“-f scripts/Makefile.build
obj=”实际上就是调用子Makefile–scripts/Makefile.build,然后传递参数目标文件夹。
顶层Makefile文件
352 include $(srctree)/scripts/Kbuild.include
通过include的方式添加Kbuild.include文件。
Kbuild.include文件
170 ###
171 # Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
172 # Usage:
173 # $(Q)$(MAKE) $(build)=dir
174 build := -f $(srctree)/scripts/Makefile.build obj
四、依赖推导
(一)依赖Vmlinux
顶层Makefile文件
897 # Externally visible symbols (used by link-vmlinux.sh)
898 export KBUILD_VMLINUX_INIT := $(head-y) $(init-y)
899 export KBUILD_VMLINUX_MAIN := $(core-y) $(libs-y) $(drivers-y) $(net-y)
900 export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
901 export LDFLAGS_vmlinux
902 # used by scripts/pacmage/Makefile
903 export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) arch Documentation include samples scripts tools