內核Makefile編譯的過程的學習之 Makefile

1. make menuconfig

     該命令完成的工作 : 生成 .condig 文件

     將menuconfg'的配置項全部列在該文件中  

2. make  

      該命令完成的工作 :生成/include/config/auto.conf  
                                 將.config中的配置爲編進內核或模塊的選項定義在這裏

                                 如  CONFIG_SMDK2440_CPU2440=y 

                                 該文件被包含於 頂層Makefile中   

                               生成/include/linux/autoconf.h 

                                 將.config中的配置爲編進內核或模塊的選項宏定義在這裏

                                 如  #define CONFIG_SMDK2440_CPU2440 1
3. 頂層Makefile 

       

      頂層Makefile決定哪些子目錄被編譯進vmlinux鏡像


      # Objects we will link into vmlinux / subdirs we need to visit
       init-y          := init/
       drivers-y       := drivers/ sound/
       net-y           := net/
       libs-y          := lib/
      core-y          := usr/
       562 core-y          += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

   同時頂層Makefile中包含arch/arm/Makefile所以該目錄也被編譯進內核

     理解時可以將該目錄看成頂層目錄看待 Makefile 也看成頂層Makefile  

     arch/arm/Makefile  內容如下 

       94 head-y   := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o

         core-y                          += arch/arm/kernel/ arch/arm/mm/ arch/arm/common/
     172 core-y                          += $(MACHINE)
     173 core-$(CONFIG_ARCH_S3C2410)     += arch/arm/mach-s3c2400/
     174 core-$(CONFIG_ARCH_S3C2410)     += arch/arm/mach-s3c2412/
     175 core-$(CONFIG_ARCH_S3C2410)     += arch/arm/mach-s3c2440/
     176 core-$(CONFIG_ARCH_S3C2410)     += arch/arm/mach-s3c2442/
     177 core-$(CONFIG_ARCH_S3C2410)     += arch/arm/mach-s3c2443/
            libs-y                          := arch/arm/lib/ $(libs-y)  

  這裏的 CONFIG_ARCH_S3C2410 就是在/include/config/auto.conf 中定義

  編譯內核時 將依次進入 init——y core——y libs——y driver——y net——y所列的目錄中執行

  他們的Makefile 每個子目錄生成 built-in.o(lib-y 目錄中可能生成lib.a)

  最後 head-y 所表示的文件和這些 built-in.o lib.a 一起 鏈接成 vmlinux

4. 子目錄下的Makefile

   各子目錄下的 Makefile 決定該目錄下的哪些文件編譯進內核或模塊 進入哪些子目錄的

       內容如下 以/net/Makefile爲例

        obj-y   := nonet.o

       obj-$(CONFIG_NET)               := socket.o core/     

       tmp-$(CONFIG_COMPAT)            := compat.o
       obj-$(CONFIG_NET)               += $(tmp-y) 

      這裏的CONFIG_NET 也是在auto.conf裏定義

      

      可知 obj -y和 lib-y 同時決定編譯哪些文件 進入哪些子目錄

    

    5.總結  

       .config 中定義了一系列的變量  Makefile 根據這些變量  決定哪些
 
     文件被編譯進內核 哪些文件被編譯成模塊 涉及哪些子目錄      

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章