linux make menuconfig 執行流程小結

來源:互聯網
上載者: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這個指令碼,出現配置介面。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.