zoukankan      html  css  js  c++  java
  • makfile中.PHONY的认识

    install:foo
             install   -m  644 foo  /usr/bin
    .PHONY: install
     看以上makefile的片段,使用了.PHONY这个目标,下面详细介绍她的用法.
    来源:点击打开链接
    .PHONY是一个特殊工作目标(special target)
        它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)
      PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件,虽然在写比较小的makefile工程的时候看不出来.PHONY的好处,但是当面对一些大工程的时候,.PHONY则显得相当有用),改善性能。
      如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。
      例如:
      clean:
      rm *.o temp
      因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有
        依赖文件,文件"clean"始终是最新的,命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。如:
      .PHONY : clean
      这样执行"make clean"会无视"clean"文件存在与否。
      已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。
      完整的例子如下:
      .PHONY : clean
      clean :
      rm *.o temp
      phony 目标不应是真正目标文件的依赖。如果这样,每次make 在更新此文件时,命令都会执行。只要phony 目标不是真正目标的依赖,规则的命令只有在指定此目标时才执行。
      phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
      all : prog1 prog2 prog3
      .PHONY : all
      prog1 : prog1.o utils.o
       cc -o prog1 prog1.o utils.o
      prog2 : prog2.o
       cc -o prog2 prog2.o
      prog3 : prog3.o sort.o utils.o

       cc -o prog3 prog3.o sort.o utils.o

    ==========================================================================

    # The "tools" are needed early, so put this first
    # Don't include stuff already done in $(LIBS)
    SUBDIRS = tools
    post
    post/cpu
    .PHONY : $(SUBDIRS)

    ===========================================================

    上面这段makefile,声明SUBDIRS为一个假象目标,那么当Makefile中调用到SUBDIRS的时候,每次都要更新这个SUBDIRS,也就是每次make都会重新读取这个SUBDIRS。

    代码中中还有:

    .PHONY : $(LIBS)

    # Make links to executive here so that the .c files are in place before dependency generation
    .PHONY: links
    links:
    make -C lib_mips -f links.mk links
    作者“pstary”

  • 相关阅读:
    在django如何使用中文
    《Jamie Zawinski访谈:在折腾中成长》读后感
    django处理静态文件
    [转]敏捷就循环往复的不断改进 & 测试不是寻找Bug的游戏 & 成功实施敏捷的十二种模式
    event.preventDefault()
    字符设备驱动Linux异常处理体系结构
    2.字符设备驱动按键中断及休眠
    内核中的宏定义__init、__initdata和__exit、__exitdata
    阻塞和非阻塞,同步和异步的概念辨析
    1.字符设备驱动Linux中断处理体系结构
  • 原文地址:https://www.cnblogs.com/java20130722/p/3206905.html
Copyright © 2011-2022 走看看