Linux移植之配置過程分析 Linux移植之移植步驟

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

一、make s3c2410_defconfig分析linux

二、make menuconfig分析bash

 

一、make s3c2410_defconfig分析框架

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

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 FORCEui

 

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

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

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

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時調用

 

一、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執行流程分析

相關文章
相關標籤/搜索