我们知道make menuconfig的菜单是在.config文件中查找配置
里面有很多配置项为y(加入配置)、m(以模块形式加入,如有一些驱动)。像我们的DM9000(网卡)就是配置为y
我们随便搜一个配置,如CONFIG_DM9000,grep "CONFIG_DM9000" * -nwR
会发现这四个文件
-
(c源码)arch/arm/mach-at91/board-sam9261ek.c:79:#if defined(CONFIG_DM9000)
-
(子目录makefile)drivers/net/Makefile:197:obj-$(CONFIG_DM9000) += dm9dev9000c.o
-
include/config/auto.conf:143:CONFIG_DM9000=y
-
include/linux/autoconf.h:144:#define CONFIG_DM9000 1
c文件中使用到了CONFIG_DM9000的宏,那么这个宏是在哪里定义,显然对于c语言,宏只能在c文件或者h文化定义。是在include/linux/autoconf.h:144:#define CONFIG_DM9000 1中定义。这里我们可以猜测include/linux/autoconf.h是自动生成的,内容来源与.config。autoconf.h里面的内容都是1。就是说不管配置项是y还是m,最后生成的autoconf.h里都被定义为1
(autoconf.h)
那么y和m的差别体现在哪里呢——子目录的Makefile中
这里的意思是obj -$(CONFIG_DM9000)的值编译成dm9dev9000c.o。
显然$(CONFIG_DM9000)可能是有分y和m的,在include/config/auto.conf中被定义,果然,里面有m和y的定义
(auto.conf)
到现在我们知道了,y和m的差别在子目录的Makefile中体现
obj -y +=xxx.o (编译进内核里去)
obj -m +=xxx.o(最后会被编译成可加载模块xxx.ko)
还可以知道这两个文件
include/config/auto.conf:143:CONFIG_DM9000=y(被子目录Makefile用到)
include/linux/autoconf.h:144:#define CONFIG_DM9000 1(被c函数用到)
都是由.config生成的
下一节进入分析内核的Makefile