轉:
1. 核心子產品的Makefile
若要編譯hello的核心子產品,最簡單的方法就是要編寫如下内容的Makefile(若對Makefile比較陌生,請參考Linux開發基礎講義):
-----------------------------------------------------------------------
ifeq ($(KERNELRELEASE),)
KERNELDIR ?=/usr/src/kernels/2.6.18-8.el5xen-i686 #指向你的核心代碼目錄
#KERNELDIR ?=/home/eetek/linux-2.6.29-eetek
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules #編譯核心子產品的指令
clean: #删除生成的所有檔案
rm -rf modules.* *.o *~ core .depend .*.cmd *.ko
rm –rf *.mod.c .tmp_versions Module*
.PHONY: modules modules_install clean
else
obj-m := hello.o #你要編譯的子產品名稱
endif
-----------------------------------------------------------------------
對于上述的Makefile需要特别說明如下幾點:
(1) $(MAKE) -C $(KERNELDIR) M=$(PWD) modules #編譯核心子產品的指令
ü 了解這條指令,首先需要了解make指令選項-C的作用,-C是指Change Directory。
ü MAKE是Makefile中的宏變量,和KERNELDIR相似,要引用這個宏變量的值需要使用$符号。在這裡實際上就是指向make程式。注:此時應該寫為$(MAKE),而不能寫成$MAKE,請思考為什麼。
ü M=$(PWD) 是指要編譯的核心子產品的源程式在那個目錄下,$(PWD)指與Makefile在同一目錄下,也就是目前目錄。(pwd指令的作用是:print work directory).modules指明要按照核心子產品的方式編譯。
結合起來了解,就是進入$(KERNELDIR)的目錄,并且執行make指令,如果沒有M=$(PWD) modules,make –C $(KERNELDIR)将是編譯Linux核心映像的指令。M=$(PWD) modules也就是按照$(KERNELDIR)中核心子產品的方式編譯$(PWD)目錄下的程式。modules實際上是$(KERNELDIR)目錄下的Makefile的一個Target入口.
既然是為$(KERNELDIR)編譯核心子產品,是以必須要求$(KERNELDIR)這個核心必須正确配置,并且得到編譯的,以為編譯子產品的過程需要使用核心配置的相關資訊,比如處理器的類型等。至于如何配置Linux核心,請參考Linux系統移植過程中的相關實驗。
(2) obj-m = hello.o #你要編譯的子產品名稱
這裡必須和$(PWD)目錄下C程式檔案的名稱相對應,如果C程式檔案為world.c,那麼必須修改成obj-m = world.o.
和很多C語言程式一樣,一個核心子產品也可能有多個C程式檔案,那麼如何修改Makefile讓其編譯成一個核心子產品呢?此時,需要将obj-m = hello.o換成如下代碼:
Obj-m = hello.o
Hello-objs = hello1.o, hello2.o
(3) clean是Makefile的入口,其目的是為了清除所有生成的檔案。
本文來自CSDN部落格,轉載請标明出處:http://blog.csdn.net/stephanxu/archive/2010/03/26/5417926.aspx