zoukankan      html  css  js  c++  java
  • .PHONY的作用

    .PHONY 后面定义的是伪目标

    所谓伪目标就是这样一个目标,它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们将一个伪目标成为标签。

    为什么要使用伪目标,一种为了避免在makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突,另一种是提交执行makefile时的效率。

     

    第一种情况:

    如果我们需要书写这样的一个规则:规则所定义的命令不是去创建目标文件,而是通过make命令行明确指定它来执行一些特点的命令,就像例题中的clean。当文件夹中没有clean这个文件的时候,我们输入"make clean"能按照初衷执行,但是一旦文件夹中出现clean文件,我们再次输入"make clean",由于这个规则没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义的命令。所以rm命令不会被执行。为了解决问题,我们将目标clean定义成伪目标。

    也就是添加:

    .PHONY:clean

    那么目录中不论是否有clean文件,只要输入"make clean"就能执行rm命令了。

    当一个目标被声明为伪目标后,make在执行规则时不会去试图去查找隐含规则来创建它。这样就提高了make的执行效率,也不用担心由于目标和文件名重名了。

    第二种情况:

    伪目标的另一种使用场合时在make的并行和递归执行过程中。

    给了例子:

    SUBDIRS=foo bar baz
            Subdirs:
                    for dir in $(SUBDIRS)
                    do
                    $(MAKE) –C $$dir
                    done

    如果这样写,会出现几个问题:

    1、 当子目录执行make出现错误,make不会退出;

    2、 使用这种shell的循环方式时,没有用到make对目录的并行处理功能。

    有了伪目标就可以解决上面的两个问题。

    SUBDIRS=foo bar baz
            .PHONY:subdirs $(SUBDIRS)
            subdirs: $(SUBDIRS)
            $(SUBDIRS):
                    $(MAKE) –C $@

    一般情况下,一个伪目标不作为另一个目标的依赖。当一个伪目标没有作为任何目标的依赖时,我们只能通过make命令来明确指定它为make的终极目标,来执行它所在规则所定义的命令。

    还有一个特别的伪目标——all,如果我们在一个目录下创建多个可执行程序,我们可以将所有程序的重建规则在一个makefile中描述。

    all: p1 p2 p3
            p1:p1.c
            p2:p2.c
            p3:p3.c

  • 相关阅读:
    dp思维
    快速幂+地推
    背包问题找物品
    石子合并问题
    hihocoder 1580 Matrix(北京icpc2017网络赛)
    ACM对拍造数据
    主席树学习小结(POJ 2104)
    莫队算法入门 BZOJ 2038
    hdu 2586
    Kattis
  • 原文地址:https://www.cnblogs.com/yangjiquan/p/11475638.html
Copyright © 2011-2022 走看看