ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Makfile 双冒号规则

2022-07-25 14:03:20  阅读:130  来源: 互联网

标签:commands 冒号 target make Makfile 规则 执行


转载:https://www.cnblogs.com/zxc2man/p/3759770.html

首先需要明确的是:Makefile 中,一个目标可以出现在多个规则中。但是这些规则必须是同一类型的规则,要么都是普通规则,要么都是双冒号规则。而不允许一个目标同时出现在两种不同类型的规则中。

双冒号规则和普通规则的处理的不同点表现在以下几个方面:

1. 双冒号规则中,当依赖文件比目标更新时。规则将会被执行。

对于一个没有依赖而只有命令行的双冒号规则,当引用此目标时,规则的命令将会被无条件执行

而普通单冒号规则,当规则的目标文件存在时,此规则的命令永远不会被执行(目标文件永远是最新的)。

2. 当同一个文件作为多个双冒号规则的目标时。这些不同的规则会被独立的处理,而不是像普通规则那样合并所有的依赖到一个目标文件。

这就意味着对这些规则的处理就像多个不同的普通规则一样。就是说多个双冒号规则中的每一个的依赖文件被改变之后,

make 只执行此规则定义的命令,而其它的以这个文件作为目标的双冒号规则将不会被执行。
我们来看一个例子,在我们的 Makefile 中包含以下两个规则:

Newprog :: foo.c
    $(CC) $(CFLAGS) $< -o $@
Newprog :: bar.c
    $(CC) $(CFLAGS) $< -o $@

如果“foo.c”文件被修改,执行make以后将根据“foo.c”文件重建目标“Newprog”。
而如果“bar.c”被修改那么“Newprog”将根据“bar.c”被重建。回想一下,如果以
上两个规则为普通规时出现的情况是什么?(make 将会出错并提示错误信息)
当同一个目标出现在多个双冒号规则中时,
规则的执行顺序和普通规则的执行顺序
一样,按照其在 Makefile 中的书写顺序执行。
GNU make 的双冒号规则给我们提供一种根据依赖的更新情况而执行不同的命令
来重建同一目标的机制。一般这种需要的情况很少,所以双冒号规则的使用比较罕见。
一般双冒号规则都需要定义命令,
如果一个双冒号规则没有定义命令,
在执行规则时将
为其目标自动查找隐含规则。


http://blog.csdn.net/terry_linux/archive/2010/05/15/5594904.aspx

----伪目标----
target:
    commands

如果makefile 所在目录没有target 同名文件:make target 则导致commands 总是被执行。
如果makefile 所在目录下存在target 同名文件:make target 则commands 不被执行,认为target 总是最新的。

.PHONY:target
target:
    commands

不论makefile 所在目录下存不存在与target 同名文件,make target 导致commands 的执行,与上一种写法的区别是引用'.PHONY' 的意义所在。
-----强制目标-----
target:

因为没有命令,所以make target ,与makefile 所在目录下是否存在与target 同名的文件没有直接关系。

-----双冒号规则-----
target::
    commands

无论makefile 所在目录下存不存在与target同名文件,make target 导致commands 的执行,与使用'.PHONY' 定义的伪目标效果相同。

----------1
.PHONY target
all:target
    commands1
# 伪目标
target:
    commands

----------2
all:target
    commands1
# 伪目标
target:
    commands

---------3
all:target
    commands1
# 强制目标
target:

---------4
all:target
    commands1
# 双冒号规则
target::
    commands

1和4 make all执行情况相同,无论makefile 所在目录下存不存在与target 同名文件,commands1 和commands 都被执行。
2和3 make all执行情况在makefile 所在目录下存在与target 同名文件,commads 不被执行( 认为target 目标是最新的) ,commands1 将被执行;而如果不存在与target 同名的文件,则2 运行效果与1 和4 相同,3 运行将导致commands1 的执行。

.PHONY:target1

all1:target1
    @echo "all1_target1_.PHONY_command_all1"
target1:
    @echo "all1_target1_.PHONY_command_target1"
all2:target2
    @echo "all2_target2_command_all2"
target2:
    @echo "all2_target2_command_target2"
all3:target3
    @echo "all3_target3_force_command_all3"
target3:

all4:target4
    @echo "all4_target4_::_command_all4"
target4::
    @echo "all4_target4_::_command_target4"

测试方法
make all1
make all2
make all3
make all4
然后创建4个文件target1-4
touch target{1,2,3,4}
再次执行
make all1
make all2
make all3
make all4

你会发现
1和4 make all执行情况相同,无论makefile所在目录下存不存在与target同名文件,commands1 和commands都被执行。
2和3 make all执行情况在makefile 所在目录下存在与target 同名文件,commads 不被执行( 认为target目标是最新的),commands1 将被执行;而如果不存在与target 同名的文件,则2 运行效果与1 和4 相同,3 运行将导致commands1 的执行。

标签:commands,冒号,target,make,Makfile,规则,执行
来源: https://www.cnblogs.com/sudochen/p/16517174.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有