|
小弟在分析<<linux device drive 3>>这本书上第2章的例子的时候,发现有很多关于makefile的语法搞不明白.还请高手指点一下,谢谢!
写的有点乱,请原谅!
[例1]
makefile:
obj-m :=module.o
命令:
make -C /usr/src/kernels/2.6.11-1.1369_FC4-i686 M='pwd' modules
问题:
1."obj-m"是在顶层makefile中定义的变量吗? 我记得makefile中变量应该是用"="赋值的,在这里用到的":="又是什么意思呢?
2.M=`pwd`中的"M"是一个编译选项吗?我一直没找到它的解释,记得以前见过SUBDIRS这个变量,在这里用SUBDIRS替换了一下"M",发现也是可以编译的.更奇怪的是,如果用
M=$(PWD)
或者SUBDIRS=$(PWD)也都是可以的(都是大写的),我现在只知道$(...)的作用是命令替换.我想请教一下PWD究竟是怎么定义的?
[例2]
#如果已经定义了KERNELRELEASE ,则说明是从内核构造系统调用的
#因此可以利用其内建语句
ifneq($KERNELRELEASE),)
obj-m :=hello.o
else
KERNELDIR ?=/lib/modules/$(shell uanme -r)/build
PWD :=$(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
这段程序感觉问题更多
问题:
1."?="是什么意思呢?
2.PWD :=$(shell pwd) PWD在这里是变量呢?还是个命令呢?必须要这么写吗?
3.$(KERNELDIR) 我觉得KERNELDIR应该是个路径,那么是不是应该用${KERNELDIR}呢?
因为如果是小括号,就是命令替换的意思了
4.#如果已经定义了KERNELRELEASE ,则说明是从内核构造系统调用的
#因此可以利用其内建语句
ifneq($KERNELRELEASE),)
obj-m :=hello.o
对于上面这段注释不太明白,什么叫做从"内核构造系统调用"呢? |
|