linux 2.6.32.2html
配置內核能夠經過執行 make menuconfig 來進行,下面分析該命令的執行流程linux
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
# 原文件中的註釋已經說得很清楚了,這是一個執行特定 Makefile 的縮寫
# 所以 $(Q)$(MAKE) $(build)=scripts/basic 能夠轉換爲
# $(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
# 即 make 執行 Makefile.build 這個文件
這幾句的目的是把 obj 記錄的目錄下的 Makefile include 進來,從而編譯一些主機上運行的程序web
# src := $(obj)
# The filename Kbuild has precedence over Makefile
# kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
# kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
# include $(kbuild-file)
如今回到原始目標上,make menuconfig 執行的指令以下bash
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
# 即主要是執行
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig
一樣的,它還會再次進入到 Makfile.build 文件中,並把 scripts/kconfig 目錄下的 Makefile 包含進來,同時執行的目標變成了 menuconfigapp
對應的目標以下ui
ifdef KBUILD_KCONFIG
Kconfig := $(KBUILD_KCONFIG)
else
# 實際是這個值,好比 arch/arm/Kconfig
Kconfig := arch/$(SRCARCH)/Kconfig
endif
menuconfig: $(obj)/mconf
$< $(Kconfig)
其依賴於 scripts/kconfig/mconf 這個程序,而此程序並不存在,在該 Makefile 如下的內容中給出了其生成規則,而且還會檢查生成該程序因此來的程序是否存在,執行的腳本是 scripts/kconfig/lxdialog/check-lxdialog.sh,若是沒有安裝依賴庫,則出現錯誤提示spa
# Check if we can link to ncurses
check() {
$cc -xc - -o $tmp 2>/dev/null <<'EOF'
#include CURSES_LOC
main() {}
EOF
if [ $? != 0 ]; then
echo " *** Unable to find the ncurses libraries or the" 1>&2
echo " *** required header files." 1>&2
echo " *** 'make menuconfig' requires the ncurses libraries." 1>&2
echo " *** " 1>&2
echo " *** Install ncurses (ncurses-devel) and try again." 1>&2
echo " *** " 1>&2
exit 1
fi
}
這就是爲何執行 make menuconfig 以前須要先安裝該程序的緣由,由於須要用到它~code
以上步驟順利完成以後,scripts/kconfig/mconf 程序就順利生成了,接下來就是真正的開始啓動配置了orm
scripts/kconfig/mconf $(Kconfig)
# 以 arm 爲例,如下路徑其實已經被替換成了絕對路徑,這裏省略
scripts/kconfig/mconf arch/arm/Kconfig
至此,真正的配置工做開始了,mconf 開始讀取 Kconfig 並進行解析,其解析規則能夠查看 mconf.c 文件,固然了,不必去看它如何實現的,只須要了解 Kconfig 的語法便可,其語法能夠參考https://www.kernel.org/doc/html/latest/kbuild/kconfig-language.htmlhtm
若是不出意外,如今終端上會顯示一個圖形界面,而後就能夠對各個選項進行配置了,退出以後程序會把配置項寫入到 .config 文件中,並生成相應的頭文件供源碼使用。