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 根據這些變量 決定哪些
文件被編譯進內核 哪些文件被編譯成模塊 涉及哪些子目錄