1. 程式人生 > >Makefile中的-C和M=解析

Makefile中的-C和M=解析

轉自:https://www.aliyun.com/jiaocheng/144874.html

  • 摘要:在進行嵌入式開發過程中,經常需要編寫和執行Makefile,且在大型專案開發過程中,一般也都是使用Makefile來進行管理、編譯、執行的,所以對Makefile的讀寫是嵌入式軟體工程師必須具備的基本能力。Makefile中,特別是在核心模組編譯過程中最常使用到的兩個引數就是“-C”和“M=”。常用Makefile:#Makefileifneq($(KERNELRELEASE),)#kbuildsyntax.dependencyrelationshsipoffilesandt
  • 在進行嵌入式開發過程中,經常需要編寫和執行Makefile,且在大型專案開發過程中,一般也都是使用Makefile來進行管理、編譯、執行的,所以對Makefile的讀寫是嵌入式軟體工程師必須具備的基本能力。 
    Makefile中,特別是在核心模組編譯過程中最常使用到的兩個引數就是“-C”和“M=”。常用Makefile: 
    # Makefile 
    ifneq ($(KERNELRELEASE),) 


    #kbuild syntax. dependency relationshsip of files and target modules are listed here.


    mymodule-objs := helloworld.o 


    obj-m := 
    helloworld.o


    else 


    PWD:= $(shell pwd)

     


    KERNEL_VER ?= $(shell uname -r)


    KERNEL_DIR := /lib/modules/$(KERNEL_VER)/build 
    all: 


    $(MAKE) -C $(KERNEL_DIR) M=$(PWD)


    clean: 


    rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions*.order *symvers


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

    [email protected]:~/fly/tmp$ make

     

    make -C /lib/modules/3.16.0-30-generic/build M=/home/shawn/fly/tmp

     

    make[1]: 正在進入目錄 `/usr/src/linux-headers-3.16.0-30-generic'

     

    LD /home/shawn/fly/tmp/built-in.o

     

    CC [M] /home/shawn/fly/tmp/helloworld.o

     

    Building modules, stage 2.

     

    MODPOST 1 modules

     

    CC /home/shawn/fly/tmp/helloworld.mod.o

     

    LD [M] /home/shawn/fly/tmp/helloworld.ko

     

    make[1]:正在離開目錄 `/usr/src/linux-headers-3.16.0-30-generic'

     

    [email protected]:~/fly/tmp$

  • 以上是Makefile中的-C和M=解析的內容,更多 Makefile 解析 的內容,請您使用右上方搜尋功能獲取相關資訊。