0 須知
核心源碼樹需要已經成功編譯過一次才可以進行子產品的編譯
1.指令行形式
make -C ~/kernel-2.6 M=`pwd` modules
- -C make進入linux源碼所在檔案夾,進而獲得核心的頂層Makefile,進而利用kbuild進行外部子產品的編譯
- -M make在執行目标前傳回到子產品源代碼所在檔案夾
- modules目标将會編譯所有包含在obj-m變量下的module.o檔案
2.Makefile
可以通過編寫Makefile來利用make指令減少輸入的指令
2.1 示例
#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
2.2 代碼解釋
- 通過判斷變量
是否為空來判斷目前make程序是在核心源碼樹中啟動還是在源碼樹外啟動$(KERNELRELEASE)
- 在源碼樹外執行make指令時,該Makefile将被執行兩次。首先判斷變量
為空,則設定$(KERNELRELEASE)
和KERNELDIR
變量來确定核心源碼所在檔案夾以及子產品源檔案夾。然後再調用再第一節中所介紹的指令進行子產品的編譯。PWD
- 當make指令被調用後,由于進入核心源碼目錄獲得了核心的頂層Makefile檔案,變量
不為空,則設定$(KERNELRELEASE)
變量,利用kbuild進行子產品的編譯obj-m
2.3 KERNELEIR
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
為了獲得系統源代碼樹,利用了系統已安裝子產品中的軟連接配接build來指向kernel build tree。
如果要使用的核心版本不是系統中正在使用的核心,可以通過再指令行中重設
KERNELEIR
變量或者修改Makefile中的值來更改核心源檔案的目錄。
3 參考文獻
Linux Device Driver 3