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 了。