1. make menuconfig配置结果
生成.config
2. 配置解析(以网卡DM9000 为例)
打开.config文件,发现该文件是由以CONGIG_XXX
形式的配置项组成的。
找到CONFIG_DM9000=y
行,CONFIG_DM9000
为一个配置项,=y
表示编译进内核,=m
表示编译成模块,没有配置显示CONFIG_DM9000 is not set
。
Q1:配置项CONFIG_DM9000的用途?
我们在内核目录中查找:grep "CONFIG_DM9000" * -nrw
发现以下文件中含有CONFIG_DM9000
:
c源码中的CONFIG_DM9000
子目录Makefile中的CONFIG_DM9000
include目录中的CONFIG_DM9000
可以看到,CONFIG_DM9000
是include/linux/autoconf.h
中的一个宏定义,从名字可以看出该文件是自动生成的,它由执行make
或make uImage
时根据.config
文件生成的,定义为#define CONFIG_DM9000 = 1
。
也就是说不论.config
中定义CONFIG_DM9000=y
或CONFIG_DM9000=m
,autoconf.h
中始终=1
,该头文件将给c源码中使用(见图1)。
Q2:.config
文件中的配置项CONFIG_DM9000=y
或CONFIG_DM9000=m
在内核文件中如何体现呢?
在子目录Makefile中(见图1),obj -$(CONFIG_DM9000) +=dm9000.o
, 根据配置项obj -y +=dm9000.o
则该驱动编译进内核;obj -m +=dm9000.o
则该驱动编译为模块,生成xxx.ko。
可以看到,根据.config
文件,make
或make uImage
时,分别生成:
include/linux/autoconf.h
,该头文件中定义宏CONFIG_DM9000
,被内核c源码使用。
include/config/auto.conf
,该文件被顶级Makefile包含,作为子目录Makefile的参数,用来指示构建系统编译进内核还是模块。
Makefile 语法 tips:
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值
1、
“=”,make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
2、
“:=”,表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。