2.2 Linux内核配置分析 笔记

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
图3

可以看到,CONFIG_DM9000include/linux/autoconf.h中的一个宏定义,从名字可以看出该文件是自动生成的,它由执行makemake uImage时根据.config文件生成的,定义为#define CONFIG_DM9000 = 1
也就是说不论.config中定义CONFIG_DM9000=yCONFIG_DM9000=mautoconf.h中始终=1,该头文件将给c源码中使用(见图1)。

Q2:.config文件中的配置项CONFIG_DM9000=yCONFIG_DM9000=m在内核文件中如何体现呢?

在子目录Makefile中(见图1),obj -$(CONFIG_DM9000) +=dm9000.o, 根据配置项obj -y +=dm9000.o则该驱动编译进内核;obj -m +=dm9000.o则该驱动编译为模块,生成xxx.ko。

可以看到,根据.config文件,makemake 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 了。

你可能感兴趣的:(JZ2440开发板)