linux内核驱动makefile

来源:互联网 发布:金融数据库 编辑:程序博客网 时间:2024/06/05 16:22

Kbuild Makefile简要总结

  Linux2.4内核中,模块的编译只需要内核源码头文件,并在包括linux/modules.h头文件之前定义MODULES,且其编译、连接后生成的内核模块后缀为.o。而在2.6内核中,模块的编译需要依赖配置过的内核源码,编译过程首先会到内核源码目标下,读取顶层的Makefile文件,且编译、连接后生成的内核模块后缀为.ko

        2.4内核模块Makefile模板

#Makefile for linux2.4

KVER=$(shell uname -r)

KDIR=/lib/modules/$(KVER)/build

OBJS=mymodule.o

CFLAGS=-D__KERNEL__ -I$(KDIR) /include -DMODULE  

  D__KERNEL_SYSCALLS__ -DEXPORT_SYSTAB -O2 -fomit-frame-pointer -Wall 

  -DMOVERSIONS

all: $(OBJS)

  mymodule.o: file1.o file2.o

  ld -r -o $@ $^

clean:

  rm -f *.o

  Linux2.6内核中模块的Makefile模板

#Makefile for linux2.6

ifneq ($(KERNELRELEASE),)
# call from kernel build system

scull-objs := main.o pipe.o access.o

obj-m := scull.o

else

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

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

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


endif

  Linux2.6内核模板Makefile中的KERNELRELEASE是在内核源码的顶层Makefile中定义的一个变量,在第一次读取执行此MakefileKERNELRELEASE没有被定义,所以make将读取执行else之后的内容。如果make的目标是clean,将直接执行clean,然后结束;当make的目标为modules时, -C $(KERNELDIR)指明跳转到内核源码目标下读取那里的Makefile, M=$(PWD)表明之后要返回到当前目标继续读入,执行当前的Makefile。当从内核源码目标返回到当前目录时,KERNELDIR已被定义,kbuild也被启动去解析kbuild语法的语句,make将继续读取else之前的内容。else之前为kbuild语法的语句,指明模块源码中各文件的依赖关系,以及要生成的目标模块名。scull-objs := main.o pipe.o access.o表示scull.o由 main.o pipe.o access.o连接生成。obj-m := scull.o表明编译连接后将生成scull模块。

  同时支持2.42.6内核的Makefile模板

#Makefile for 2.4 2.6

VERS26=$(findstring 2.6,$(shell uname -r))

MAKEDIR?=$(shell pwd)

ifeq($(VERS26),2.6)

include $(MAKEDIR)/Makefile2.6

else

include $(MAKEDIR)/Makefile2.4

endif

  此模板根据Linux的版本调用Makefile2.6Makefile2.4进行编译。因此还需要提供2.42.6Makefile

  完成如上2.6内核同样功能的Makefile还可以这样写

#Makefile simple for 2.6

obj-m := scull.o

scull-objs := main.o pipe.o access.o

  然后在包含Makefile和源码的目标中执行如下make命令(假设内核在~/kernel-2.6中)。

make -C ~/kernel-2.6 M='pwd' modules

上述命令首先改变目标到-C选项指定的位置(即内核源代码目标),其中保存有内核的顶层makefile文件。M=选项让该makefile在构造modules目标之前返回到构造模块源代码目标。然后,modules目标指向obj-m变量中设定的模块,即scull.o

示例代码:fie8180平台 vcapMakefile

MODULE0 = fcap0

MODULE1 = fcap1

fcap_common-objs := drv_lib.o dev_lib.o fcap_osd.o fcap_proc.o debug.o

$(MODULE0)-objs := fcap_drv.o fcap_dev0.o

$(MODULE1)-objs := fcap_drv.o fcap_dev1.o

obj-m += fcap_common.o $(MODULE0).o $(MODULE1).o

obj-m := $(sort $(obj-m))

ifneq ($(KERNELRELEASE),)

CFLAGS+=-I$(SDK_MODULE_SRC)/CT656

else

PWD := $(shell pwd)

SDK_SRC := /usr/src/arm-linux-2.6/

CROSS_COMPILE=arm-linux-

sinclude $(PWD)/../module_conf

ifndef SDK_MODULE_SRC

SDK_MODULE_SRC = $(SDK_SRC)/module/

endif

include $(PWD)/config.mak

modules:

$(MAKE) -C $(SDK_SRC)/linux-2.6.14-fa SDK_MODULE_SRC=$(SDK_MODULE_SRC) M=$(PWD) modules

ifdef DEBUG_ROOT

@cp *.ko $(DEBUG_ROOT)/lib/modules

endif

clean:

$(MAKE) -C $(SDK_SRC)/linux-2.6.14-fa M=$(PWD) clean

Endif

最后会生成:fcap_common.ko, fcap0.ko, fcap1.ko

原创粉丝点击