makefile模組編譯模板
阿新 • • 發佈:2019-02-07
Makefile模板為:
- ifneq ($(KERNELRELEASE),)
- obj-m := memdev.o
- else
- KDIR := /home/study/4-3-1/linux-2.6.29
- all:
- make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
- clean:
- rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*
- endif
解析:
ifneq ($(KERNELRELEASE), ) //判斷KERNELRELEASE是否定義,KERNELRELEASE是在linux核心原始碼中主 Makefile中定義的
obj-m := memdev.o //編譯生成目標檔案
else //若KERNELRELEASE沒有否定義
KDIR := /home/study/4-3-1/linux-2.6.29
// KDIR是本Makefile 依賴的linux核心原始碼路徑 ,如是交叉編譯時就取開發板上執行的原始碼路徑
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
M=$(PWD) //取當前的路徑
ARCH=arm //編譯在ARM平臺上執行的程式
CROSS_COMPILE=arm-linux- //使用交叉編譯工具對其進行編譯
//到linux原始碼所在的目錄執行主Makefile 並當前路徑傳給主Makefile,告訴主Makefile執行完後返回到當前目錄,執行Makefile,
endifKERNELRELEASE 是在核心原始碼的頂層Makefile中定義的一個變數,在第一次讀取執行此Makefile時, KERNELRELEASE沒有被定義,所以make將讀取執行else之後的內容。如果make的目標是clean,直接執行clean操作,然後結 束。當make的目標為all時,-C $(KDIR) 指明跳轉到核心原始碼目錄下讀取那裡的Makefile;M=$(PWD) 表明然後返回到當前目錄繼續讀入、執行當前的Makefile。當從核心原始碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啟動去 解析kbuild語法的語句,make將繼續讀取else之前的內容。else之前的內容為kbuild語法的語句, 指明模組原始碼中各檔案的依賴關係,以及要生成的目標模組名。obj-m := memdev.o表示編譯連線後將生成memdev.o模組。