1. 程式人生 > >核心模組編譯--Makefile寫法

核心模組編譯--Makefile寫法

核心模組編譯-Makefile寫法

如果編譯核心模組,可以編寫Makefile,然後執行make命令即可。

Linux2.6的Makefile模板如下:

#Makefile2.6

ifneq ($(KERNELRELEASE),)

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

mymodule-objs := file1.o file2.o

obj-m := mymodule.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

注意:

1.ifneq 後面有空格。

2.命令前面必須使用tab鍵,如&(MAKE)和rm 的前面。

3.Makefile必須和相應的.c檔案放在同一個目錄下。

程式碼解釋:

(1) ifneq ($(KERNELRELEASE),)

KERNELRELEASE是在核心原始碼的頂層Makefile中定義的一個變數,當第一次執行這個Makefile時,KERNELRELEASE沒有被定義,所以會執行else後面的內容。

(2)PWD:=$(shellpwd)

可以把shell指令碼寫到Makefile裡面,這句話的意思:執行shell指令碼命令pwd(pwd是顯示當前目錄的路徑),把返回值賦給PWD這個變數,所以PWD存的就是當前目錄的路徑。

(3)KVER:=$(shell uname -r)

執行shell指令碼命令:uname-r,這個命令的作用是顯示當前核心版本(kernelreleaes),所以變數KVER的內容是當前系統kernelrelease.

(4)KDIR:=/lib/modules/$(KVER)/build,DIR指定了核心原始碼的路徑.

(5)all:

    $(MAKE) -C $(KDIR)  M=$(PWD)  #前面必須是tab。

這裡all只是個標號,可以自己定義,是make的預設執行目標。

(MAKE):MAKEMakefile巨集巨集使(MAKE):MAKE是Makefile中的巨集變數,要引用巨集變數要使用符號。這裡實際上就是指向make程式,所以這裡也可以把$(MAKE)換成make.

-C:是make命令的一個選項,-C作用是changedirectory. -C dir 就是轉到dir目錄。

M=$(PWD):返回當前目錄。

這句話的意思是:當make執行預設的目標all時,-C(KVDIR)Makefile,M=(KVDIR)指明跳轉到核心原始碼目錄下去執行那裡的Makefile,M=(PWD)表示又返回到當前目錄來執行當前的Makefile.

(6)當從核心原始碼目錄返回時,再次執行這個Makefile時,KERNELRELEASE已經被定義過,這次 ifneq ($(KERNELRELEASE),)條件判斷成立,就會執行後面的內容。ifneq之後else之前的內容為kbuild語法的語句,指明模組原始碼中各模組間的依賴關係,以及要生成的模組的名稱。

(7)mymodule_objs:=file1.ofile2.o

表明mymodule.o由file1.和file2.o連結生成

(8)obj-m:=mymodule.o

編譯連結後要生成mymodule.o模組。obj-m表示以模組編譯,obj-y表示編譯並連結進核心.

注:如果模組就由一個檔案編譯而成,可寫為:obj-m:=mymodule.o。(必須與mymodule.c名字對應,都是mymodule。上面的file1.ofile2.o也如此)

(9)clean:

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

在命令列中輸入:make,只會執行(1)到(8)的指令,不會執行clean標號之後的指令。要想執行clean標號後面的指令,需要在命令列中輸入:makeclean

rm 就是刪除後面這些由make生成的檔案。一般如果需要重新執行make編譯之前,使用make clean先清理上次生成的檔案。

如果想刪除make生成的所有檔案,也可以使用下面方式:

clean:

  $(MAKE) -C $(KDIR) M=$(PWD)clean

或者

clean:

 make-C $(KDIR) M=$(PWD)clean

一個簡單的Makefile例子(為《核心模組程式機構》中hello.c編寫的)

//Makfile

ifneq ($(KERNELRELEASE),)

#kbuildsyntax. dependency relationshsip of files and target modules arelisted here.

#mymodule-objs:= file1.o file2.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:

   $(MAKE)-C $(KDIR) M=$(PWD) clean

endif