linux内核学习-驱动程序模板MAKEFILE

驱动程序的几个实例采用宏定义函数实现,用来在测试模式下输出

ssize_t DriverRead(struct file *pslFileStruct, char __user *pBuffer, size_t nCount, loff_t *pOffset)
{
    DEBUG_PRINT(DEVICE_NAME ": read invoked, do nothing\n");
    return 0;
}
//这里是头文件中的宏定义函数
#ifdef TEST_DEBUG
#define DEBUG_PRINT_LINE(...) do{printk(KERN_ALERT "ErrLine : %s::%d\nErrorInfo : ", __FILE__, __LINE__); printk(KERN_ALERT __VA_ARGS__);}while(0) #define DEBUG_PRINT(...) printk(KERN_ALERT __VA_ARGS__) #else #define DEBUG_PRINT_LINE(...) #define DEBUG_PRINT(...) #endif

 

编译的Makefile函数如下

ifneq ($(KERNELRELEASE),)
        obj-m := PrintModule.o
        PrintModule-objs := DriverMain.o DriverFileOperations.o ToolFunctions.o
EXTRA_CFLAGS := -DTEST_DEBUG -ggdb -O0
else
        KERNELDIR ?= /lib/modules/$(shell uname -r)/build
        #KERNELDIR ?= /root/kernelsrc/linux-3.13
        PWD := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD)                
        rm *.order *.symvers *.mod.c *.o .*.o.cmd .*.cmd .tmp_versions -rf
endif

首先检查KERNELRELEASE是否被定义,一开始是没有的所以直接跳过到else,根据系统对KERNELDIR和PWD赋值,接着开始执行default后的命令

在这里执行MAKE操作,-C切换到KERNELDIR文件夹下,也就是执行KERNELDIR里的顶层Makefile

在该Makefile中,定义了KERNELRELEASE,  M:表示在构造模块之前,回到目录PWD,再次执行当前目录下的Makefile   执行过程中EXTRA_CFLAGS:=-D 定义了程序是在TEST_DEBUG宏作用下

*如果KERNELRELEASE被定义了,则程序只会执行一次循环而不会再次执行default,否则一直循环直到KERNELRELEASE被定义

**这是通过什么措施实现的?不理解

 

posted @ 2017-02-21 22:20  闲人五衰  阅读(477)  评论(0编辑  收藏  举报