linux驅動之模塊化驅動Makefile

本文摘自http://blog.csdn.net/lufeiop02/article/details/6446343linux

 

Linux驅動通常以模塊module的形式來加載,首先須要把驅動編譯成模塊的形式。簡單的例子,shell

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
 
static int __init test_init(void)
{
       printk("init module/n");

       return 0;
}
static void __exit test_exit(void)
{
       printk("exit modules/n");
}
 
module_init(test_init);
module_exit(test_exit);

 

Makefile爲:ui

PWD = $(shell pwd)
KERNEL_SRC = /usr/src/linux-source-2.6.15/
 
obj-m := test.o
module-objs := test.o
 
all:
       $(MAKE) -C $(KERNEL_SRC) M=$(PWD) modules

       
clean:
       rm *.ko
       rm *.o

 

在test.c和Makefile所在的目錄下運行make,若是看到相似輸出spa

make -C /usr/src/linux-source-2.6.15/ M=/home/vmeth modules

make[1]: Entering directory `/usr/src/linux-source-2.6.15'
  CC [M]  /home/vmeth/hello.o
  Building modules, stage 2.
  MODPOST
  CC      /home/vmeth/hello.mod.o
  LD [M]  /home/vmeth/hello.ko
make[1]: Leaving directory `/usr/src/linux-source-2.6.15'

 

通常用下面的Makefile:.net

# Makefile2.6
ifneq ($(KERNELRELEASE),)
#kbuild syntax. dependency relationshsip of files and target modules are listed here.

mymodule-objs := hello.o
obj-m := hello.o   

else
PWD  := $(shell pwd)

KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build #KDIR目錄實際上是連接到上面那個Makefile中的那個
                                         /usr/src/linux-source-2.6.15/*中
all:
       $(MAKE) -C $(KDIR) M=$(PWD)

clean:
       rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

endif

 

KERNELRELEASE 是在內核源碼的頂層Makefile中定義的一個變量,在第一次讀取執行此Makefile時,KERNELRELEASE沒有被定義,因此make將讀取執行else以後的內容。
當make的目標爲all時,-C $(KDIR) 指明跳轉到內核源碼目錄下讀取那裏的Makefile;M=$(PWD) 代表而後返回到當前目錄繼續讀入、執行當前的Makefile。
當從內核源碼目錄返回時,KERNELRELEASE已被被定義,kbuild也被啓動去解析kbuild語法的語句,make將繼續讀取else以前的內容。else以前的內容爲kbuild語法的語句, 指明模塊源碼中各文件的依賴關係,以及要生成的目標模塊名。
每一個內核的名字都包含了它的版本號,這也是 uname -r 命令顯示的值。
關於報如下錯誤的解決方法:
Makefile:1: *** 遺漏分隔符
這個有多種狀況:
1,命令前要加tab鍵
2,可能標點符號輸成中文形的了
3,好比上面那個文件:ifneq後面要加個空格
相關文章
相關標籤/搜索