`

Makefile里PHONY的相关介绍

 
阅读更多
Phony Targets

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 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个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

假设你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件,但这两个文件是相互独立的——如果一 个文件需要重建,并不影响另一个。你可以使用“假象目的”来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的, 只是这个目的文件是不存在的。因此, make 总是会假设它需要 被生成,当把它的依赖文件更新后,就会执行它的规则里的命令 行。

如果在我们的 makefile 开始处输入:

all : exec1 exec2

其中 exec1 和 exec2 是我们做为目的的两个可执行文件。 make 把这个 'all' 做为它的主要目的,每次执行时都会尝试把 'all' 更新。但既然这行规则里没有哪个命令来作用在一个叫 'all' 的 实际文件(事实上 all 并不会在磁碟上实际产生),所以这个规 则并不真的改变 'all' 的状态。可既然这个文件并不存在,所以 make 会尝试更新 all 规则,因此就检查它的依靠 exec1, exec2 是否需要更新,如果需要,就把它们更新,从而达到我们的目的。

假象目的也可以用来描述一组非预设的动作。例如,你想把所有由 make 产生的文件删除,你可以在 makefile 里设立这样一个规则:

veryclean :
rm *.o
rm myprog

前提是没有其它的规则依靠这个 'veryclean' 目的,它将永远 不会被执行。但是,如果你明确的使用命令 'make veryclean' , make 会把这个目的做为它的主要目标,执行那些 rm 命令。

如果你的磁碟上存在一个叫 veryclean 文件,会发生什么事?这 时因为在这个规则里没有任何依靠文件,所以这个目的文件一定是 最新的了(所有的依靠文件都已经是最新的了),所以既使用户明 确命令 make 重新产生它,也不会有任何事情发生。解决方法是标 明所有的假象目的(用 .PHONY),这就告诉 make 不用检查它们 是否存在于磁碟上,也不用查找任何隐含规则,直接假设指定的目 的需要被更新。在 makefile 里加入下面这行包含上面规则的规则:

.PHONY : veryclean

就可以了。注意,这是一个特殊的 make 规则,make 知道 .PHONY 是一个特殊目的,当然你可以在它的依靠里加入你想用的任何假象 目的,而 make 知道它们都是假象目的。

出处:http://www.cnblogs.com/hnrainll/
分享到:
评论

相关推荐

    makefile规范及工具介绍

    【makefile规范及工具介绍】 makefile是软件开发过程中用于自动化构建、编译和测试的配置文件,它定义了一系列规则来指示编译器如何处理源代码。本文将详细阐述makefile的四大基本行类型,以及如何利用它们进行有效...

    makefile说明文章-详细介绍了makefile的用法

    - `.PHONY`:标记目标为伪目标,即使文件存在也不会跳过执行。 - `%.o : %.c`:模式规则,用于匹配所有以`.c`结尾的文件并生成相应的`.o`文件。 ### 9. 并行执行(Parallel Execution) Makefile支持并行执行命令...

    makefile示例程序,学习用

    此外,Makefile中的phony目标用于执行命令,它们并不对应实际的文件。例如: ```makefile .PHONY: clean clean: rm -f program *.o ``` `clean`就是一个phony目标,执行`make clean`会删除所有编译生成的临时文件...

    makefile详细介绍(中文)

    《makefile详细介绍(中文)》 在编程世界中,`makefile`是一个至关重要的工具,它使得自动化构建、编译和测试项目变得简单而高效。本文档将详细讲解`makefile`的各个方面,帮助读者深入理解和掌握这个强大的构建系统...

    makefile与ld介绍1

    【标题】:“makefile与ld介绍1” 【知识点详解】: 在软件开发中,`makefile`和`ld`是两个关键的工具,主要用于管理和构建项目。`makefile`是控制编译过程的脚本,而`ld`是链接器,负责将编译后的对象文件整合成...

    makefile基本语法规则

    **Makefile基本语法规则详解** Makefile是Unix/Linux环境下的一种构建工具,它定义了一系列的规则来决定哪些文件需要更新,以及如何更新。在软件开发过程中,Makefile可以帮助我们自动化编译、链接等过程,提高工作...

    Makefile实战.pdf

    * 特殊变量(special variable):Makefile 中的特殊变量,例如 .PHONY、.DELETE_ON_ERROR 等。 * 函数(function):Makefile 中的函数,例如 addprefix、filter、patsubst 等。 Makefile 的应用场景非常广泛,...

    makefile知识小介绍

    在编写Makefile时,还需要注意一些最佳实践,比如利用隐含规则减少重复代码,使用`clean`目标来清理编译产生的临时文件,以及使用`PHONY`目标来处理没有实际文件的目标。 总之,理解并熟练运用Makefile是提高Unix/...

    非常完善的makefile的编写指导说明

    总之,“非常完善的makefile编写指导说明”文档将详细介绍这些概念,并通过实例解释如何编写和优化`makefile`,确保开发者能够灵活地管理他们的C++项目。阅读并实践这份文档,你将能够轻松应对各种复杂编译场景,把`...

    Makefile文件详细解释.zip

    目标可以是文件名,也可以是伪目标(如`.PHONY`),用于执行不依赖于文件的命令。 3. **依赖项(Dependency)**: 目标依赖的文件,如果依赖项被修改,目标就会自动重建。 4. **命令(Command)**: 命令行以...

    Makefile文件例程于工程模板

    Makefile是Unix/Linux环境下自动化构建工具的核心,它用于编译、链接和其他构建过程,通过预定义的规则将源代码转化为可执行程序或库。在这个"Makefile文件例程于工程模板"压缩包中,提供了6个逐步进阶的Makefile...

    跟我一起写Makefile.pdf

    《跟我一起写Makefile》是陈皓大佬撰写的一份PDF文档,主要讲解了如何编写和理解Makefile,...陈皓大佬的这份PDF教程深入浅出地介绍了Makefile的各个方面,对于想要提升构建自动化水平的IT从业者来说是一份宝贵的资源。

    MakeFile 中文手册.pdf

    根据提供的文件信息,本手册详细介绍了Makefile的基础知识和使用方法,尤其适合初学者学习和参考。Makefile是一种生成文件的脚本语言,广泛应用于软件开发中,用于自动化构建和编译程序。以下是从标题、描述、标签和...

    linux makefile 工程管理器

    ### Linux Makefile工程管理器知识点详解 #### 一、Makefile概述 ...以上是关于 **Linux Makefile 工程管理器** 的详细介绍,通过学习这些知识点,可以更加深入地理解Makefile的工作原理及其在实际项目中的应用。

    Makefile万能通用版(C++和C混合编译也适用)

    伪目标部分定义了伪目标,例如.PHONY。条件语句部分用于控制Makefile的执行流程。 Makefile的变量定义 Makefile中定义了多个变量,例如CC、CFLAGS、CUR、SRC、TARGET等。这些变量的作用是: * CC:定义编译器,...

    Windows 下的 Makefile 编写(一)Makefile的基本规则

    ### Windows 下的 Makefile 编写(一)Makefile 的基本规则 #### 一、Makefile 概述 Makefile 是一种广泛应用于软件构建过程中的自动化脚本文件,主要用于描述项目构建过程中的依赖关系和构建步骤。对于习惯于集成...

    驾驭Makefile.zip

    在这个文档中,作者深入浅出地介绍了Makefile的原理、语法和实践技巧,对于想要深入了解Linux开发环境和提高自动化构建能力的读者来说,是一份不可多得的学习资料。 首先,Makefile的基本结构包含了一系列的目标...

    makefile中文手册

    下面我们将深入探讨Make命令和Makefile的相关知识点。 1. **Makefile的基本结构**:Makefile通常包含一系列规则,每个规则定义了一个目标(target)和依赖(dependencies),以及如何更新目标的命令(recipe)。...

    Makefile不编译已经编译过的文件

    `Makefile`还支持缓存编译结果,通过`.PHONY`指令可以告诉`make`即使目标存在,也应该执行相应的规则。例如: ```makefile .PHONY: clean clean: rm -f *.o program ``` 这里,`clean`是一个伪目标,用于清理编译...

    makefile document

    ### Makefile概述与核心知识点 #### 一、Makefile的重要性及背景 Makefile是一种用于自动化构建过程的脚本文件,广泛应用于软件开发领域。对于许多软件工程师而言,掌握Makefile的编写技巧至关重要,尤其是在Unix/...

Global site tag (gtag.js) - Google Analytics