makefile入门 自动化变量
时间:2007-04-06 来源:ganqing1234
makefile中的$@的用法:$@为自动化变量
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) >; $@
$(subst output,,$@) 表示执行一个makefile函数(实话我不太明白,$(var)不是取一个变量值吗?但这里是取函数subst的值, output 和 $@为参数)
上面的等价于:
bigoutput : text.g
generate text.g -big >; bigoutput
littleoutput : text.g
generate text.g -little >; littleoutput
根据资料上说$(subst <arg> <args> )为一个字符串处理函数
$(subst <from>;,<to>;,<text>;)
名称:字符串替换函数——subst。
功能:把字串<text>;中的<from>;字符串替换成<to>;。
返回:函数返回被替换过后的字符串。
例如: $(subst ee,EE,feet on the street)
把“feet on the street”中的“ee”替换成“EE”,返回结果是“fEEt on the strEEt”。
事实上 makefile 支持的函数不多,估计不可以自定义函数用:-)
扯远了继续说自动化变量:
所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现在规则的命令中。
$@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是 "bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。
$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$?
所有比目标新的依赖目标的集合。以空格分隔。
$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$*
这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的 值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文 件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以," $*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或 是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。
实话看了还是不太懂,没有例子啊!
资料来源:http://www.chinaunix.net/jh/23/408225.html 写的很好!
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) >; $@
$(subst output,,$@) 表示执行一个makefile函数(实话我不太明白,$(var)不是取一个变量值吗?但这里是取函数subst的值, output 和 $@为参数)
上面的等价于:
bigoutput : text.g
generate text.g -big >; bigoutput
littleoutput : text.g
generate text.g -little >; littleoutput
根据资料上说$(subst <arg> <args> )为一个字符串处理函数
$(subst <from>;,<to>;,<text>;)
名称:字符串替换函数——subst。
功能:把字串<text>;中的<from>;字符串替换成<to>;。
返回:函数返回被替换过后的字符串。
例如: $(subst ee,EE,feet on the street)
把“feet on the street”中的“ee”替换成“EE”,返回结果是“fEEt on the strEEt”。
事实上 makefile 支持的函数不多,估计不可以自定义函数用:-)
扯远了继续说自动化变量:
所谓自动化变量,就是这种变量会把模式中所定义的一系列的文件自动地挨个取出,直至所有的符合模式的文件都取完了。这种自动化变量只应出现在规则的命令中。
$@
表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
$%
仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是 "bar.o","$@"就是"foo.a"。如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。
$<
依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。
$?
所有比目标新的依赖目标的集合。以空格分隔。
$^
所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的,那个这个变量会去除重复的依赖目标,只保留一份。
$+
这个变量很像"$^",也是所有依赖目标的集合。只是它不去除重复的依赖目标。
$*
这个变量表示目标模式中"%"及其之前的部分。如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么,"$*"的 值就是"dir/a.foo"。这个变量对于构造有关联的文件名是比较有较。如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文 件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分。例如:如果目标是"foo.c",因为".c"是make所能识别的后缀名,所以," $*"的值就是"foo"。这个特性是GNU make的,很有可能不兼容于其它版本的make,所以,你应该尽量避免使用"$*",除非是在隐含规则或 是静态模式中。如果目标中的后缀是make所不能识别的,那么"$*"就是空值。
实话看了还是不太懂,没有例子啊!
资料来源:http://www.chinaunix.net/jh/23/408225.html 写的很好!
相关阅读 更多 +