曲径通幽论坛

标题: $+,$*,$(@D),$(@F),$(*D),$(*F),$(%D),$(%F),$(%D),$(%F),$(<D),$(<F),$(^D) [打印本页]

作者: beyes    时间: 2011-7-1 17:44
标题: $+,$*,$(@D),$(@F),$(*D),$(*F),$(%D),$(%F),$(%D),$(%F),$(&lt;D),$(&lt;
$+
$^ 表示所有依赖文件列表。一个文件可重复出现在目标的依赖中,$^ 只记录它的一次引用情况,也就是说 $^ 会去掉重复的依赖文件。$+ 类似于 $^,但它保留了依赖文件中重复出现的文件。下面举例说明这两个变量的区别。

先在一个目录下建立  3 个文件:
$ echo "are" > test1.txt
$ echo "you" > test2.txt
$ echo "ok" > test3.txt

测试代码
[code=Makefile]all:test1.txt test2.txt test3.txt test1.txt
    $(shell cat $^ > integra1)
    $(shell cat $+ > integra2)
[/mw_shl_code]
运行输出
beyes@debian:~/Makefile/prereq$ cat integra1
are
you
ok
beyes@debian:~/Makefile/prereq$ cat integra2
are
you
ok
are
由输出可以很清楚的看到这两个变量的区别。

$*
$* 有一个形象的词来称呼它 --- “茎” 。如果目标文件名中带有一个可识别的后缀,那么 $* 就表示文件中移除后缀以外的部分。比如 main.o 作为目标时,$* 就表示为 main 。如果目标包含不可识别的后缀时,该变量为空。

$(@D)
代表目标文件的目录部分(要去掉目录部分的最后一个斜杠),如下例所示:
[code=Makefile]/home/beyes/Makefile/main.o:
    @echo $(@D)[/mw_shl_code]
运行输出:
$ make
/home/beyes/Makefile
如果目标中不包含斜杠,那么输出值为 '.' 表示当前目录。

$(@F)
目标文件的完整文件名初目录以外的部分,换句话说表示的是实际的文件名。如下示例:
[code=Makefile]/home/beyes/Makefile/main.o:
    @echo $(@F)[/mw_shl_code]
运行输出:
$ make
main.o

$(*D) 和 $(*F)
分别表示目标 “茎” 中的目录部分和文件名部分。如下示例:
[code=Makefile]/home/beyes/Makefile/main.o:
    @echo $(*D)
    @echo $(*F)[/mw_shl_code]
运行输出:
$ make
/home/beyes/Makefile
main

$(%D) 和 $(%F)
当以 "archive(member)" 这样形式的静态库为目标时,分别表示库文件成员 "member" 名中的目录部分和文件名部分。它仅对这种形式的规则目标有效。如下示例:
[code=Makefile]Mylib.a(/home/beyes/main/are.o):
    @echo $(%D)
    @echo $(%F)[/mw_shl_code]
运行输出:
$ make
/home/beyes/main
are.o

$(<D) 和 $(<F)
分别表示规则中第一个依赖文件的目录部分和文件名部分。如下示例:
[code=Makefile]/home/beyes/main/are.o:
    @echo hello

something.o:
    @echo makefile

all:/home/beyes/main/are.o something.o
    @echo $(<D)
    @echo $(<F)[/mw_shl_code]
运行输出:
$ make all
hello
makefile
/home/beyes/main
are.o

$(^D) 和 $(^F)
分别表示所有依赖文件的目录部分和文件部分(不存在同一文件)。如下示例:
/home/beyes/main/are.o:
    @echo hello

/home/beyes/something.o:
    @echo makefile

all:/home/beyes/main/are.o /home/beyes/something.o
    @echo $(^D)
    @echo $(^F)
运行输出:
$ make all
hello
makefile
/home/beyes/main /home/beyes
are.o something.o

$(+D) 和 $(+F)
分别表示所有依赖文件的目录部分和文件部分(可存在重复文件)。

$(?D) 和 $(?F)
分别表示被更新的依赖文件的目录部分和问及文件部分。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2