makefile:make -C M=引數的使用
http://blog.sina.com.cn/s/blog_89fa41ef0100trjr.html
Makefile為,
PWD = $(shell pwd)KERNEL_SRC = /usr/src/linux-source-2.6.15/
obj-m := test.o
module-objs := test.o
all:
$(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules
clean:
rm *.ko
rm *.o
在test.c和Makefile所在的目錄下執行make,如果看到類似輸出
make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules
make[1]: Entering directory `/usr/src/linux-source-2.6.15'
CC [M] /home/vmeth/hello.o
Building modules, stage 2.
MODPOST
CC /home/vmeth/hello.mod.o
LD [M] /home/vmeth/hello.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'
一般用下面的Makefile,
# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.
mymodule-objs := hello.o
obj-m := hello.o
else
PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD)
clean:
rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
endif
KERNELRELEASE 是在核心原始碼的頂層Makefile中定義的一個變數,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定
義,所以make將讀取執行else之後的內容。
當make的目標為all時,-C $(KDIR) 指明跳轉到核心原始碼目錄下讀取那裡的Makefile;M=$(PWD) 表明然後返回到當前目錄繼
續讀入、執行當前的Makefile。
當從核心原始碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去解析kbuild語法的語句,make將繼續讀取else之前
的內容。else之前的內容為kbuild語法的語句, 指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。
每個核心的名字都包含了它的版本號,這也是 uname -r 命令顯示的值。