内核Makefile编译的过程的学习之 Makefile
时间:10-02
整理:3721RD
点击:
1. make menuconfig
该命令完成的工作 : 生成 .condig 文件
将menuconfg'的配置项全部列在该文件中
2. make
该命令完成的工作 :生成/include/config/auto.conf
将.config中的配置为编进内核或模块的选项定义在这里
如 CONFIG_SMDK2440_CPU2440=y
该文件被包含于 顶层Makefile中
生成/include/linux/autoconf.h
将.config中的配置为编进内核或模块的选项宏定义在这里
如 #define CONFIG_SMDK2440_CPU2440 1
3. 顶层Makefile
顶层Makefile决定哪些子目录被编译进vmlinux镜像
# Objects we will link into vmlinux / subdirs we need to visit
init-y := init/
drivers-y := drivers/ sound/
net-y := net/
libs-y := lib/
core-y := usr/
562 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
同时顶层Makefile中包含arch/arm/Makefile所以该目录也被编译进内核
理解时可以将该目录看成顶层目录看待 Makefile 也看成顶层Makefile
arch/arm/Makefile 内容如下
94 head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
172 core-y += $(MACHINE)
173 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2400/
174 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2412/
175 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2440/
176 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2442/
177 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2443/
libs-y := arch/arm/lib/ $(libs-y)
这里的 CONFIG_ARCH_S3C2410 就是在/include/config/auto.conf 中定义
编译内核时 将依次进入 init——y core——y libs——y driver——y net——y所列的目录中执行
他们的Makefile 每个子目录生成 built-in.o(lib-y 目录中可能生成lib.a)
最后 head-y 所表示的文件和这些 built-in.o lib.a 一起 链接成 vmlinux
4. 子目录下的Makefile
各子目录下的 Makefile 决定该目录下的哪些文件编译进内核或模块 进入哪些子目录的
内容如下 以/net/Makefile为例
obj-y := nonet.o
obj-$(CONFIG_NET) := socket.o core/
tmp-$(CONFIG_COMPAT) := compat.o
obj-$(CONFIG_NET) += $(tmp-y)
这里的CONFIG_NET 也是在auto.conf里定义
可知 obj -y和 lib-y 同时决定编译哪些文件 进入哪些子目录
5.总结
.config 中定义了一系列的变量 Makefile 根据这些变量 决定哪些
文件被编译进内核 哪些文件被编译成模块 涉及哪些子目录
该命令完成的工作 : 生成 .condig 文件
将menuconfg'的配置项全部列在该文件中
2. make
该命令完成的工作 :生成/include/config/auto.conf
将.config中的配置为编进内核或模块的选项定义在这里
如 CONFIG_SMDK2440_CPU2440=y
该文件被包含于 顶层Makefile中
生成/include/linux/autoconf.h
将.config中的配置为编进内核或模块的选项宏定义在这里
如 #define CONFIG_SMDK2440_CPU2440 1
3. 顶层Makefile
顶层Makefile决定哪些子目录被编译进vmlinux镜像
# Objects we will link into vmlinux / subdirs we need to visit
init-y := init/
drivers-y := drivers/ sound/
net-y := net/
libs-y := lib/
core-y := usr/
562 core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
同时顶层Makefile中包含arch/arm/Makefile所以该目录也被编译进内核
理解时可以将该目录看成顶层目录看待 Makefile 也看成顶层Makefile
arch/arm/Makefile 内容如下
94 head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
core-y += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
172 core-y += $(MACHINE)
173 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2400/
174 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2412/
175 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2440/
176 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2442/
177 core-$(CONFIG_ARCH_S3C2410) += arch/arm/mach-s3c2443/
libs-y := arch/arm/lib/ $(libs-y)
这里的 CONFIG_ARCH_S3C2410 就是在/include/config/auto.conf 中定义
编译内核时 将依次进入 init——y core——y libs——y driver——y net——y所列的目录中执行
他们的Makefile 每个子目录生成 built-in.o(lib-y 目录中可能生成lib.a)
最后 head-y 所表示的文件和这些 built-in.o lib.a 一起 链接成 vmlinux
4. 子目录下的Makefile
各子目录下的 Makefile 决定该目录下的哪些文件编译进内核或模块 进入哪些子目录的
内容如下 以/net/Makefile为例
obj-y := nonet.o
obj-$(CONFIG_NET) := socket.o core/
tmp-$(CONFIG_COMPAT) := compat.o
obj-$(CONFIG_NET) += $(tmp-y)
这里的CONFIG_NET 也是在auto.conf里定义
可知 obj -y和 lib-y 同时决定编译哪些文件 进入哪些子目录
5.总结
.config 中定义了一系列的变量 Makefile 根据这些变量 决定哪些
文件被编译进内核 哪些文件被编译成模块 涉及哪些子目录
可以连载写你的学习
求e币 大家回复下吧