Linux Device Driver - Hello World - 2
前篇 : Linux Device Driver - Hello World - 1
續前篇繼續介紹.
用 右邊網址搜尋 , 發現之前寫過一篇
Linux 模組範例
Makefile 簡介
難怪有些印象..
這篇說一下 github 的 Makefile 比較特別的地方:
https://github.com/neojou/linuxdevicedriver/blob/master/testwifi-1-helloworld/Makefile
用過 Makefile 的會知道, 一般打 make 指的就是 make all
所以可以從 all: 開始 trace.
冒號右邊指的是要滿足的條件
所以接下來會執行 modules: 底下所列的動作.
( 寫過 Makefile 會知道, 動作前的需要打 tab , 而不能是 空白,
因為 make是上世紀開發出的工具.. )
--
在 前篇 LDD3 中的 2.4.1 編譯模塊 有提到
make modules 時, 有多內核 makefile 參數 obj-m / <module name>-objs .
obj-m := module.o
module-objs := file1.o file2.o
obj-m : 該 module 的.o 檔
module-objs : 該 module 用到的 obj files
--
所以 此 Makefile
MODULE_NAME 定義 在 rtl8822b.mk 中,
MODULE_NAME = 88x2bu
Makefile 有 include
----------------------------------
make -C $(KSRC) -M=$(shell cmd) modules
-C : kernel source 目錄
M= 模塊源碼目錄
書中也有介紹這段 :
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
Makefile 第一次執行的時候, KERNELRELEASE 並不會被設置.
做到 make modules 時, 會設置起來, 並第二次讀取執行 Makefile
這是因為做 make -C $(KSRC) modules 時,
會用到 $(KSRC) , kernel source 底下的 Makefile
e.g. /lib/modules/4.4.3-040403-generic/build/Makefile
而在該Makefile 檔中, 會定義變數 KERNELRELEASE
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)
續前篇繼續介紹.
用 右邊網址搜尋 , 發現之前寫過一篇
Linux 模組範例
Makefile 簡介
難怪有些印象..
這篇說一下 github 的 Makefile 比較特別的地方:
https://github.com/neojou/linuxdevicedriver/blob/master/testwifi-1-helloworld/Makefile
用過 Makefile 的會知道, 一般打 make 指的就是 make all
所以可以從 all: 開始 trace.
冒號右邊指的是要滿足的條件
所以接下來會執行 modules: 底下所列的動作.
( 寫過 Makefile 會知道, 動作前的需要打 tab , 而不能是 空白,
因為 make是上世紀開發出的工具.. )
--
在 前篇 LDD3 中的 2.4.1 編譯模塊 有提到
make modules 時, 有多內核 makefile 參數 obj-m / <module name>-objs .
obj-m := module.o
module-objs := file1.o file2.o
obj-m : 該 module 的.o 檔
module-objs : 該 module 用到的 obj files
--
所以 此 Makefile
MODULE_NAME 定義 在 rtl8822b.mk 中,
MODULE_NAME = 88x2bu
Makefile 有 include
########### HAL_RTL8822B ################################# ifeq ($(CONFIG_RTL8822B), y) include $(TopDIR)/rtl8822b.mk endif
export CONFIG_RTL8822BU = m
obj-$(CONFIG_RTL8822BU) := $(MODULE_NAME).o
$(MODULE_NAME)-y += $(_OS_INTFS_FILES)
-- 而 Makefile 開頭有定義 變數 _OS_INTFS_FILES
ifeq ($(CONFIG_USB_HCI), y) HCI_NAME = usb endif _OS_INTFS_FILES := os_dep/linux/$(HCI_NAME)_intf.o
----------------------------------
make -C $(KSRC) -M=$(shell cmd) modules
-C : kernel source 目錄
書中也有介紹這段 :
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
Makefile 第一次執行的時候, KERNELRELEASE 並不會被設置.
做到 make modules 時, 會設置起來, 並第二次讀取執行 Makefile
這是因為做 make -C $(KSRC) modules 時,
會用到 $(KSRC) , kernel source 底下的 Makefile
e.g. /lib/modules/4.4.3-040403-generic/build/Makefile
而在該Makefile 檔中, 會定義變數 KERNELRELEASE
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION)
驚!
回覆刪除