当前位置:网站首页>11.书写规则-伪目标
11.书写规则-伪目标
2022-07-29 02:18:00 【其木王·王子】
1. PHONY
执行:
make [目标]
若没有目标,默认第一个目标。
.PHONY : clean
clean:
rm *.o temp
像我们前面例子中的“clean”一样,即然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)
因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以 make 无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。
当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向 make 说明,不管是否有这个文件,这个目标就是“伪目标”。
.PHONY : clean
只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“makeclean”这样。于是整个过程可以这样写:
.PHONY: clean
clean:
rm *.o temp
2. 为伪目标指定所依赖的文件
伪目标一般没有依赖的文件。但是,我们也可以为伪目标指定所依赖的文件。伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的 Makefile 需要一口气生成若干个可执行文件,但你只想简单地敲一个 make 完事,并且,所有的目标文件都写在一个 Makefile 中,那么你可以使用“伪目标”这个特性:
.PHONY : all
all : prog1 prog2 prog3
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
我们知道,Makefile 中的第一个目标会被作为其默认目标。我们声明了一个“all”的伪目标,其依赖于其它三个目标。由于伪目标的特性是,总是被执行的,所以其依赖的那三个目标就总是不如“all”这个目标新。所以,其它三个目标的规则总是会被决议。也就达到了我们一口气生成多个目标的目的。“.PHONY : all”声明了“all”这个目为“伪目标”。
3. 让伪目标成为依赖
从上面的例子我们可以看出,目标也可以成为依赖。所以,伪目标同样也可成为依赖。看下面的例子:
.PHONY: cleanall cleanobj cleandiff
cleanall : cleanobj cleandiff
rm program
cleanobj :
rm *.o
cleandiff :
rm *.diff
“make clean”将清除所有要被清除的文件。“cleanobj”和“cleandiff”这两个伪目标有点像“子程序”的意思。我们可以输入“make cleanall”和“make cleanobj”和“make cleandiff”命令来达到清除不同种类文件的目的。
边栏推荐
- Cloud development pocket toolbox wechat applet source code
- Mqtt routine
- KBxxxxxx不一定是补丁,也可能是某个问题解决方案的描述
- Polygon zkevm - Introduction to HERMEZ 2.0
- VR safety training of mine mining virtual reality improves employees' vigilance and protection awareness
- QT qstringlist usage
- 新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题开源全解密版
- 区区区间---线段树lazy标记板子题
- Which is a good automatic account distribution system?
- CatchAdmin实战教程(四)Table组件相关功能实现
猜你喜欢

Cloud development pocket toolbox wechat applet source code

Redis主从模式、哨兵集群、分片集群

JMeter's BeanShell generates MD5 encrypted data and writes it to the database

6-21漏洞利用-mysql弱口令破解

Implement encapsulated public method global call in laravel framework

Polygon zkevm - Introduction to HERMEZ 2.0

漫画算法_小灰灰面试

网络基础概论

新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题开源全解密版

全新UI四方聚合支付系统源码/新增USDT提现/最新更新安全升级修复XSS漏洞补单漏洞
随机推荐
STM32F103 learn the steps and template fool tutorial of 1-keil5 project establishment
HTTP cache
ROCBOSS开源微社区轻论坛类源码
[quality] code quality evaluation standard
C语言:小乐乐与进制转换
Double write consistency of MySQL and redis
漫画算法_小灰灰面试
别人的快乐
Understand the evolution of redis architecture in one article
自组织是管理者和成员的双向奔赴
FFmpeg+SDL+QT实现简单是视频播放器
0728~ sorting out interview questions
QT screen adaptive automatic layout, drag the window to automatically grow larger and smaller (I)
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
【OpenCV】使用OpenCV调用手机摄像头
What are the TCP retransmission mechanisms?
ROS2/ROS1开发过程中的一些记录
主从复制及其原理
Asemi rectifier bridge s25vb100, s25vb100 parameters, s25vb100 application
redis为什么快,消息队列,单线程