在makefile中使用'空目标'

最近我一直在尝试进入GNU Make的概念。 阅读时,我遇到了一个名为Empty Target的主题。 从GNU Make手册我知道的是

空目标是虚假目标的变体; 它用于保存您不时要求明确请求的操作的配方。 与假目标不同,这个目标文件可以真正存在; 但文件的内容并不重要,通常都是空的。

空目标文件的目的是用最后修改时间记录最后一次执行规则配方的时间。 它是这样做的,因为配方中的一个命令是更新目标文件的触摸命令。

从另一个来源,我读了这样的东西

空目标与假目标类似,因为目标本身被用作利用make功能的设备。 假目标总是过时的,所以它们总是执行并且总是导致它们的依赖(与先决条件相关联的目标)被重新制定。 但是,假设我们有一些命令,没有输出文件,只需要偶尔执行,我们不希望我们的家属更新? 为此,我们可以制定一个规则,其目标是一个空文件(有时称为cookie):

prog: size prog.o
$(CC) $(LDFLAGS) -o $@ $^

size: prog.o
size $^
touch size

请注意,大小规则在完成后使用touch创建一个名为大小的空文件。 这个空文件用于其时间戳,以便make只有在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]#
    

    makefile 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中,类似条件的输出是相同的。 所以,我不清楚空目标的具体使用范围 。 如果它们仅用于保存时间戳,那么我们可以在不使用它们的情况下达到相同的效果。 [或者与自动变量$? 关于我还没有详细阅读]。 任何人都可以用其他一些措辞解决这种困惑,可能有一些例子(如果我没有问太多)?

    谢谢,欢呼!


    在你的情况下,你已经有了一个目标(大小),当你的源文件有一个目标时它会改变。 所以在你的例子中,gcc就像触摸一样。 但是,在您的第一个链接中,如果您看一下示例:

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

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

    Makefile文件:

    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更改重命名为“打印”的文件的时间戳,现在该规则引用现有文件:

    Makefile文件:

    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更新。

    链接地址: http://www.djcxy.com/p/64117.html

    上一篇: Use of 'Empty Target' in makefile

    下一篇: only targets as in GNU Make