2009年7月18日星期六

linux2.6 makefile 编译模块示例

linux2.6 makefile 编译模块示例 


下面是《linux 设备驱动程序》的一个makefile 例子
# Comment/uncomment the following line to enable/disable debugging
#DEBUG = y


ifeq ($(DEBUG),y)
  DEBFLAGS = -O -g -DSCULLD_DEBUG # "-O" is needed to expand inlines
else
  DEBFLAGS = -O2
endif

CFLAGS += $(DEBFLAGS) -I$(LDDINC)

TARGET = sculld

ifneq ($(KERNELRELEASE),)

sculld-objs := main.o mmap.o ##改模块包含2个.o文件

obj-m    := sculld.o

else

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

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

endif


install:
    install -d $(INSTALLDIR)
    install -c $(TARGET).o $(INSTALLDIR)

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

depend .depend dep:
    $(CC) $(CFLAGS) -M *.c > .depend

ifeq (.depend,$(wildcard .depend))
include .depend
endif

1.   $(shell   uname   -r)会调用uname  
-r命令并把结果展开作为值,返回值是当前内核版本号,整体来说KERNELDIR   ?=   /lib/modules/$(shell  
uname   -r)/build的含义就是在KERNELDIR未定义时赋值为:/lib/modules/2.6.xx/build  
(假设当前内核版本号为2.6.xx),这就是一个路径,一般来说会是一个符号链接,指向真正的内核源码的路径   build -> /usr/src/linux-headers-2.6.28-14-generic

2.  
modules不是伪目标,$(MAKE)   -C   $(KERNELDIR),   M=$(PWD),  
LDDINC=$(PWD)/../include   modules的含义:-C  
$(KERNELDIR)表示在读取makefile前进入$(KERNELDIR)目录,M=$(PWD),  
LDDINC=$(PWD)/../include则只是传了2个变量给Makefile,modules则是$(KERNELDIR)中的
Makefile中的target。
3.  
这个Makefile调用时有2种可能,一种是KERNELRELEASE已定义,那实际上是在内核整体编译中调用,自己参考一下现有内核部分编译的方
式;另一种则是KERNELRELEASE未定义,调用的方式应该会是类似make   modules的方式调用。

没有评论:

发表评论