linux内核makefile文件分类
名称 | 描述 |
---|---|
顶层makefile | 它是所有makefile文件的核心,从总体上控制着内核的编译、连接 |
.config | 配置文件,在配置内核时生成。所有makefile文件(包括顶层目录及各级子目录)都是根据.config来决定使用那些文件 |
arch/$(ARCH)/Makefile | 对于体系结构的makefile,它用来决定那些体系结构相关的文件参与内核的生成,并提供一些规则来生成特定格式的内核映像 |
scripts/Makefile.* | Makefile共用的通用规则、脚本等 |
kbuild Makefiles | 各级子目录下的Makefile,它们相对简单,被上一层Makefile调用来编译当前目录下的文件 |
分析makefile从顶层开始,顺藤摸瓜的分析下去,会涉及到所有的makefile文件。各级子目下的makefile完成的动作obj -y = obj -m = make uImage时,uImage在arch/arm/makefile中,顶层makefile中一定包含了底层的makefile。
systemlinux-2.6.22.6linux-2.6.22.6driverschar目录下的makefile
代码语言:javascript复制/*-y表示后面的内容会被编译进内核*/
obj-y = mem.o random.o tty_io.o n_tty.o tty_ioctl.o
/*-m表示后面的内容会被编译成模块*/
obj-m = s3c24xx_leds.o
/*a.c,b.c编译成一个模块,ab.ko*/
obj -m = ab.o
ab -objs :=a.o b.o
.config会生成auto config.h和auto.conf两个文件
代码语言:javascript复制/*顶层makefile已经包含了*/
-include include/config/auto.conf
systemlinux-2.6.22.6linux-2.6.22.6 目录下的makefile
代码语言:javascript复制/*uIamge其实时一个头部。真正的linux在后面vmlinux*/
zImage Image xipImage bootpImage uImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
/*vmlinux的依赖*/
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
/*各部分如下*/
vmlinux-init := $(head-y) $(init-y)
/*archarmmakefile中定义了head-y*/
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
/*linux-2.6.22.6makefile*/
/*init目录下所有涉及的文件会编译成built-in.o*/
init-y := init/
init-y := $(patsubst %/, %/built-in.o, $(init-y))
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
/*linux-2.6.22.6makefile*/
/*core-y = usr/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o*/
core-y := usr/
core-y = kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y := $(patsubst %/, %/built-in.o, $(core-y))
/*所有目录涉及的文件都会编译成built-in.o libs-y= lib/lib.a lib/built-in.o*/
libs-y := lib/
libs-y := $(libs-y1) $(libs-y2)
libs-y1 := $(patsubst %/, %/lib.a, $(libs-y))
libs-y2 := $(patsubst %/, %/built-in.o, $(libs-y))
/*所有目录涉及的文件都会编译成built-in.o drivers-y := drivers/built-in.o sound/built-in.o*/
drivers-y := drivers/ sound/
/*所有目录涉及的文件都会编译成built-in.o net-y := net/built-in.o*/
net-y := net/
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
/*以上这些原材料如何编译进内核?直接编译内核可以看出来*/
/*第一个文件:arch/arm/kernel/head.o*/
/*链接脚本:arch/arm/kernel/vmlinux.lds*/
arm-linux-ld-EL -p--no-undefined-X-o vmlinux
/*lds决定原材料的排布*/
-T arch/arm/kernel/vmlinux.lds
/*原材料*/
arch/arm/kernel/head.o arch/arm/kernel/init task.o
init/built-in.o
-start-group usr/built-in.o arch/arm/kernel/built-
in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-
s3c2443/built-in.o arch/arm/nwfpe/built-in.o arch/arm/plat-s3c24xx/built-in.o kernel/built-in.o mm/built-in.o fs/built-
in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o net/built-in.o--end-group.tmp kallsyms2.o
顶层makefile的包含代码
代码语言:javascript复制/*包含到顶层目录*/
include $(srctree)/arch/$(ARCH)/Makefile
ARCH ?=arm