【问题标题】:Use of 'Empty Target' in makefile在 makefile 中使用“空目标”
【发布时间】: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 中,相似条件的输出是相同的。所以,我不清楚空目标的特定使用范围。如果它们仅用于保存时间戳,那么我们可以在不使用它们的情况下实现相同的目的。 [或者与我尚未详细阅读的自动变量$? 相关]。任何人都可以用其他一些措辞来解决这种混淆,可能有一些例子(如果我没有要求太多的话)?

谢谢你,干杯!!

【问题讨论】:

    标签: c makefile gnu-make


    【解决方案1】:

    在您的情况下,您已经有一个目标(大小),当您的源文件之一发生时,它会发生变化。 因此,在您的示例中, gcc 的作用类似于触摸。 但是,在您的第一个链接中,如果您看一下示例:

     print: foo.c bar.c
             lpr -p $?
             touch print
    

    这里没有touch printmake print 将始终执行lpr -p,因为打印规则不引用更改的文件。以 ls 为例:

    生成文件:

    print: foo.c bar.c
           ls $?
    

    制作打印(1):

    ls foo.c bar.c
    bar.c foo.c
    

    打印(2):

    ls foo.c bar.c
    bar.c foo.c
    

    但是,现在如果make print 更改重命名为“print”的文件的时间戳,则现在规则引用现有文件:

    生成文件:

    print: foo.c bar.c
           ls $?
           touch print
    

    制作打印(1):

    ls foo.c bar.c
    bar.c foo.c
    

    打印(2):

    make: `print' is up to date.
    

    因为文件打印比 foo.c 和 bar.c 更新。

    【讨论】:

      猜你喜欢
      • 2013-02-06
      • 2012-10-31
      • 1970-01-01
      • 2021-06-02
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多