`
yesjavame
  • 浏览: 654051 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Phony Targets

 
阅读更多

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 知道它们都是假象目的。

分享到:
评论

相关推荐

    [修复下载链接]iPhone5S和iPad4上编译C/C++

    iphone-gcc 4.2-20080604-1-8p a native c compiler on the phone ldid 1:1.1.1 pseudo-codesign Mach-O files make 3.81-2p dependency-based build environments mobile substrate 0.9.5000 powerful code ...

    AppResLibGenerator:为 Windows Phone Silverlight 项目生成 AppResLib.dll*.mui 文件的助手

    这些键可在 AppResLib.targets 文件中配置。 AppResLib.dll 和 .mui 文件将包含在您的项目输出中。 要使用这些本地化字符串,您需要将 WMAppManifest.xml 中的硬编码字符串替换为 @AppResLib.dll,-100 以使用从 ...

    Front-End.Web.Development.The.Big.Nerd.Ranch.Guide.2016.8.pdf

    You will build code that targets the browser platform available on nearly every phone, tablet and computer. You will build a series of projects as you work through the book, learning a range of ...

    详解iOS Project和Targets配置

    最近开始学习完整iOS项目的开发流程和思路,在实际的项目开发过程中,我们通常需要对项目代码和资料进行版本控制和管理,一般比较常用的SVN或者Github进行代码版本控制和项目管理。我们iOS项目的开发工具Xcode本来就...

    Developing Adobe AIR Applications for Android

    Hit targets Memory allocation Drawing API Event bubbling Optimizing video performance Adobe Confidential: This information is only provided to the AIR for Android prerelease Do not redistribute ...

    SignalR – Real-time Application Development, 2nd (pdf英文原版第二版)

    Next you will learn building a client for WPF and building a client using Xamarin that targets Windows Phone, iPhone and Android. Lastly, you will learn how to monitor the traffic in SignalR using ...

    手机 发短信协议 源代码

    手机 发短信协议 源代码 Sms_config.java Sms_msg_t.java Sms_phone.java Sms_server.java Targets.java TCPrespServer.java

    “Microsoft_Press_eBook_CreatingMobileAppswithXamarinForms_PDF”.pdf

    for targeting Windows 8.1 and Windows Phone 8.1 devices, and the Universal Windows Platform (UWP), which is a form of the Windows Runtime that targets Windows 10 and Windows 10 Mobile devices with a ...

    ironbelly:您值得拥有的Grin:mobile_phone:钱包

    ./scripts/init.sh // add needed targets for rust 的iOS 让我们先安装Xcode构建工具 xcode-select --install 建立项目 转到项目目录并运行: cd rust ./scripts/build.sh release ios # All iOS related code ...

    iOS 4 高级编程

    Welcome to Advanced iOS 4 Programming, a text that targets the development of mobile applications on devices (such as the iPhone, iPad, and iPod touch) running the iOS 4 operating system. This text ...

    OSMlib:OSMlib 是一个带有用于 iOS iPhone iPad 项目的 util 类的库

    取消选中“复制项目”并将其添加到“相对于项目” 将 OSMlib.a 文件拖到项目 Targets 下的“Link binary with library”文件夹使用 OSMlib 头文件告诉您的项目:打开“项目设置”构建选项卡并搜索“用户头搜索路径...

    iOS 人机交互指南(iOS Human Interface Guidelines)

    Make Targets Fingertip-Size 60 Use Subtle Animation to Communicate 61 Support Gestures Appropriately 62 Ask People to Save Only When Necessary 63 Make Modal Tasks Occasional and Simple 63 Start ...

    Essentials of Developing Windows Store Apps Using C#

    With universal Windows apps, it’s finally possible to create an app that targets both PCs (desktops, laptops, tablets, and hybrids) and phones simultaneously. Universal apps also represent a ...

    Development of a perceptually calibrated objective metric of noise

    phone cameras. Stimuli with different overall magnitudes of noise and with varying mixtures of red, green, blue, and luminance noises were included in the study. Eleven treatments in each of ten ...

    聊天应用

    学习使用制作iOS应用 :mobile_phone: | 项目存根| (Swift 4.0 / Xcode 9)-Flash Chat应用 入门:将入门项目文件下载为.zip并将其解压缩到桌面。 Pro:将Git克隆到Xcode项目文件夹。 Podfile配置 post_install do ...

    GesturePassword-master:九宫格密码验证

    GesturePasswordiOS手势密码###新添加2014年9月10日新添加了 判断是否已存在...简单使用方式下载后直接把 GesturePassword 下的GesturePassword文件丢到项目中去在 TARGETS - Build Phases - "KeychainItemWrapper.m"

    iOS:html解析

    Expand Targets Double Click on your project name Select All Configuration Search for Header Search Path Add this line below with recursive option ${SDKROOT}/usr/include/libxml2 Search for ...

    message-analyzer:分析我们的对话

    消息分析器 分析我们的短信/ FB Messenger消息 子模块: 设置 使用Python 3.6.5。... CONTACT_INFO = <phone> ABSOLUTE_PATH = NAME = TARGETS = <An array of the names of the users, ie. ['Lucy','Bill'] MO

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

Global site tag (gtag.js) - Google Analytics