【轉載】linux驅動的Makefile詳解

# 模塊被編譯時會前後兩次進入該目錄進行編譯。
# 在該目錄下(即模塊所在的目錄)執行make命令時,第一次根據該Makefile
# 進行編譯,此時KERNELRELEASE變量的值爲空,所以ifeq條件成立。
# KERNELRELEASE是在內核源碼樹的頂層Makefile中定義的一個變量,其值爲
# 內核的版本號。
ifeq ($(KERNELRELEASE),)
 
# 定義模塊所在目錄的變量
PWD := $(shell pwd)
# 定義內核源碼所在目錄的變量,該目錄下的內核源碼應該是被移植好的內核
# 源碼,並且經過了正確的配置和編譯,修改Makefile時需要修改該變量的值。
KERNELDIR ?= /home/kevin/Workspace/FSC100/kernel/linux-2.6.35-farsight
# 定義根文件系統的目錄,該目錄即爲NFS掛載的主機目錄。模塊將被安裝在
# 該目錄下的lib/modules/<內核版本號>/extra目錄下,修改Makefile時需要
# 修改該變量的值。
INSTALLDIR ?= /home/kevin/Workspace/FSC100/rootfs
 
# 第一個目標,爲默認的目標,即執行make modules命令和執行make命令的效果相同。
modules:
    # $(MAKE)相當於make,-C表明進入到一個指定目錄進行編譯,此時會進入
    # 到內核源碼所在的目錄,即KERNELDIR所指定的目錄進行編譯。
    # 進入到內核源碼目錄進行編譯的最主要的效果是KERNELRELEASE變量將會
    # 被定義,並且被導出到各個子目錄,以便在第二次進入模塊所在的目錄
    # 進行編譯時,ifeq條件不成立。M變量指定了內核源碼樹外的模塊目錄,用於
    # 指導編譯器從內核源碼樹目錄重新回到模塊所在目錄進行編譯。
    # modules用於指定編譯模塊,正如make zImage用於編譯內核映像一樣。
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
 
# 用於模塊的安裝,推薦使用該方式,這樣可以使用modprobe命令進行模塊的裝載。
modules_install:
    # INSTALL_MOD_PATH用於指定根文件系統的路徑,路徑名一定要正確。
    # modules_install用於說明是進行模塊安裝操作。
    $(MAKE) -C $(KERNELDIR) M=$(PWD) INSTALL_MOD_PATH=$(INSTALLDIR) modules_install
clean:
    rm -rf *.o *.ko *.mod.c .*.cmd modules.order Module.symvers .tmp_versions
 
# 第二次進入模塊所在的目錄進行編譯時,由於KERNELRELEASE變量已被定義,
# 所以else條件成立。
else
 
# obj-m用於指明相應的文件被編譯成模塊,正如obj-y用於指明相應的文件編譯進內核映像一樣。
obj-m := fsmod.o
 
endif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章