===介紹
有4 個不同的configuration programs 是使用 Config Language︰
scripts/Configure make config, make oldconfig
scripts/Menuconfig make menuconfig
scripts/tkparse make xconfig
mconfig ftp.kernel.org/pub/linux/kernel/people/hch/mconfig/
本文主要介紹 Menuconfig
=== 說明
一個 Config Language script 是一個陳列式的述語. 有 21 個簡單的述語;
一個 'if' 述語; menu 區塊; 跟一個 'source' 述語.
'\' 用 來連續每行結尾到下一行
'#' 通常表示後面是解釋
每新的一行都是另外一個意義. 你可以用分號來代替換行.
下面是基本的文法結構.
/prompt/ 顯示給使用這看的文字 主要用一個單引號(') 或一雙引號(")所括含的字串.
EX: 若 kk=tt
' kk=$kk' ==> kk=$kk
" kk=$kk" ==> kk=$tt
/word/ 是一個預設值.可以用 $變數 來代替.
/symbol/ 表示一個參數設定 以 CONFIG_* 帶頭. scripts/mkdep.c
參數設定會存在 include/linux/autoconf.h.
/dep/ 相依性選項 合法值為 "y", "m", "n", or "".
/expr/ 是 bash-like 表達式 使用如
'=', '!=', '-a', '-o', and '!'.
下面是全部的述語:
正文述語:
mainmenu_name /prompt/
表示最上層的標題
Configure: ignores this line
Menuconfig: ignores this line
Xconfig: uses /prompt/ for the label window.
mconfig: ignores this line (mconfig does a better job without it).
Example:
# arch/sparc/config.in
mainmenu_name "Linux/SPARC Kernel Configuration"
comment /prompt/
表示選單上的標題
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# drivers/net/Config.in
comment 'CCP compressors for PPP are only built as modules.'
text /prompt/
後接文字 主要在 mconfig中 做HELP 註解用
Menuconfig: 不支援
Example:
# mconfig internal help text
text 'Here are all the mconfig command line options.'
詢問述語:
bool /prompt/ /symbol/ /symbol/
接受使用者的設定值 合法值為 "n" 跟 "y"
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# arch/i386/config.in
bool 'Symmetric multi-processing support' CONFIG_SMP
hex /prompt/ /symbol/ /word/
/symbol/=/word/ 是一個16進制的值
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# drivers/sound/Config.in
hex 'I/O base for SB Check from manual of the card' CONFIG_SB_BASE 220
int /prompt/ /symbol/ /word/
/symbol/=/word/ 是一個10進制的值
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# drivers/char/Config.in
int 'Maximum number of Unix98 PTYs in use (0-2048)' \
CONFIG_UNIX98_PTY_COUNT 256
string /prompt/ /symbol/ /word/
/symbol/=/word/ 是一個字串
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# drivers/sound/Config.in
string ' Full pathname of DSPxxx.LD firmware file' \
CONFIG_PSS_BOOT_FILE /etc/sound/dsp001.ld
tristate /prompt/ /symbol/
/symbol/=使用者輸入的值 "n", "m", "y" ,"m" 表 "module" ,只有在 CONFIG_MODULES = "y" 才有效
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# fs/Config.in
tristate 'NFS filesystem support' CONFIG_NFS_FS
定義述語:
define_bool /symbol/ /word/
定義 /symbol/=/word/ 通常為 "n" 或 "y" 而為了相容性 若define_tristate 有支援 則"m" 也可使用
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# arch/alpha/config.in
if [ "$CONFIG_ALPHA_GENERIC" = "y" ]
then
define_bool CONFIG_PCI y
define_bool CONFIG_ALPHA_NEED_ROUNDING_EMULATION y
fi
define_hex /symbol/ /word/
定義 /symbol/=/word/ 一個16進制的值
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# Not from the corpus
bool 'Specify custom serial port' CONFIG_SERIAL_PORT_CUSTOM
if [ "$CONFIG_SERIAL_PORT_CUSTOM" = "y" ]; then
hex 'Serial port number' CONFIG_SERIAL_PORT
else
define_hex CONFIG_SERIAL_PORT 0x3F8
fi
define_int /symbol/ /word/
定義 /symbol/=/word/ 一個10進制的值
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# drivers/char/ftape/Config.in
define_int CONFIG_FT_ALPHA_CLOCK 0
define_string /symbol/ /word/
定義 /symbol/=/word/ 一個字串
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example
# Not from the corpus
define_string CONFIG_VERSION "2.2.0"
define_tristate /symbol/ /word/
定義 /symbol/=/word/ 一個合法的輸入值 為 "n", "m", 跟 "y"
Configure: Menuconfig: Xconfig: mconfig: 全部支援
Example:
# drivers/video/Config.in
if [ "$CONFIG_FB_AMIGA" = "y" ]; then
define_tristate CONFIG_FBCON_AFB y
define_tristate CONFIG_FBCON_ILBM y
else
if [ "$CONFIG_FB_AMIGA" = "m" ]; then
define_tristate CONFIG_FBCON_AFB m
define_tristate CONFIG_FBCON_ILBM m
fi
fi
依賴述語:
dep_bool /prompt/ /symbol/ /dep/ ... 只有 /dep/ 全為"y" 才成立
Configure: Menuconfig: Xconfig: mconfig: 全部支援
EX:
dep_bool ' Set version information on all module symbols' CONFIG_MODVERSIONS $CONFIG_MODULES
dep_mbool /prompt/ /symbol/ /dep/ ... 只有 /dep/ 全為"y" or "m"才成立
Configure: Menuconfig: Xconfig: mconfig: 全部支援
EX:
dep_mbool 'Packet socket: mmapped IO' CONFIG_PACKET_MMAP $CONFIG_PACKET
dep_hex /prompt/ /symbol/ /word/ /dep/ ... 不支援
dep_int /prompt/ /symbol/ /word/ /dep/ ... 不支援
dep_string /prompt/ /symbol/ /word/ /dep/ ... 不支援
作者還沒想到在怎做
dep_tristate /prompt/ /symbol/ /dep/ ... 只有 /dep/ 全為"y" 才成立
Configure: Menuconfig: Xconfig: mconfig: 全部支援
EX:
dep_tristate ' Support for SA11x0 USB network link function' CONFIG_SA1100_USB_NETLINK $CONFIG_SA1100_USB
未設定述語:
unset /symbol/ ...
選擇述語:
choice /prompt/ /word/ /word/ 選單 在 /prompt/文字後接 ""所括住的選單
Configure: Menuconfig: Xconfig: mconfig: 全部支援
EX:
choice 'ARM system type' \
"Anakin CONFIG_ARCH_ANAKIN \
Archimedes/A5000 CONFIG_ARCH_ARCA5K \
Cirrus-CL-PS7500FE CONFIG_ARCH_CLPS7500 \
CLPS711x/EP721x-based CONFIG_ARCH_CLPS711X \
Co-EBSA285 CONFIG_ARCH_CO285 \
EBSA-110 CONFIG_ARCH_EBSA110 \
Excalibur-ARM CONFIG_ARCH_CAMELOT \
FootBridge CONFIG_ARCH_FOOTBRIDGE \
Integrator CONFIG_ARCH_INTEGRATOR \
Omaha CONFIG_ARCH_OMAHA \
LinkUp-L7200 CONFIG_ARCH_L7200 \
Motorola-MX1ADS CONFIG_ARCH_MX1ADS \
RiscPC CONFIG_ARCH_RPC \
RiscStation CONFIG_ARCH_RISCSTATION \
SA1100-based CONFIG_ARCH_SA1100 \
Shark CONFIG_ARCH_SHARK \
AT91RM9200-based CONFIG_ARCH_AT91RM9200 \
FIC81XX-based CONFIG_ARCH_FIC81XX " RiscPC
nchoice /prompt/ /symbol/ /prompt/ /symbol/ ...
Menuconfig: 支援 其他都不支援
假設述語:
if [ /expr/ ] ; then
/statement/
...
fi
Configure: Menuconfig: Xconfig: mconfig: 全部支援
但 Xconfig 有些bug
if [ "$CONFIG_ARCH_EP7211" = "y" -o \
"$CONFIG_ARCH_EP7212" = "y" ]; then
bool ' EP72xx ROM boot' CONFIG_EP72XX_ROM_BOOT
fi
if [ /expr/ ] ; then
/statement/
...
else
/statement/
...
fi
if [ "$CONFIG_ARCH_P720T" = "y" ]; then
define_bool CONFIG_ARCH_EP7212 y
else
define_bool CONFIG_ARCH_EP7212 n
fi
選單區塊:
mainmenu_option next_comment
comment /prompt/
/statement/
...
endmenu
Configure: Menuconfig: Xconfig: mconfig: 全部支援
ex;
mainmenu_option next_comment
comment 'Code maturity level options'
bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL
bool 'Prompt for obsolete code/drivers' CONFIG_OBSOLETE
endmenu
來源述語:
source /word/
讀取其他的cinfig.in設定檔
Configure: implemented (run time)
Menuconfig: implemented (parse time)
Xconfig: implemented (parse time)
mconfig: implemented (parse time)
ex;
source drivers/parport/Config.in
讀取 parallel port設定檔
.....
mainmenu_option next_comment
comment 'Parallel port support'
.....
tristate 'Parallel port support' CONFIG_PARPORT
if [ "$CONFIG_PARPORT" != "n" ]; then
.....
相關檔案
1.Makefile
make menuconfig 啟動 menuconfig
啟動流程如下
menuconfig: include/linux/version.h symlinks
$(MAKE) -C scripts/lxdialog all
$(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in
2.sh
linux.2.4.27/scripts/Menuconfig
這個是Config Language 主要的 shell script 執行檔
linux-2.4.24/scripts/lxdialog/...
這個裡面的檔案 在產生menucofig 選單的程式
3.config.in
linux-2.4.27/arch/arm/config.in
menuconfig 設定檔
4.HELP 檔
linux.2.4.27/Documetation/configure.help
config.in 的相關幫助文件
如下圖
在 Prompt for development and/or incomplete code/drivers 的help
對照 linux.2.4.27/Documetation/configure.help 中相對應的 CONFIG_EXPERIMENRAL 設定
Prompt for development and/or incomplete code/drivers
CONFIG_EXPERIMENTAL
Some of the various things that Linux supports (such as network
drivers, file systems, network protocols, etc.) can be in a state
of development where the functionality, stability, or the level of
testing is not yet high enough for general use. This is usually
known as the "alpha-test" phase among developers. If a feature is
..........................
所以若要新增一個註解
也可以在這裡新增
5.CONFIG 檔
經過make menuconfig 設定完後 其結果會存在
/linux-2.4.27/.config
也可以先載入之前的設定檔
6.config language readme
linux.2.4.27/Documetation/Kbuild/config-language.txt
config language 說明檔 ,本文主要參考文件
7.練習
如下圖 改寫 /arch/arm/config.in 做測試練習
主要將每個語法都測試過一遍
2007/05/08 update example
2007/03/05 add
留言列表