如何让Makefile中的dist-3目标被多次执行?
让Makefile中同一目标多次执行的解决办法
你的Makefile代码如下:
dist-3: @echo "calling dist-3" dist-2: dist-3 @echo "calling dist-2" dist-1: dist-2 dist-3 @echo "calling dist-1"
执行make dist-1后,dist-3仅执行一次。这是因为Make的核心机制:同一个目标在单次make进程中只会被构建一次——哪怕被多个依赖引用,哪怕标记为.PHONY也不会改变这个行为,.PHONY只是让目标每次都被视为需要更新,但更新动作只会执行一次。
要实现dist-3多次执行,可采用以下几种方案:
方案1:递归调用make执行目标
将依赖中的dist-3替换为递归调用make的命令,而非直接依赖目标:
dist-3: @echo "calling dist-3" dist-2: @$(MAKE) dist-3 @echo "calling dist-2" dist-1: dist-2 @$(MAKE) dist-3 @echo "calling dist-1"
执行make dist-1会输出:
calling dist-3 calling dist-2 calling dist-3 calling dist-1
每次需要执行dist-3时,启动新的make进程执行它,绕开单次进程中目标仅执行一次的限制。
方案2:用临时文件触发重复执行
创建临时标记文件作为依赖,每次执行完dist-3后创建文件,依赖它的目标执行完成后删除文件,让下一次依赖时重新触发dist-3:
dist-3: @echo "calling dist-3" @touch .dist-3-tmp dist-2: .dist-3-tmp @echo "calling dist-2" @rm .dist-3-tmp dist-1: dist-2 .dist-3-tmp @echo "calling dist-1" @rm .dist-3-tmp .PHONY: dist-1 dist-2 dist-3
方案3:将目标逻辑封装为宏直接调用
如果dist-3的逻辑简单,可将其定义为make变量,在需要的地方直接调用:
define DIST3_CMD @echo "calling dist-3" endef dist-2: $(DIST3_CMD) @echo "calling dist-2" dist-1: dist-2 $(DIST3_CMD) @echo "calling dist-1" .PHONY: dist-1 dist-2
这种方式直接把dist-3的命令嵌入到需要执行的位置,完全绕开目标依赖机制,自然能多次执行。
内容的提问来源于stack exchange,提问作者thetango
相关产品推荐
相关产品推荐

