Makefile中同名目标的处理

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile中同名目标的处理相关的知识,希望对你有一定的参考价值。

1、Makefile中存在同名目标怎么处理

target1: dep1
	cmd1

target1: dep2
	cmd2
	
#上面的代码等同于下面
target1: dep2 dep1
	cmd2

(1)首先Makefile中允许存在同名的目标,执行时会报警告但是不会终止执行;
(2)靠后的同名目标会"覆盖"掉前面的同名目标,但是不是简单的覆盖,而是保留前一个同名目标的依赖关系,丢弃掉前一个同名目标的命令;

2、示例代码

all: depend3 depend5
	@echo "all 1111111111"
	
all: depend4
	@echo "all 22222222222222"
	
depend3:
	@echo "depend 3333333333333"

depend4:
	@echo "depend 4444444444444"

depend5:
	@echo "depend 5555555555555"

3、代码执行结构分析

[root@]$ make
Makefile:5: warning: overriding recipe for target `all'
Makefile:2: warning: ignoring old recipe for target `all'
depend 4444444444444
depend 3333333333333
depend 5555555555555
all 22222222222222

(1)如果Makefile中存在同名的目标,在执行时会报警告:靠后的同名目标会覆盖掉靠前的同名目标;
(2)执行的效果就是前面说的保留前一个同名目标的依赖关系,丢弃掉前一个同名目标的命令,对照代码的执行结果很容易理解;

4、总结

(1)Makefile中存在同名目标是我在一个项目中遇到的,当时Makefile的执行流程不符合预期,害我花了一些时间来排查,最后才知道是被靠后的同名目标给覆盖了;
(2)在实际项目中,整个编译的代码是比较复杂的,分成多个文件并且分散在不同的目录下,在执行过程中存在跳转执行和include的包含关系,如果存在同名目标的覆盖问题,会给后面维护的程序员带来麻烦;
(3)建议不要使用同名覆盖的机制。本身就不常用也不是必须用,还要程序员去推理到底覆盖后的目标是怎样的,第一次遇到的程序员可能花不少时间来排查问题;

以上是关于Makefile中同名目标的处理的主要内容,如果未能解决你的问题,请参考以下文章

makefile(06)_隐式规则

makefile里PHONY的相关介绍

makefile里的Phony

Linux- mv命令

makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)

makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)