Linux移植之配置過程分析


Linux移植之移植步驟中已經將Linux移植的過程羅列出來了,現在分析一下Linux的配置過程,將分析以下兩個配置過程:

1、make s3c2410_defconfig分析

2、make menuconfig分析

 

1、make s3c2410_defconfig分析

首先從頂層Makefile開始分析,找到類似smdk2410_defconfig的目標。找到了%config目標。表示后綴為config的目標遵循這個規則,config %config前面的config是一個Kconfig關鍵字,表示一個配置選項的開始。

416    config %config: scripts_basic outputmakefile FORCE
417        $(Q)mkdir -p include/linux include/config
418        $(Q)$(MAKE) $(build)=scripts/kconfig $@

繼續分析s3c2410_defconfig目標的依賴scripts_basic outputmakefile FORCE

 

①、scripts_basic 依賴分析,它同樣是一個目標。它沒有依賴,其中Q表示如果在命令參數中輸入V=1則Q=空,表示打印這條規則,反之則不打印這條規則;MAKE=make在系統參數中定義的。

328    scripts_basic:
349        $(Q)$(MAKE) $(build)=scripts/basic

build這個變量是一個通用的變量,它定義在$(srctree)/scripts/Kbuild.include文件中,srctree為Linux內核所在目錄

121    build := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.build obj

將scripts_basic 依賴翻譯后為

scripts_basic:
    make -f $(srctree)/scripts/Makefile.build obj=scripts/basic

表示進入Makefile.build文件make,並且obj參數為scripts/basic。接着打開Makefile.build文件分析,它的目標為:

005    src := $(obj)

007    PHONY := __build
008    __build:

083    __build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
084         $(if $(KBUILD_MODULES),$(obj-m)) \
085         $(subdir-ym) $(always)
086        @:

接着分析src的作用:$(srctree)/scripts/Makefile.build把src (即scripts/basic)目錄下的Makefile包含進來(如果有Kbuild則包含Kbuild)

16    kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))//kbuild-dir=scripts/basic
17    include $(if $(wildcard $(kbuild-dir)/Kbuild), $(kbuild-dir)/Kbuild, $(kbuild-dir)/Makefile)//如果存在Kbuild就包含Kbuild,否則保護Makefile

再回到最終的目標:規則的命令是一個冒號命令”:”,冒號(:)命令是bash的內建命令,通常把它看作true命令。bash的help解釋(help :)為:No effect; the command does nothing. A zero exit code is returned.(沒有效果,該命令是空操作,退出狀態總是0)。

__build的依賴除了$(always),(builtin−target)(lib-target) (extra−y)(subdir-ym)這些變量在$(srctree)/scripts/basic/Makefile中沒有定義,因此builtin-target、lib-target、extra-y、subdir-ym都為空串,只有always有值。always在scripts/kconfig/Makefile中定義為dochecklxdialog,而dochecklxdialog目標所在規則的注釋寫着# Check that we have the required ncurses stuff installed for lxdialog (menuconfig)。也就是說,build目標的依賴dochecklxdialog是用來檢查生成配置對話框所需的ncurses庫是不是已經安裝在本機了,如果沒有安裝,make過程會報錯退出。因此在make menuconfig前,我們要保證該庫已經被安裝在本地。

以上文字照抄自配置Linux Kernel時make menuconfig執行流程分析。總結一下也就是說scripts_basic 這個依賴作用是檢查ncurses庫是否已經安裝在本機。這個庫在生menuconfog界面時需要用到。

 

②、outputmakefile 依賴分析,它同樣是一個目標,沒有依賴。KBUILD_SRC不空的話執行規則。KBUILD_SRC為空所以不執行

358    outputmakefile:
359    ifneq ($(KBUILD_SRC),)
360        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
361            $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
362    endif

 

③、FORCE依賴分析,它同樣是一個目標。如下:

1491    PHONY += FORCE
1492    FORCE:

從上面看到,FORCE 既沒有依賴的規則,其底下也沒有可執行的命令。如果一個規則沒有命令或者依賴,並且它的目標不是一個存在的文件名。在執行此規則時,目標總會被認為是最新的。就是說:這個規則一旦被執行,make就認為它的目標已經被更新過。這樣的目標在作為一個規則的依賴時,因為依賴總被認為被更新過,因此作為依賴所在的規則中定義的命令總會被執行。FORCE所在規則為空,也是什么都不做。FORCE被定義為一個偽目標,所以它作為依賴時總是被認為是最新的(比目標新),故有FORCE作為依賴的目標每次make時必然會重新生成,在這里FORCE偽目標的規則命令為空,故FORCE在Kbuild體系中,就是相當於是一個關鍵字,如果我們想要某個目標每次make的時候都一定會被重新生成,就把FORCE寫為該目標的依賴。

以上文字照抄自配置Linux Kernel時make menuconfig執行流程分析

 

④、接着分析第一條規則$(Q)mkdir -p include/linux include/config,它表示創建include/linux include/config兩個文件夾

 

⑤、最后分析第二條規則$(Q)$(MAKE) $(build)=scripts/kconfig $@,將它展開得到:

make -f $(srctree)/scripts/Makefile.build obj=scripts/kconfig smdk2410_defconfig

上面這句規則的意思是調用Makefile.build文件,最終的目標為s3c2410_defconfig,由上面第①條分析可知,Makefile.build文件包含了scripts/kconfig/Makefile,而s3c2410_defconfig正是定義在這個文件中:

66    %_defconfig: $(obj)/conf
67        $(Q)$< -D arch/$(ARCH)/configs/$@ arch/$(ARCH)/Kconfig

展開得:

66    s3c2410_defconfig: scripts/kconfig/conf
67        scripts/kconfig/conf -D arch/arm/configs/s3c2410_defconfig arch/arm/Kconfig

它的意思是先是生成conf程序,然后利用conf程序解析 s3c2410_defconfig文件與Kconfig文件配置單板,最后生成 .config文件,供make uImage時調用

 

1、make menuconfig分析,這個目標與s3c2410_defconfig目標一致,都是%config,所以只是分析最后階段,調用Makefile.build文件,包含了scripts/kconfig/Makefile,而menuconfig正是定義在這個文件中:

13    menuconfig: $(obj)/mconf
14        $< arch/$(ARCH)/Kconfig

故menuconfig目標的規則的命令為scripts/kconfig/mconf  arch/arm/Kconfig。mconf在這里實際上是scripts/kconfig目錄下的一個可執行文件,此條命令里arch/arm/Kconfig字符串作為命令行參數傳入該可執行文件運行,該可執行文件如果存在.config的內容,則依據.config的內容文件,生成配置界面;否則依據arch/arm/Kconfig文件提供的菜單配置,生成配置界面。

NOTE: 這里為什么說scripts/kconfig/mconf就是一個可執行文件呢?繼續往下看scripts/kconfig/Makefile中的內容:

lxdialog := lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o
lxdialog += lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o

conf-objs    := conf.o  zconf.tab.o
mconf-objs    := mconf.o zconf.tab.o $(lxdialog)
kxgettext-objs    := kxgettext.o zconf.tab.o

hostprogs-y := conf qconf gconf kxgettext

ifeq ($(MAKECMDGOALS),menuconfig)
    hostprogs-y += mconf
endif

ifeq ($(MAKECMDGOALS),xconfig)
    qconf-target := 1
endif
ifeq ($(MAKECMDGOALS),gconfig)
    gconf-target := 1
endif


ifeq ($(qconf-target),1)
qconf-cxxobjs    := qconf.o
qconf-objs    := kconfig_load.o zconf.tab.o
endif

如果在編譯內核的過程中,需要現編譯出一些可執行文件供內核編譯階段使用,就需要借助Kbuild框架的本機程序支持的特性。Kbuild 框架中,專門使用hostprogs-y變量來指示在內核編譯階段需要使用的一些可執行文件,通過hostprogs-y += mconf,就向make程序指明mconf是一個編譯階段需要使用的可執行文件。另外,Kbuild框架使用-objs后綴來指明相應的可執行文件需要通過多個目標文件來鏈接生成,mconf-objs    := mconf.o zconf.tab.o $(lxdialog)就是向make指明,mconf文件是由mconf.o zconf.tab.o lxdialog/checklist.o lxdialog/util.o lxdialog/inputbox.o lxdialog/textbox.o lxdialog/yesno.o lxdialog/menubox.o鏈接生成的。再有,未明確寫明生成規則時,Kbuild框架默認.o文件是由同名.c或.S文件編譯生成的。

保存配置信息后會在內核根目錄下生成一個.config文件,該文件保存了所做的內核配置信息。

 

參考自配置Linux Kernel時make menuconfig執行流程分析

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM