linux make menuconfig\Makefile\Kconfig 詳解

來源:互聯網
上載者:User

如果您知道.config、Makefile、Kconfig,那麼您就往下練吧!

在對linux進行編譯的時候,經常會用到make menuconfig這樣的圖形化操作介面對系統進行剪裁。但是如果在採用圖形化介面的情況下,通常會遇到需要在kernel檔案夾之外的指令檔中規定編譯時間所使用的*_defconfig檔案。這樣通常情況下,我們進行make menuconfig之後的檔案會被arch/xxx/configs目錄下的*_defconfig檔案進行覆蓋。而解決這個問題的辦法就是在make menuconfig之後把檔案中改動的部分merge到arch/xxx/configs目錄下的*_defconfig檔案中。這樣我們的改動就會被永久的儲存了。

瞭解了上面的機制之後,對平時進行正常的工作已經是足夠了。但是如果還想繼續探索更深的原理性的東西,可以繼續往下看。

首先在kernel目錄下進行make menuconfig操作的時候,在出現圖形化操作介面之前可以看到這樣一行資訊

scripts/kconfig/mconf  Kconfig

這行資訊告訴我們的內容足夠讓我們去研究半天了,首先看一下Kconfig吧,最簡單的思維方式就是看一下目前的目錄下的Kconfig檔案這個檔案中告訴我們要

source "arch/$SRCARCH/Kconfig"

那現在又出現一個問題,到底宏SRCARCH是被定義為何值?

從Makefile檔案中找到了這樣的幾行

export KBUILD_BUILDHOST := $(SUBARCH)

ARCH            ?= arm

ARCH            ?= $(SUBARCH)

CROSS_COMPILE   ?= arm-linux-androideabi-

#CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)

# Architecture as present in compile.h

UTS_MACHINE     := $(ARCH)

SRCARCH         := $(ARCH)

由此可以看出SRCARCH是指arm,那麼現在就非常明確的知道了前面所講述的

scripts/kconfig/mconf  Kconfig的後半部分,那前半部分現在就到相應的目錄下去看一下,scripts/kconfig/目錄中確實存在這樣一個mconf檔案,

此處大膽猜測,前面是一個可執行檔後面是它的參數,那麼我們可以知道Kconfig檔案就是整個配置的入口。此處正確與否後續再研究。

那去看一下這個Kconfig檔案吧……

發現確實存在好多我們應該看到的資訊,那就這樣吧……

既然到了scripts/kconfig目錄下,肯定要去看一下這裡面很重要的檔案,大家知道在看C語言代碼時很重要的就是去看一下標頭檔,那在linux中很重要的檔案就是Makefile檔案和Kconfig檔案。那不妨就來看一下kconfig檔案,不看不知道一看真奇妙,居然木有。那好吧Makefile

xconfig: $(obj)/qconf

        $< $(Kconfig)

gconfig: $(obj)/gconf

        $< $(Kconfig)

menuconfig: $(obj)/mconf

        $< $(Kconfig)

config: $(obj)/conf

        $< --oldaskconfig $(Kconfig)

nconfig: $(obj)/nconf

        $< $(Kconfig)

oldconfig: $(obj)/conf

        $< --$@ $(Kconfig)

silentoldconfig: $(obj)/conf

        $(Q)mkdir -p include/generated

        $< --$@ $(Kconfig)

看到這,驚起一灘鷗鷺,原來你也在這裡。平時用到的各種make XXconfig。

那就這樣吧……

往下看,看到這裡的時候我和我的小夥伴們都驚呆了

defconfig: $(obj)/conf

ifeq ($(KBUILD_DEFCONFIG),)

        $< --defconfig $(Kconfig)

else

        @echo "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"

        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)

endif

%_defconfig: $(obj)/conf

        $(Q)$< --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)

難道跟前面提到的arch/arm/configs/下面的各種defconfig檔案有千絲萬縷的剪不斷理還亂的關係?我們姑且這麼認為吧……但是此處好像確實沒多大關係,姑且不論吧,因為這些我也沒看懂。不過事實上,還真沒受它的影響。

所以此處暫且不表。

有時也會遇到想開啟的config檔案在make menuconfig的時候無法找到的情況,這時候我們可以搜尋一下想要開啟的檔案的依賴的config是否已經開啟,這個非常關鍵。如果config項不是自己寫的,而是核心內建的一些程式檔案很容易產生這樣的情況。我們可以在Kconfig檔案中進行讀取,並且將這些依賴的檔案依次進行開啟相應的config檔案就可以看到需要的config項出現在眼前了,為生活中的小驚喜而感動吧,親~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.