MikeFile說明
obj−m += hello.o
KERNEL_DIR = /lib/modules/$(shell uname −r)/build
all:
make −C $(KERNEL_DIR) M=$(PWD) modules
clean:
make −C $(KERNEL_DIR) M=$(PWD) clean
這邊解釋一下 Makefile 的內容:
$(shell uname -r)
:取得 kernel 版本號
KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/
:因為編譯 kernel 需要 include kernel 目錄,所以這邊也要定義
obj-m
:表示需要編繹成模組的目標檔案名集合,編譯的方式為編譯成區塊,這裡要注意的是,他同時也是代表被編譯的檔案名稱, 如果要被編譯的是 hello.c,那這邊就要填 obj-m += hello.o
,此外還有 obj-y
,代表編譯進去內核。
編譯指令如下make -C $(KERNEL_DIR) M=$(PWD) modules
-C:
:跟 make 講 這次 kernel module include 的目錄在哪
$(KERNEL_DIR)
:Makefile 中可以使用變數,一般變數大寫,在引用變數時,採用小括弧擴起變數名前加($)符號來用。
M=$(PWD)
:描述那個目錄要被編譯。
all
是個關鍵字,良好的makefile都要有一個all,因為這是預設執行目標。
clean
用來清除暫時檔。
Makefile的賦值運算符(=, :=, +=, ?=)
= 是最基本的賦值 := 會覆蓋變數之前的值 ?= 變數為空時才給值,不然則維持之前的值 += 將值附加到變數的後面
另外 =, :=這兩賦值運算符號在網路上查詢,常常會看到這種說法: = 在執行時擴展(values within it are recursively expanded when the variable is used, not when it's declared) := 在定義時擴展(values within it are expanded at declaration time)
= 語法
注意到,make 會將整個 Makefile 展開後,再決定變數的值。也就是說,變數的值將會是整個 Mackfile 中最後被指定的值。例:
x = foo
y = $(x) bar
x = xyz
# y 的值為 xyz bar
在上例中,y 的值將會是 xyz bar,而不是 foo bar。
:= 語法
:= 表示變數的值決定於它在 Makefile 中的位置,而不是整個 Makefile 展開後最終的值。
x := foo
y := $(x) bar
x := xyz
# y 的值為 foo bar
在上例中,y 的值將會是 foo bar,而不是 xyz bar 了。
?= 語法
?= 是一個簡化的語法:若變數未定義,則替它指定新的值。否則,採用原有的值。例:
FOO ?= bar
若 FOO 未定義,則 FOO = bar;若 FOO 已定義,則 FOO 的值維持不變。
+= 語法
例:
CFLAGS = -Wall -g
CFLAGS += -O2
此時 CFLAGS 的值就變成 -Wall -g -O2 了。