1. 程式人生 > >makefile模組編譯模板

makefile模組編譯模板

Makefile模板為:

  1. ifneq ($(KERNELRELEASE),)
  2. obj-m := memdev.o
  3. else
  4. KDIR := /home/study/4-3-1/linux-2.6.29
  5. all:
  6.      make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
  7. clean:
  8.      rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*
  9. endif


解析:

ifneq ($(KERNELRELEASE), ) //判斷KERNELRELEASE是否定義,KERNELRELEASE是在linux核心原始碼中主 Makefile中定義的     
       
       obj-m := memdev.o        //編譯生成目標檔案


else      //若KERNELRELEASE沒有否定義

        KDIR := /home/study/4-3-1/linux-2.6.29

                      // KDIR是本Makefile 依賴的linux核心原始碼路徑  ,如是交叉編譯時就取開發板上執行的原始碼路徑
       

         make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

     M=$(PWD)      //取當前的路徑

    ARCH=arm       //編譯在ARM平臺上執行的程式

    CROSS_COMPILE=arm-linux-      //使用交叉編譯工具對其進行編譯  

     //到linux原始碼所在的目錄執行主Makefile 並當前路徑傳給主Makefile,告訴主Makefile執行完後返回到當前目錄,執行Makefile,

  endif                                                                                               

KERNELRELEASE 是在核心原始碼的頂層Makefile中定義的一個變數,在第一次讀取執行此Makefile時, KERNELRELEASE沒有被定義,所以make將讀取執行else之後的內容。如果make的目標是clean,直接執行clean操作,然後結 束。當make的目標為all時,-C $(KDIR) 指明跳轉到核心原始碼目錄下讀取那裡的Makefile;M=$(PWD) 表明然後返回到當前目錄繼續讀入、執行當前的Makefile。當從核心原始碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去 解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。obj-m := memdev.o表示編譯連線後將生成memdev.o模組。