You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:15:03