例:
file1.o file2.o:head.h
gcc $*.c -o &@
两行加起来就叫一条规则,第一行叫依赖关系,第二行叫命令。
命令里使用自动变量是一个$,如:$@,依赖关系里使用是两个$$,如:$$@
目标相关:
$@,规则中的目标集,如上例中的file1.o或者file2.o,上面的规则会分别执行两次gcc以生成两个目标。
$*,规则中目标集的“茎”,如上例中的file1 file2,去除.o
依赖相关:
$<,规则的第一个依赖文件名。如果是一个目标文件使用隐含规则来重建,则它代表由隐含规则加入的第一个依赖文件。
$?,所有比目标文件更新的依赖文件列表,空格分割。如果目标是静态库文件名,代表的是库成员(.o文件)。
$^,规则的所有依赖文件列表,使用空格分隔。如果目标是静态库文件,它所代表的只能是所有库成员(.o文件)名。一个文件可重复的出现在目标的依赖中,变量“$^”只记录它的一次引用情况。变量“$^”会去掉重复的依赖文件。
$+,和“$^”类似,但是它保留了依赖文件中重复出现的文件。主要用在程序链接时库的交叉引用场合。
库专用:(非库也可以用,但是会为空)
$%,表示静态库的一个成员名。例如,规则的目标是“foo.a(bar.o)”,那么,“$%”的值为“bar.o”, “$@”的值为“foo.a”。
$>,表示静态库的目标名。例如,规则的目标是“foo.a(bar.o)”,那么,“$> ”的值为“
foo.a ”, 和“$@”的值相同。
$@、$<、$%、$* 这四个代表规则中的文件名,其它的代表文件列表。
GUN make中,还可以通过这些自动化变量来获取一个完整文件名中的目录部分和具体文件名部分。在这些变量中加入“D”或者“F”字符就形成了一系列变种的自动环变量。
如:
$(@D),表示目标文件的目录部分(不包括斜杠)。如果“$@”是“dir/foo.o”,那么“$(@D)”的值为“dir”。如果“$@”不存在斜杠,其值就是“.”(当前目录)。注意它和函数“dir”的区别!
$(@F),目标文件的完整文件名中除目录以外的部分(实际文件名)。如果“$@”为“dir/foo.o”,那么“$(@F)”只就是“foo.o”。“$(@F)”等价于函数“$(notdir $@)”。
阅读(659) | 评论(0) | 转发(0) |