LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2190|回复: 2

请教GNU make的扩展语法!

[复制链接]
发表于 2006-12-31 11:50:14 | 显示全部楼层 |阅读模式
小弟在分析<<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
对于上面这段注释不太明白,什么叫做从"内核构造系统调用"呢?
发表于 2007-1-3 11:29:49 | 显示全部楼层
info make
回复 支持 反对

使用道具 举报

发表于 2007-1-8 13:10:03 | 显示全部楼层
问题1:obj-m并不是从顶层定义的,你从make的语法手册上就可以找到:=和=的区别
问题2:M不是一个编译选项,而是一个变量,从顶层makefile文件里可以找到它的定义

建议看一下make的手册,网上有一本中文的《跟我学makefile》,还有关于内核编译的资料,可以在内核树下的Document下找到
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表