linux 核心中的 Makefile

來源:互聯網
上載者:User
對於核心,Makefile分為5類:

    Documentation/kbuild/makefiles.txt描述如下:

50 The Makefiles have five parts:

51

52     Makefile                總Makefile,控制核心的編譯

53     .config                 核心設定檔,配置核心時產生,如make menuconfig後

54     arch/$(ARCH)/Makefile   對應體繫結構的Makefile

55     scripts/Makefile.*      Makefile共用的規則,形配置介面。

56     kbuild Makefiles        各子目錄下的Makefile,被上層的Makefile調用

 

    簡單來說,編譯核心會執行以下事情。

    1.make menuconfig

1.1拷貝一個對應體繫結構的設定檔到主目錄下並改名為.config,這樣就在make       menuconfig產生的圖形配置中已經有了一些預設的配置,減少使用者的勞動量。

1.2從核心頂層目錄的Makefile決定編譯的體繫結構(ARCH).編譯工具  (CROSS_COMPILE)和需要進去編譯的目錄。

1.3根據總Makefile的ARCH變數,進入相應體繫結構的目錄,讀取arch/$ (ARCH)/Makefile,決定對應的體繫結構下還有哪些目錄需要編譯。

1.4根據arch/$(ARCH)/Makefile,一個一個地遞迴進入指定的目錄下調用該目錄下的makefile,並根據目錄下的Kconfig組建組態介面並由使用者決定將該檔案編譯成模組還是編譯進核心。

1.5配置完畢後儲存退出,會更改原來的.config的內容。

    2.make

1.1將產生的.config去掉注釋,建立一份設定檔,檔案名稱為include/config/auto.conf。

1.2根據設定檔的要求,將需要編譯的檔案的各個子目錄下產生一個.o或者.a檔案,然後由總Makefile指定的串連指令碼arch/$(ARCH)/kernel/vmlinux.lds產生vmlinux,並通過壓縮變成bzImage,或者按要求在對應的子目錄下編譯成模組。     

 

    但是,具體是怎麼組建組態檔案的呢?

註:我使用的核心是被修改過的,可能有些地方和原核心不一樣,如我核心裡面$(ARCH)寫成$(SRCARCH)。還有在檔案中的行數和原核心不一致,但這些不影響分析,搜尋一下就出來了。

    1.在總Makefile中,根據以下語句進入需要編譯的目錄

   

470 # Objects we will link into vmlinux / subdirs we need to visit

471 init-y          := init/

472 drivers-y       := drivers/ sound/ firmware/

473 net-y           := net/

474 libs-y          := lib/

475 core-y          := usr/

476 endif # KBUILD_EXTMOD

639 core-y          += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

#另外還有一個體系相關的arch目錄

529 include $(srctree)/arch/$(SRCARCH)/Makefile

 

    這樣,就根據了體繫結構決定了需要進去編譯的目錄了。

2.在總Makefile中包含的目錄還是不夠的,核心還需要根據對應的CPU體系架構,決定還需要將哪些子目錄將要編譯進核心,在總Makefile中進去讀取相應體繫結構的Makefile:arch/$(SRCARCH)/Makefile。

    在總Makefile和體系架構下的arch/(SRCARCH)/Makefile中包含的子目錄會根據該目錄下的Makefile的要求編譯成模組還是編譯進核心,當然也可以不編譯。

 

如在 arch/arm/Makefile 下:

187 # If we have a machine-specific directory, then include it in the build.

188 core-y                          += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/

189 core-y                          += $(machdirs) $(platdirs)

190 core-$(CONFIG_FPE_NWFPE)        += arch/arm/nwfpe/

191 core-$(CONFIG_FPE_FASTFPE)      += $(FASTFPE_OBJ)

192 core-$(CONFIG_VFP)              += arch/arm/vfp/

193

194 drivers-$(CONFIG_OPROFILE)      += arch/arm/oprofile/

195

196 libs-y                          := arch/arm/lib/ $(libs-y)

 

 

    其中,y表示編譯成模組,m表示編譯進核心(上面沒有,因為預設情況下ARM全部編譯進核心),但$(CONFIG_OPROFILE)又是什麼呢?

    這些是根據使用者在make menuconfig中設定後,產生的值賦給了CONFIG_OPROFILE。這是由各子目錄下的Kconfig提供選項功使用者選擇並配置。如arch/arm/Kconfig。

    另外有些配置會根據arch/$(ARCH)/Kconfig檔案通過Kconfig的文法source讀取各個包含的子目錄Kconfig來產生一個配置介面。每個Makefile目錄下都有一個對應Kconfig檔案,用於組建組態介面來給使用者決定核心如何配置。

總結Kconfig的作用:

2.1.在make menuconfig下可以配置選項;

2.2.在.config中確定CONFIG_XXX的的值。

3.只是讀取以上的兩個Makefile還是不夠了,核心還會把包含的子目錄一層一層的讀取它裡面的Makefile和Kconfig。

 

假設我現在配置核心

1.最簡單的方法,直接修改子目錄的Makefile

如在我要取消s3c2440的時鐘(當然這是必須要開的,只是舉例)。

可以直接修改arch/arm/mach-s3c2440/Makefile

12 obj-$(CONFIG_CPU_S3C2440)   += s3c2440.o dsc.o

 13 obj-$(CONFIG_CPU_S3C2440)   += irq.o

 14 obj-$(CONFIG_CPU_S3C2440)   += clock.o

 15 obj-$(CONFIG_S3C2440_DMA)   += dma.o

 

將obj-$(CONFIG_CPU_S3C2440)   += clock.o改為

obj-   += clock.o

也可以編譯成模組:

obj-m  += clock.o

2.當然有更方便的通過圖形介面,make menuconfig,接下來我實現一下如何將一個選項加入到圖形配置介面中。

 

    2.1.進入核心目錄

       cd linux-2.6.29

    2.2.在driver目錄下類比一個名為test1驅動的檔案夾

    mkdir driver/test1

2.3.在test1目錄下隨便寫個C檔案

    cd driver/test1

    vim test1.c

   

  1 void foo()

  2 {

  3         ;

  4 }

 

2.4.在目錄下編寫一個簡單的Makefile   

    vim Makefile

obj-$(CONFIG_TEST1) += test1.o

   

    CONFIG_TEST1是決定test1是否編譯進核心或者編譯成模組的。這就通過Kconfig由使用者在make menuconfig中選擇。

2.5.所以還要在目錄下寫一個Kconfig

    vim Kconfig

   

  1 menu "test1 driver here"

  2 config TEST1

  3     bool "xiaobai test1 driver"

  4     help

  5         This is test1

  6 endmenu

 

 

    說白了,就是在圖形配置的driver下多了一個配置選項,使用者配置後將CONFIG_TEST1的值存放在.config中,Makefile通過讀取.config的去注釋版autoconf讀取到CONFIG_TEST的值,再進行編譯。但是,以上幾步還不能達到目的,因為雖然在總Makefile中已經包含了目錄driver,但是driver目錄的Makefile中並沒有包含test目錄。因此需要在driver/Makefile中添加:

2.6.vim driver/Makefile

    再最後加上一句:

      

104 obj-$(CONFIG_OF)        += of/

105 obj-$(CONFIG_SSB)       += ssb/

106 obj-$(CONFIG_VIRTIO)        += virtio/

107 obj-$(CONFIG_STAGING)       += staging/

108 obj-y               += platform/

109 obj-$(CONFIG_TEST1)     += test1/        //添加這句

 

 

    雖然Makefile中已經包含了,但這樣還是不行。因為當需要配置ARM時,ARM結構下的Kconfig並沒有包含test的Kconfig。這樣的話就不會出現在圖形配置介面中,因此在arch/arm/Kconfig中添加語句。

2.7.vim arch/arm/Kconfig

 

   

1230 menu "Device Drivers"

1231

1232 source "drivers/base/Kconfig"

…..............................................

1328 source "drivers/staging/Kconfig"

1329

1330 source "drivers/test1/Kconfig"

1331

1332 endmenu

 

 

大功告成!

    這樣,make menuconfig介面寫的Driver Devices下就多了一個"test1 driver here"的目錄,裡面有一個配置選項"xiaobai test1 driver"。

 

    Kconfig檔案的文法在documentation/kbuild/kconfig-language.txt檔案中有詳細的講解,上面我只是簡單實現了一下,但都是皮毛。

聯繫我們

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