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的方式调用。
没有评论:
发表评论