linux驅動模組(多檔案)的makefile實現
阿新 • • 發佈:2019-02-01
方式1常用於編寫,除錯階段。驅動原始碼的資料夾位置獨立自由,只要在中指定好Linux核心原始碼的路徑。
方式2常用於最後整合階段,在除錯基本完成後,可以將驅動原始碼檔案(夾)放置在Linux核心原始碼的driver/xxx/的相應路徑中,修改本層和上層的Makefile和KConfig檔案,並重新make menuconfig核心,可以在Menu中選中新加入的驅動模組,然後make module,就可以在驅動原始碼資料夾生成.ko檔案。
方式1:
本地Makefile檔案內容如下:
- ifeq ($(KERNELRELEASE),) #開始滿足這個條件
-
KERNELDIR ?= /opt/xxxxxx/linux-2.6
- PWD := $(shell pwd) #列印當前驅動原始碼的本地位置
- modules: #編譯為驅動模組
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- #-C 指定核心Makefile的路徑,可以使用相對路徑。
- #-M 指定要編譯的檔案的路徑,同樣可以使用相對路徑。
- modules_install:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
- clean:
-
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules.order Module.symvers
- .PHONY: modules modules_install clean
- else#再次讀取這個Makefile檔案時,下面的執行
- MODULE_NAME := ecat #指定驅動模組的名字
- # 注意:驅動模組的名字 千萬 不能和本資料夾內的任何檔案同名!
- RESMAIN_CORE_OBJS := ecat2440.o #指定驅動模組的核心檔案(有init 和 exit)
- RESMAIN_GLUE_OBJS := ecateoe.o eoeappl.o mcihw.o ecatslv.o mailbox.o ecatappl.o #依賴檔案
-
$(MODULE_NAME)-objs := $(RESMAIN_GLUE_OBJS) $(RESMAIN_CORE_OBJS)
- #xxx-objs := 指定驅動模組的所有依賴檔案
- obj-m := ecat.o #最終由xxx-objs連結生成ecat.o,再生成ecat.ko
- endif
- # change by myself for test
方式2:
1. 本地Makefile
- #CONFIG_ECAT_DRV為m時編譯為模組,為y時編進核心
- obj-$(CONFIG_ECAT_DRV) += ecat.o
- #-objs指定依賴的多個.o檔案
- ecat-objs := ecateoe.o eoeappl.o mcihw.o ecatslv.o mailbox.o ecatappl.o ecat2440.o
2. 本地Kconfig
- #建立一個本地子目錄。“”為顯示的目錄名字
- menu "ecat driver here"
- depends on NET #依賴於上層的某個開關
- config ECAT_DRV #配置變數名,必須和Makefile中的變數後半段一樣
- bool "ecat driver"#bool量, 顯示的名字
- ---help--- #下面為要顯示的幫助文字
- This is test for ecat.
- endmenu #本地子目錄結束
3. 上層Makefile
- *
- *#新增下面這一句
- obj-$(CONFIG_ECAT_DRV) += ecat/ #開啟下一級目錄編譯
- *
- *
4. 上層Kconfig
- *
- *#新增下面這一句
- source "driver/xxx/ecat/Kconfig"
- #匯入子資料夾中的Kconfig檔案,可以為相對路徑
- *
- *
轉載自:http://blog.csdn.net/keyearth/article/details/6338614