2011-06-01 驅動的makefile

《Linux設備驅動程序(第三版)》。裏面有個關於Module編譯的Makefile
#如果已經定義了KERNELRELEASE,則說明是從內核整體編譯的Make中調用。在我的2.6.31內核的
#Makefile中L357行有關於KERNELRELEASE定義:
#KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
#因此可以使用其內建語句
ifneq ($(KERNELRELEASE), )
obj-m := hello.o

#否則,是直接從命令行調用,
#這時需要調用內核構造系統
#對$(shell uname -r)會得到Linux系統版本相關信息:
# uname -r
#2.6.32-28-generic
else


KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:

#對下面一句Makefile的解釋:-C $(KERNELDIR)表示讀取Makefile之前進入KERNELDIR目錄,M=$(PWD)
#作爲參數傳給Makefile,在試圖建立模塊目標前, 回到你的模塊源碼目錄,內核中的解釋是:
#make M=dir modules   Make all modules in specified dir

    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

 

 

這樣,通常在內核外編譯模塊(不是內核的makefile裏面實現模塊的編譯),個 makefile 在一次典型的建立中要被讀 2 次. 當從命令行中調用這個 makefile , 它注意到 KERNELRELEASE 變量沒有設置(因爲不是內核makefile裏面編譯),這樣利用KERNELDIR 的那一行發現內核源碼樹.然後makefile 調用 default: 目標, 來運行第 2 個 make 命令( 在 makefile 裏參數化成 $(MAKE))象前面描述過的一樣來調用內核建立系統. 在第 2 次讀,KERNELRELEASE 已賦值, makefile 設置 obj-m := hello.o, 並且內核的 makefile 文件完成實際的建立模塊工作.(內核建立系統處理了餘下的工作)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章