# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := hello.o
a:
echo defined
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
echo no defined
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
这是用来编译linux驱动的常用的Makefile格式,下面主要是解释一下该Makefile的各个语句的作用。
首先 : ifneq ($(KERNELRELEASE),)
这个语句的作用是判断 $(KERNELRELEASE) 是否已经定义,若$(KERNELRELEASE) 不等于 空串的话,则说明
$(KERNELRELEASE)已经定义了,若等于空串,则说名尚未定义。
若:$(KERNELRELEASE)等于空串,则执行如下命令
KERNELDIR ?= /lib/modules/$(shell uname -r)/build :定义好linux内核源码的位置
PWD := $(shell pwd) :$(shell )可以执行shell命令,并把输出传给 pwd变量
default:
echo no defined
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules :编译
若:$(KERNELRELEASE)不等于空串,则执行
obj-m := hello.o
a:
echo defined
在源码的位置执行make指令,将会有如下的输出。
echo no defined
no defined
make -C /lib/modules/2.6.35-22-generic/build M=/root/driver/driver_demo2 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.35-22-generic'
CC [M] /root/driver/driver_demo2/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/driver/driver_demo2/hello.mod.o
LD [M] /root/driver/driver_demo2/hello.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.35-22-generic'
echo no defined
no defined
可以看出共进入该makefile两次。