您的位置:首页 > 运维架构 > Linux

Linux设备驱动程序:gnu make 扩展语法

2013-02-12 17:45 267 查看
/************************************************************************************

原文地址:http://www.cppblog.com/aaxron/archive/2012/03/16/168055.html

说明:这里的Makefile和应用程序中的稍有不一样,特转载过来。

************************************************************************************/
要点:

在用户空间驱动程序

insmod

modprobe

rmmod

一些宏:

LINUX_VERSION_CODE

整数宏

GNU make 扩展语法

obj-m +=hello.o

KERNELDIR := /usr/src/linux-headers-2.6.32-5-686

PWD :=$(shell pwd)

.PHONY: test clean all

all:

$(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versionsm *.order *.symvers .tmp_versions

test:

insmod ./hello.ko

rmmod hello

dmesg -c

obj-m

由内核构造系统使用的makefilet符号,用来确定在当前目录中应构造哪些模块.

即m:指定把对象编译为模块

obj-y

指定把对象编译进内核中

如果我们要构造的模块为module.ko,并由file1.c和file2.c则正确的makefile可如下编写:

obj-m :=module.o

module-objs :=file1.o file2.o

为了让上面的makefile可以工作,必须在大的内核构造系统环境中调用它们,所以上述命令首先要改变-C指定的目录,即:

$(MAKE) -C $(KERNELDIR)

然后指定M变量目录,即让makefile在构造modules目标之前返回到模块源代码的目录,既当前目录 M=$(PWD),最后modules目标指向obj-m变量中设定的模块.

M不是一个编译选项,而是一个变量,从顶层makefile文件里可以找到它的定义

文件在

/usr/src/linux-headers-2.6.32-5-common/Makefile

69 ifeq ("$(origin M)", "command line")

70 KBUILD_EXTMOD := $(M)

71 endif

-C 用于指定内核源代码的目录

-M 用于module所在的目录



如果一个模块包括了多个.c文件(如 file1.c , file2.c),则应该以如下方式编写Makefile

obj-m := modulename.o

module-objs := file1.o file2.o
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: