Makefile目标类型大汇总

模式规则中的目标形式是多种多样的,它可以是一个或多个的文件,也可以是一个伪目标,或者其他的类型,下面是对这些类型的详细说明。

强制目标

如果一个目标中没有命令或者依赖,并且它的目标不是一个存在的文件名,则在执行此规则时,目标总会被认为是最新的。也就是说,这个规则一旦被执行,make 就认为这个规则的目标已经被更新过。这样的目标在作为另外一个规则的依赖时,因为它总被认为更新过,所以它所在的规则中定义的命令总会被执行。

看下面的一个例子。这个例子中,目标 "FORCE" 符合上边的条件。它作为目标 "clean" 的依赖,在执行 make 的时候,总被认为更新过,因此 "clean" 所在的规则的命令总会被执行。这样的一个目标通常我们将其命名为 "FORCE"。

clean:FORCErm $(OBJECTS)
FORCE:

例子中使用 "FORCE" 目标的效果和将 "clean" 声明为伪目标的效果相同。

空目标文件

空目标文件是伪目标的一个变种,执行此目标的目的和伪目标相同,都是make时通过命令行指定将其作为终极目标,来执行此规则所定义的命令。和伪目标不同的是,这个目标可以是一个存在的文件,但文件的具体内容我们并不关心,通常此文件是一个空文件。

空目标文件只是用来记录上一次执行此规则的命令的时间。在这样的规则中,命令部分都会使用 "touch" 在完成所有的命令之后来更新目标文件的时间戳,记录此规则命令的最后执行时间。make 时通过命令行将此目标作为终极目标,如果当前目标下不存在此文件,"touch" 会在第一次执行时创建一个的文件。

通常,一个空目标文件应该存在一个或者多个依赖文件。将这个目标作为终极目标,在它所依赖的文件比它更(第四声)新时,此目标所在的规则的命令将被执行,也就是说,如果空目标文件的依赖文件被改变之后,空目标文件所在的规则中定义的命令会被执行。

看一个例子:

print:foot.c bar.clpr -p $?touch print

执行 "make print",当目标文件 "print" 的依赖文件被修改之后,命令 "lpr -p $?" 都会被执行,打印这个被修改的文件。

特殊的目标

名称功能
.PHONY:这个目标的所有依赖被作为伪目标。伪目标是这样一个目标:当使用 make 命令行指定此目标时,这个目标所在的规则定义的命令,无论目标文件是否存在都会被无条件执行。
.SUFFIXES:这个目标的所有依赖指出了一系列在后缀规则中需要检查的后缀名
.DEFAULT:Makefile 中,这个特殊目标所在规则定义的命令,被用在重建那些没有具体规则的目标,就是说一个文件作为某个规则的依赖,却不是另外一个规则的目标时,make 程序无法找到重建此文件的规则,这种情况就执行 ".DEFAULT" 所指定的命令。
.PRECIOUS:这个特殊目标所在的依赖文件在 make 的过程中会被特殊处理:当命令执行的过程中断时,make 不会删除它们。而且如果目标的依赖文件是中间过程文件,同样这些文件不会被删除。
.INTERMEDIATE:这个特殊目标的依赖文件在 make 执行时被作为中间文件对待。没有任何依赖文件的这个目标没有意义。
.SECONDARY:这个特殊目标的依赖文件被作为中过程的文件对待。但是这些文件不会被删除。这个目标没有任何依赖文件的含义是:将所有的文件视为中间文件。
.IGNORE这个目标的依赖文件忽略创建这个文件所执行命令的错误,给此目标指定命令是没有意义的。当此目标没有依赖文件时,将忽略所有命令执行的错误。
.DELETE_ON_ERROR:如果在 Makefile 中存在特殊的目标 ".DELETE_ON_ERROR" ,make 在执行过程中,荣国规则的命令执行错误,将删除已经被修改的目标文件。
.LOW_RESOLUTION_TIME:这个目标的依赖文件被 make 认为是低分辨率时间戳文件,给这个目标指定命令是没有意义的。通常的目标都是高分辨率时间戳。
.SILENT:出现在此目标 ".SILENT" 的依赖文件列表中的文件,make 在创建这些文件时,不打印出此文件所执行的命令。同样,给目标 "SILENT" 指定命令行是没有意义的。
.EXPORT_ALL_VARIABLES:此目标应该作为一个简单的没有依赖的目标,它的功能是将之后的所有变量传递给子 make 进程。
.NOTPARALLEL:Makefile 中如果出现这个特殊目标,则所有的命令按照串行的方式执行,即使是存在 make 的命令行参数 "-j" 。但在递归调用的子make进程中,命令行可以并行执行。此目标不应该有依赖文件,所有出现的依赖文件将会被忽略。

多规则目标

Makefile 中,一个文件可以作为多个规则的目标。这种情况时,以这个文件为目标的规则的所有依赖文件将会被合并成此目标一个依赖文件列表,当其中的任何一个依赖文件比目标更新时,make 将会执行特定的命令来重建这个目标。

对于一个多规则的目标,重建这个目标的命令只能出现在一个规则中。如果多个规则同时给出重建此目标的命令,make 将使用最后一个规则中所定义的命令,同时提示错误信息。某些情况,需要对相同的目标使用不同的规则中所定义的命令,我们需要使用另一种方式——双冒号规则来实现。

一个仅仅描述依赖关系的描述规则可以用来给出一个或者是多个目标文件的依赖文件。例如,Makefile 中通常存在一个变量,就像我们以前提到的 "objects" ,它定义为所有的需要编译的生成 .o 文件的列表。这些 .o 文件在其源文件中包含的头文件 "config.h" 发生变化之后能够自动的被重建,我们可以使用多目标的方式来书写 Makefile:

objects=foo.o bar.o
foo.o:defs.h
bar.o:defs.h test.h
$(objects):config.h

这样做的好处是,当源文件增加或者删除了包含的头文件,不用修改已存在的 Makefile 的规则,只需要增加或者删除某一个 .o 文件依赖的头文件。这种方式很简单也很方便。

我们也可以通过一个变量来增加目标的依赖文件,使用 make 的命令行来指定某一个目标的依赖头文件,例如:

extradeps=
$(objects):$(exteradeps)

它的意思是:如果我们执 "make exteradeps=foo.h" 那么 "foo.h" 将作为所有的 .o 文件的依赖文件。当然如果只执行 "make" 的话,就没有指定任何文件作为 .o 文件的依赖文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460696.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站故障排查几个简单步骤

1、top命令查看cpu消耗多少(id%的值和%cpu要是一直是几百就是问题了。%wa要是大于30%也是压力大了)。还有看负载的3个值(和cpu线程是1比1关系。要是值大于线程书,那么也是压力过大。)top命令要是发现cpu消耗过多,可以知道是哪几个进程了。2、查看硬盘使用…

isset、empty、var==null、is_null、var===null详细理解

//isset: 判断变量是否被初始化 //它并不会判断变量是否为空,并且可能用来判断数组中元素是否被定义 //听说在数组用isset与array_key_exists高出4倍 $a ""; $ar[c] ""; if(!isset($a)){echo $a not isset\r\n; }else{echo $a iss…

Makefile中常见的错误信息

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 make 执行过程中所产生错误并不都是致命的,特别是在命令行之前存在 "-"、或者 make 使用 "-k" 选项执行时。 make 执行过程的致命错误都带有前缀字符…

Javascript中call函数和apply函数的使用

Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: sourceObj.method.call(destObj,params1,params2) 是将sourceObj中…

Makefile隐含规则

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。 隐含规则的含义 隐含规则,就是我们做出一些具体的操作后,系统自动推导完成。 编写 Makefile 的时候,可以使用隐含规则来简化Makefile 文件编写。 下…

WIN7 Wireshark: There are no interfaces on which a capture can be done

有的时候我们在Windows7的环境下使用Wireshark的时候,比如点击【Interface List】的时候,出现错误。 错误内容如下: There are no interfaces on which a capture can be done. 这个错误是因为系统没有启动NPF服务造成的。 解决的办法很简单&…

搭建wordpress开发环境

安装php PHP下载地址:http://windows.php.net/download/ 和MySQL一样,下载包是一个zip压缩包,只需解压缩即可。将它解压缩到 D:\WNMP\php-5.5.6-Win32-VC11-x64目录下: 配置php 将php.ini-production文件复制并重命名为php.ini,并…

GCC和CC的区别

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 参考博客:Difference Between GCC and CC Compiler - Ask Any Difference 参考博客:Linux新手学堂:CC与GCC的区别概括介绍 - Prayer - C博客 总结 1、作用 GCC和CC都是…

Leetcode Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 对于这道题最开始用的是用一个数组存储新建的节点,然后对random的索引时比较快。 后来在…

sharepoint 2007页面显示真实的错误信息

打开下面path的web.config文件:C:\Program Files\Common Files\Microsoft Shared\Web ServerExtensions\12\TEMPLATE\LAYOUTS修改&#xff1a;<system.web>... <customErrors mode"Off" />...</system.web>如果没有就添加&#xff1a;<SharePoi…

Shell循环(for,while,until,break与continue)

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 一、for循环 for循环一般格式为&#xff1a; for 变量 in 列表 docommand1command2...commandN done 列表是一组值&#xff08;数字、字符串等&#xff09;组成的序列&#xff0c;每个值通过…

业界重磅新书《UNIX/Linux网络日志分析与流量监控》首发

《UNIX/Linux网络日志分析与流量监控》出版社官网&#xff1a; http://www.cmpbook.com/stackroom.php?id39384 每本图书附赠51CTO学院的价值100元学习卡一张京东&#xff1a;http://item.jd.com/11582561.html机械工业出版社在线购书平台&#xff1a;http://www.golden-book.…

Git工具使用基础

Git 是一个分布式的版本控制工具&#xff0c;本篇文章从介绍Git开始&#xff0c;重点在于介绍Git的基本命令和使用技巧&#xff0c;让你尝试使用Git的同时&#xff0c;体验到原来一个版 本控制工具可以对开发产生如此之多的影响&#xff0c;文章分为两部分&#xff0c;第一部分…

Shell case esac语句

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 case语句格式 case 值 in 模式1)command1command2command3;; 模式2&#xff09;command1command2command3;; *)command1command2command3;; esac 取值后面是关键字 in。取值可以为变量或常数…

Shell test命令

以下内容源于C语言中文网的学习与整理&#xff0c;如有侵权&#xff0c;请告知删除。 Shell中的 test 命令用于检查某个条件是否成立&#xff0c;它可以进行数值、字符和文件三个方面的测试。这其实相当于一个中括号&#xff1f; 一、数值测试 参数说明-eq等于则为真-ne不等于…

DDOS的攻击原理和防护指南

我们现在来分析DDOS的攻击原理。 首先&#xff0c;DDOS是英文Distributed Denial of Service的缩写&#xff0c;意思是分布式拒绝服务。拒绝服务又是什么意思呢&#xff1f;就是采取一些垃圾数据包来阻塞网站的网络通道&#xff0c;导致让网站不能正常访问。分布式服 务拒绝攻击…

Python基础笔记,后续更新

1,避免‘\n’等特殊字符的两种方式&#xff1a;1&#xff0c;利用转义字符‘\’2&#xff0c;利用原始字符‘r’ print rc:\now3,字符串中嵌入双引号等特殊符号1&#xff0c;利用转义字符‘\’2&#xff0c;使用单引号括起这个字符串 print (i l"o"ve fis.com)2…

.NET:如何让线程支持超时?

背景 本文是为了回复博客园一个兄弟的问题&#xff0c;主要回答两个问题&#xff1a; 如何让线程支持超时&#xff1f;如何让线程在执行结束后销毁&#xff1f;MS 现在不推荐使用低级别的 Thread 编程&#xff0c;而推荐使用 Task&#xff0c;另外我多数情况都是做企业应用&…

第1章 Express MongoDB 搭建多人博客

学习环境 Node.js &#xff1a; 0.10.22 Express &#xff1a; 3.4.4 MongoDB &#xff1a; 2.4.8 快速开始 安装 Express express 是 Node.js 上最流行的 Web 开发框架&#xff0c;正如他的名字一样&#xff0c;使用它我们可以快速的开发一个 Web 应用。我们用 express 来搭…

用UltraISO制作的u盘ubuntu11.04,启动失败解决方案

错误提示&#xff1a;SYSLINUX 3.84 2009-12-18 EBIOS Copyright c 1994-2009 H.Peter Anvin et al 折腾的很久&#xff0c;尝试用Pauly的bootice&#xff0c;结果可以从u盘启动了。 先用UltraISO制作好u盘ubuntu11.04。 下载bootice&#xff0c;把u盘插上去&#xff0c;打开软…