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 了。

results matching ""

    No results matching ""