make menuconfig 執行流程分析

2021-06-14 19:00:24 字數 4324 閱讀 3159

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這個指令碼,出現配置介面。

make menuconfig執行過程

linux核心的make menuconfig實際上是執行了 scripts kconfig mconf arch mips kconfig mconf表示是menuconfig,如果是用基於qt的配置工具,則執行的將會是qconf,arch mips kconfig是要讀取的kconfig檔案,這...

帶你了解make menuconfig

帶你了解make menuconfig 在嵌入式領域當中,在配置核心的時候會有很多配置方法,比如說make config 基於文字的為傳統的配置介面 make oldconfig 如何只想在原來核心配置的基礎上修改一部分,則會省去很多麻煩 make xconfig 基於圖形視窗模式的配置介面,xwi...

make menuconfig錯誤的解決辦法

如果使用make menuconfig的方式配置核心,又碰巧系統沒有安裝ncurses庫 ubuntu系統 預設就沒有安裝此庫 就會出現錯誤,錯誤資訊大體上如下 unable to find the ncurses libraries or the required header files.mak...