【发布时间】:2014-01-01 00:20:31
【问题描述】:
最近我一直在尝试深入了解 GNU Make 的概念。在阅读时,我遇到了一个名为Empty Target的话题。从GNU Make manual我知道的是
空目标是虚假目标的变体;它用于保持 您不时明确请求的操作的配方。 与虚假目标不同,这个目标文件可以真实存在;但是 文件的内容无关紧要,通常是空的。
空目标文件的目的是记录,其 上次修改时间,规则的配方最后一次执行的时间。它 这样做是因为配方中的命令之一是触摸命令 更新目标文件。
来自another source,我读到了这样的内容
空目标类似于虚假目标,因为目标本身 用作利用 make 功能的设备。假 目标总是过时的,所以它们总是执行并且它们总是 导致他们的依赖(与先决条件相关的目标) 被重制。但是假设我们有一些没有输出文件的命令, 只需要偶尔执行,我们不希望我们的 家属更新了吗?为此,我们可以制定一个目标是 空文件(有时称为 cookie):
prog: size prog.o $(CC) $(LDFLAGS) -o $@ $^ size: prog.o size $^ touch size注意 size 规则使用 touch 创建一个名为 完成后的大小。这个空文件用于它的时间戳,所以 只有当 prog.o 更新。此外, prog 的大小先决条件不会强制 prog 的更新,除非它的目标文件也更新。
通过阅读他们的理解是
- 空目标用于维护时间戳
- 空目标的内容不感兴趣,只有更新时间 是。
为了动手实践,我编写了两个示例 makefile
makefile 1
使用空目标
prog: size prog.o
gcc -o $@ prog.o
size: prog.o
size $<
touch size
prog.o: prog.c
gcc -c $<
输出
[sourav@localhost Practice]# make
gcc -c prog.c
size prog.o
text data bss dec hex filename
58 0 0 58 3a prog.o
touch size
gcc -o prog prog.o
[sourav@localhost Practice]# make
make: `prog' is up to date.
[sourav@localhost Practice]# touch prog.c //suppose some real change in the file
[sourav@localhost Practice]# make
gcc -c prog.c
size prog.o
text data bss dec hex filename
58 0 0 58 3a prog.o
touch size
gcc -o prog prog.o
[sourav@localhost Practice]#
生成文件 2
没有空目标使用
prog: prog.o
size $^
gcc -o $@ prog.o
prog.o: prog.c
gcc -c $<
输出
[sourav@localhost Practice]# make
gcc -c prog.c
size prog.o
text data bss dec hex filename
58 0 0 58 3a prog.o
gcc -o prog prog.o
[sourav@localhost Practice]# make
make: `prog' is up to date.
[sourav@localhost Practice]# touch prog.c
[sourav@localhost Practice]# make
gcc -c prog.c
size prog.o
text data bss dec hex filename
58 0 0 58 3a prog.o
gcc -o prog prog.o
[sourav@localhost Practice]#
在上述两个不同的 makefile 中,相似条件的输出是相同的。所以,我不清楚空目标的特定使用范围。如果它们仅用于保存时间戳,那么我们可以在不使用它们的情况下实现相同的目的。 [或者与我尚未详细阅读的自动变量$? 相关]。任何人都可以用其他一些措辞来解决这种混淆,可能有一些例子(如果我没有要求太多的话)?
谢谢你,干杯!!
【问题讨论】: