Makefile中.PHONY的作用

单词phony (即phoney)的意思是:伪造的,假的。来自collins的解释是:

If you describe something as phoney, you disapprove of it because it is false
rather than genuine. 

那么,在Makefile中,.PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件。

举个例子:

$ cat -n Makefile1
     1    clean:
     2        rm -f foo
$ cat -n Makefile2
     1    .PHONY: clean
     2    clean:
     3        rm -f foo

Makefile1和Makefile2的差别就是在Makefile2中定义了:

1 .PHONY: clean
  • 直接Make看看
$ ls -l
total 8
-rw-r--r-- 1 huanli huanli 18 Jul 13 17:51 Makefile1
-rw-r--r-- 1 huanli huanli 32 Jul 13 17:51 Makefile2
$ make -f Makefile1 clean
rm -f foo
$ make -f Makefile2 clean
rm -f foo

Makefile1和Makefile2的行为没有啥子区别嘛,呵呵

  • 创建一个文件clean, 再make看看
$ touch clean
$ ls -l
total 8
-rw-r--r-- 1 huanli huanli  0 Jul 13 18:06 clean
-rw-r--r-- 1 huanli huanli 18 Jul 13 17:51 Makefile1
-rw-r--r-- 1 huanli huanli 32 Jul 13 17:51 Makefile2
$ make -f Makefile1 clean
make: ‘clean‘ is up to date.
$ make -f Makefile2 clean
rm -f foo

区别来了,Makefile1拒绝了执行clean, 因为文件clean存在。而Makefile2却不理会文件clean的存在,总是执行clean后面的规则。由此可见,.PHONY clean发挥了作用。

小结:

.PHONY: clean
    o means the word "clean" doesn‘t represent a file name in this Makefile;
    o means the Makefile has nothing to do with a file called "clean"
      in the same directory.

参考资料:

原文地址:https://www.cnblogs.com/idorax/p/9306528.html

时间: 2024-08-28 04:30:07

Makefile中.PHONY的作用的相关文章

makefile中的all和.PHONY的作用

请编写一个makefile同时编译.链接下面两个程序: 1 main1.c: 2 #include<stdio.h> 3 int main(void) 4 { 5 printf("main1\n"); 6 } 7 main2.c: 8 #include<stdio.h> 9 int main(void) 10 { 11 printf("main2\n"); 12 } [分析]:这里需要生成两个可执行文件main1和main2(两个目标).由于

Makefile中头文件在依赖关系中作用

摘于:http://bbs.csdn.net/topics/120024677 (1)在makefile的依赖关系中用不用体现.h头文件?(2)如果在依赖关系中要体现.h头文件,应该体现到什么层次?==============================(1)在makefile的依赖关系中用不用体现.h头文件?============================== 下面是我的一些认识: 头文件中定义的是接口(函数接口,文件外全局变量和宏定义),它的作用是向调用文件封装函数的实现过程.在

.PHONY makefile中的伪目标

我的理解: 拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令. 为了避免出现这个问题,需要.PHONY: clean ======================================================================================= 所谓伪目标就是这样一个目标,它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们将一个伪

makefile 中定义宏位置需要注意一下

1 CUR_DIR = $(shell pwd) 2 3 CFLAGS = -g -Wall 4 GCC = gcc 5 GXX = g++ 6 7 TARGET = exe.out 8 9 SRC_FILES += $(shell find $(CUR_DIR) -name *.cc) 10 += $(shell find $(CUR_DIR) -name *.cpp) 11 12 OBJS = fatal-impl.o log.o 13 14 INCLUDE += -I. 15 RM = r

makefile里PHONY的相关介绍

Phony Targets PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字.有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能. 如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行.例如: clean: rm *.o temp因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行.如果目录中出现了"clean"文件,则规则失效

makefile中条件判断与函数

1. 条件判断 1.1 语法 条件表达式的语法为: <conditional-directive> <text-if-true> endif 以及: <conditional-directive> <text-if-true> else <text-if-false> endif 其中<conditional-directive>表示条件关键字,如"ifeq".这个关键字有四个. (1)第一个是我们前面所见过的&q

makefile 中 [email&#160;protected] $^ %&lt; 使用

这篇文章介绍在LINUX下进行C语言编程所需要的基础知识.在这篇文章当中,我们将会学到以下内容: 源程序编译 Makefile的编写 程序库的链接 程序的调试 头文件和系统求助 1.源程序的编译 在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面我们以一个实例来说明如何使用gcc编译器. 假设我们有下面一个非常简单的源程序(hello.c): int main(int argc,char **argv) { printf("Hello Linux\n"

Makefile中的函数

Makefile 中的函数 Makefile 中自带了一些函数, 利用这些函数可以简化 Makefile 的编写. 函数调用语法如下: $(<function> <arguments>) # 或者 ${<function> <arguments>} <function> 是函数名 <arguments> 是函数参数 1.1 字符串函数 字符串替换函数: $(subst <from>,<to>,<text&

[转]Makefile中使用$$的使用

http://blog.chinaunix.net/uid-12072359-id-2960866.html 在makefile中,会经常使用shell命令,也经常见到$var 和 $$var的情况,有什么区别呢,区别大了.不要认为在makefile的规则的命令行中使用$var就是将makefile的变量和shell共享了,这里仅仅是读取makefile的变量然后扩展开,将其值作为参数传给了一个shell命令.而$$var是在访问一个shell命令内定义的变量,而非makefile的变量.此外,