Makefile中的-C和M=解析
阿新 • • 發佈:2018-11-05
轉自: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編譯執行結果: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 解析 的內容,請您使用右上方搜尋功能獲取相關資訊。