Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Makefile 之 .PHONY 的神奇玩法

  最近正在把手上的项目一个个从 Grunt/Gulp 的噩梦中干掉,直接使用 Makefile 来构建。但其中也遇到了许多问题,比如这回要说的 .PHONY 就是个问题。在 Makefile 中 .PHONY 用于将 target 视为虚拟的,以便这个 target 在调用 make 命令时不受真实文件的影响。
  大家对 .PHONY 这东西的用法都是添加一个叫 .PHONY 的 target,然后把其他需要虚拟化的 target 的添加到这个叫 .PHONY 的 target 上作为依赖。比如这样: clean:
.PHONY: clean
  看到大家都这么用,感觉好像确实没什么问题。但网络上使用 Makefile 的大部分都是用来构建 C/C++ 项目的,用它来构建前端项目的同予者何人?用于前端项目的构建就可能会产生大量的 phony taget,如果把这些 target 一个个手动添加到 .PHONY 的依赖上看起来特别不爽,而且还容易漏掉。比如这么一坨东西: .PHONY: install help build all clean clean-all watch dev deploy   有什么办法可以实现 .PHONY 又不用那么写的么?好像有吧?把 target 添加到 .PHONY 的依赖中是为了让 target 被 make 时不去检查依赖文件是否更新。如果一个文件存在,并且没有依赖,不加到 .PHONY 中就会出现 make: `XXX' is up to date.   这是因为 makefile 检查到文件存在的话就要检查其依赖是否是最新的,如果没有依赖或依赖的文件也是最新的就会出现这个问题。既然它会检测依赖,那么我们给它添加一个永远都能检测到最新的依赖不就好了?比如一开始我这么干 xxx: /dev/null   虽然勉强能用,但这是不靠谱的。于是我有想,如果给它添加另一个 phony 的依赖不就永远都是最新依赖了么?比如 .PHONY: noop
xxx: noop
  这么写确实解决了问题,只要在所有本身没有依赖的 phony target 的依赖中都加上 noop 即可。甚至可以这么写(但是不推荐,因为会执行 .PHONY 的依赖,如果真有的话就麻烦了),因为 .PHONY 本身就是个 target。 .PHONY:
xxx: .PHONY
  于是问题彻底解决,不用每次再拖到 Makefile 的文件末尾,给 .PHONY 加上一坨依赖。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^