天天看點

linux外部子產品編譯——利用kbuild進行編譯0 須知1.指令行形式2.Makefile

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 代碼解釋

  • 通過判斷變量

    $(KERNELRELEASE)

    是否為空來判斷目前make程序是在核心源碼樹中啟動還是在源碼樹外啟動
  • 在源碼樹外執行make指令時,該Makefile将被執行兩次。首先判斷變量

    $(KERNELRELEASE)

    為空,則設定

    KERNELDIR

    PWD

    變量來确定核心源碼所在檔案夾以及子產品源檔案夾。然後再調用再第一節中所介紹的指令進行子產品的編譯。
  • 當make指令被調用後,由于進入核心源碼目錄獲得了核心的頂層Makefile檔案,變量

    $(KERNELRELEASE)

    不為空,則設定

    obj-m

    變量,利用kbuild進行子產品的編譯

2.3 KERNELEIR

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
           

為了獲得系統源代碼樹,利用了系統已安裝子產品中的軟連接配接build來指向kernel build tree。

如果要使用的核心版本不是系統中正在使用的核心,可以通過再指令行中重設

KERNELEIR

變量或者修改Makefile中的值來更改核心源檔案的目錄。

3 參考文獻

Linux Device Driver 3

繼續閱讀