linux make menuconfig 執行流程小結
最後更新:2018-12-03
來源:互聯網
上載者:User
linux/2.6.20.6/make menuconfig
當在頂層目錄執行”make menuconfig”會執行頂層Makefile 第415行的規則
config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
這裡”menuconfig”與模式”%config”匹配。所以其執行的規則如下:
menuconfig: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig
這個規則有三個依賴:scripts_basic、outputmakefile、FORCE。下面看一下這三個依賴:
1、 FORCE
首先分析一下這個依賴,它的規則定式義在1485行:
PHONY += FORCE
FORCE:
這個規則沒有命令也沒有依賴,它的目標也不是一個存在的檔案名稱。在執行此規則時,目標FORCE總會被認為是最新的。這樣當它作為其它規則的依賴時,因為依賴總被認為被更新過的,所以那個規則的中定義的命令總會被執行。
2、 scripts_basic
這個依賴的規則在347行定義:
scripts_basic:
$(Q)$(MAKE) $(build)=scripts/basic
build這個變數定義在scripts/kbuild.include的114行:
build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj
所以上面的規則可寫成如下形式:
scripts_basic:
$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
這個規則的命令最終會進入scripts目錄,執行Makefile.build檔案,並傳遞參數obj=scripts/basic.
在Makefile.build的第5行有:
src := $(obj)
這就把傳遞進來的值賦給了src,所以
src := scripts/basic
從第16行開始的兩行把src (即scripts/basic)目錄下的Makefile包含進來(如果有Kbuild則包含Kbuild)
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)
在第19行包含了scripts/Makefile.lib進來,
在Makefile.build的第83行,是make在Makefile.build中遇到的第一個目標
__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) /
$(if $(KBUILD_MODULES),$(obj-m)) /
$(subdir-ym) $(always)
@:
KBUILD_BUILTIN在頂層Makefile的第207行定義
KBUILD_BUILTIN := 1
如果執行”make modules”,會在214行開始對其進行一些處理
ifeq ($(MAKECMDGOALS),modules)
KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
endif
所以我們這裡 KBUILD_BUILTIN :=1
KBUILD_MODULES在頂層Makefile的第206行定義,
KBUILD_MODULES :=
如果執行”make all”、”make _all”、”make modules”、”make”中任一個命令,則在222行開始會對這個變數進行處理
ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
KBUILD_MODULES := 1
endif
ifeq ($(MAKECMDGOALS),)
KBUILD_MODULES := 1
endif
因此,我們這裡KBUILD_MODULES :=
分析了這兩個變數後,上面的規則可重新寫為
__build: $(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
@:
這就是通過規則
scripts_basic:
$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj=scripts/basic
在scripts/Makefile.build檔案中執行的第一個規則,
規則中的依賴由幾個變數$(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)表示。規則的命令是一個冒號命令”:”,冒號(:)命令是bash的內建命令,通常把它看作true命令。bash的help解釋(help :)為:No effect; the command does nothing. A zero exit code is returned.(沒有效果,該命令是空操作,退出狀態總是0)。
__build: $(builtin-target) $(lib-target) $(extra-y)) $(subdir-ym) $(always)
@:
構建一些依賴目標,這裡主要是構建$(always)變數指定的目標。其他變數在scripts/basic/Makefile中並沒有定義。
3、 outputmakefile
回到頂層Makefile中看規則
menuconfig: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig
中的outputmakefile參數構建規則在357行開始定義
outputmakefile:
ifneq ($(KBUILD_SRC),)
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile /
$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
endif
這個規則的命令運行一個shell指令碼scripts/mkmakefile,並傳遞四個參數。這個指令碼主要是在$(objtree)參數指定的目錄中產生一個Makefile檔案。由於這裡KBUILD_SRC為空白,所以這個指令碼並不會被執行
回頭再看看剛才那個規則
menuconfig: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig menuconfig
在他的依賴被處理完後,開始執行規則的命令。第一個命令建立了兩個目錄,第二個命令擴充後為
$(Q)$(MAKE) -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj =scripts/kconfig menuconfig
這個命令依然是執行scripts/Makefile.build這個makefile檔案。並執行它裡面menuconfig的規則。根據上面的分析,在Makefile.build會包含scripts/kconfig/Makefile檔案。然後執行以menuconfig為目標的規則,在scripts/kconfig/Makefile的13行定義
menuconfig: $(obj)/mconf
$< arch/$(ARCH)/Kconfig
從這個命令可以看出,最終會運行arch/arm/Kconfig這個指令碼,出現配置介面。