前一阵子,看了 linux 驱动程序中 makefile 变量的写法,有些东西没搞清楚,所 以索性就想把关于这块的内容搞明" name="description" />
2005.08.11 来自:CSDN Naclearcase/" target="_blank" >cci
贴在这里存个档
MILY: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: 宋体">前一阵子,看了linux驱动程序中makefile变量的写法,有些东西没搞清楚,所
以索性就想把关于这块的内容搞明白,在这里感谢Dragonfly,他给我推荐了
一篇好文章,看了之后,豁然开朗,写点心得,希望大家喜欢。
原文见这里:
http://www.gnu.org/software/make/manual/html_chapter/make_6.html#SEC65
如果觉得英文烦,就听我先给各位侃侃吧,没按字翻译,写了点觉得有用的东西。
一. 为什么使用变量
变量在makefile中用来代表一个字符串,用来表示
1. 一系列文件的名字
2. 传递给编译器的参数
3. 需要运行的程序
4. 需要查找源代码的目录
5. 你需要输出信息的目录
6. 你想做的其它事情。
说白了,这有些类似于编程语言中的宏。
二. 定义变量的方式和建议
变量的名字是大小新敏感的,从大的方面来说,makefile中的变量被分为两种,一个是用=来定义的,老外叫right-hand sides of variable,另外一种是用define关键字定义的,叫做bodies of variable。先简单说这些,后面详述。
传统上使用大写字母为变量命名,但是GNU推荐使用小写字母作为makefile内部使用的变量的名字,并用大写字母定义隐式规则中的参数或在命令行中允许用户重新定义的参数。
三. 基本的变量引用
用$(name)或$来引用一个变量,所以当你要表示一个$符号时,你要使用$$。当你只使用一个字母作为变量的名字时,你可以用$name来引用这个变量,不过GNU 并不推荐这样做,因为这种方式通常用来引用自动变量(Automatic Variables)。
四. 两种风格的变量定义
GNU有两种定义变量的方式,它们的不同体现在定义它们的风格和他们被展开的方式。
第一类叫做递归展开变量(Recursively Expanded Variable)。用=或define关键字都
可以定义这种变量,如果变量的定义引用了其它的变量,那么引用会一直展开下去,
直到找到被引用的变量的最新的定义,并以此作为改变量的值返回。例如: