PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能。

所谓的PHONY这个单词就是伪造的意思,makefile中将.PHONY放在一个目标前就是指明这个目标是伪文件目标,如下:
.PHONY:clean
这里clean目标没有依赖文件,如果执行make命令的目录中出现了clean文件,由于其没有依赖文件,所以它永远是最新的,所以根据make的规则clean目标下的命令是不会被执行的。如下的例子:

[yangfan@dhcp-13-42 test]$ cat Makefile
obj = 1.c 2.c 3.c 4.c

all:
touch $(obj)
clean:
rm -rf $(obj)
[yangfan@dhcp-13-42 test]$
[yangfan@dhcp-13-42 test]$ make
touch 1.c 2.c 3.c 4.c
[yangfan@dhcp-13-42 test]$ ls
1.c 2.c 3.c 4.c Makefile
[yangfan@dhcp-13-42 test]$ make clean
rm -rf 1.c 2.c 3.c 4.c
[yangfan@dhcp-13-42 test]$ ls
Makefile
[yangfan@dhcp-13-42 test]$ make
touch 1.c 2.c 3.c 4.c
[yangfan@dhcp-13-42 test]$ touch clean
[yangfan@dhcp-13-42 test]$ ls
1.c 2.c 3.c 4.c clean Makefile
[yangfan@dhcp-13-42 test]$ make clean
make: `clean' is up to date.
[yangfan@dhcp-13-42 test]$ ls
1.c 2.c 3.c 4.c clean Makefile
[yangfan@dhcp-13-42 test]$

这个Makefile中all目标是创建空的1.c 2.c 3.c 和4.c 。  clean目标是删除这些文件,但是如果当前目录中出现了一个clean文件,在执行
make clean时就不会在执行clean目标下的命令了。下面看看在clean目标前加上.PHONY之后的情况:

[yangfan@dhcp-13-42 test]$ cat Makefile
obj = 1.c 2.c 3.c 4.c

all:
touch $(obj)
.PHONY: clean
clean:
rm -rf $(obj)
[yangfan@dhcp-13-42 test]$ ls
1.c 2.c 3.c 4.c clean Makefile
[yangfan@dhcp-13-42 test]$ make clean
rm -rf 1.c 2.c 3.c 4.c
[yangfan@dhcp-13-42 test]$ ls
clean Makefile
[yangfan@dhcp-13-42 test]$

Makefile 中的.PHONY的更多相关文章

  1. Makefile中 的 phony target,empty target

    phony target Makefile的语法很简单 <target> : <prerequisites> [tab] <commands> 目标.先决条件.命令 ...

  2. Makefile中.PHONY的作用

    单词phony (即phoney)的意思是:伪造的,假的.来自collins的解释是: If you describe something as phoney, you disapprove of i ...

  3. makefile中PHONY的重要性

    伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签.伪目标通过   PHONY来指明. PHONY定义伪目标的命令 ...

  4. .PHONY makefile中的伪目标

    我的理解: 拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令. 为了避免出现这个问题,需要.PHONY: clean === ...

  5. Makefile 中会在多处地方看到 FORCE

    转载:http://blog.csdn.net/wzw88486969/article/details/11739737 在内核的 Makefile 中会在多处地方看到 FORCE ,比如: # vm ...

  6. makefile中伪目标的理解

    1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c  gcc -c ...

  7. makefile中.PHNOY的用法

    makefile中PHONY的重要性 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签.伪目标通过   PHON ...

  8. 关于makefile中自动产生依赖的理解

    本博文是在学习了<GNU Make中文手册>后记录下来的自己的关于自动产生makefile依赖的语句的理解,向大家分享. <GNU make中文手册>中的相关章节见一下链接: ...

  9. [转] Makefile 基础 (7) —— Makefile 中 make 的运行

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客:(最原始版本) http://blog.csdn.net/haoel/article/details/2886 我转自 ...

随机推荐

  1. Androi:ViewPager

    Android ViewPager控件的使用(基于ViewPager的横向相册)!!!: http://blog.csdn.net/Android_Tutor/article/details/7980 ...

  2. 560. Subarray Sum Equals K

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  3. expdp和impdp 使用注意事项

    使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用, ...

  4. 测试开发之Django——No6.Django模板中的标签语言

    模板中的标签语言 1.if/else {% if  %} 标签检查(evaluate)一个变量,如果这个变量为真(即:变量存在,非空,不是布尔值假),系统会显示在{% if  %} 和 {% endi ...

  5. LeetCode(62):不同路径

    Medium! 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“F ...

  6. poj3410单调队列(单调栈)

    思路:求每个人的左使者就是从左到右把每个人加入到单调队列中去,加入时最后一个出队的就是那个最大的小于这个数的数 求右信使同理 由于本题的单调队列队头不需要出队,所以其实是一个单调栈 /* 每个人只要找 ...

  7. 【C++ Primer | 19】嵌套类、局部类

    嵌套类 #include <iostream> using namespace std; class c1 { public: int a; void foo(); class c2 { ...

  8. Struts2的常见的配置文件介绍

    1:package 定义一个包. 包作用,管理action. (通常,一个业务模板用一个包) 常见属性及其说明:  (1)name  包的名字:以方便在其他处引用此包,此属性是必须的. 包名不能重复: ...

  9. 为什么Nginx性能比Apache高

    Nginx的工作原理 nginx在启动后,会有一个master进程和多个worker进程.master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控wo ...

  10. 异常Cannot get a text value from a numeric cell

    POI操作Excel时偶尔会出现Cannot get a text value from a numeric cell的异常错误. 异常原因:Excel数据Cell有不同的类型,当我们试图从一个数字类 ...