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

########### 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 目錄

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)



留言

張貼留言

熱門文章