如何强制Make重复执行同一命令?解决double_pause仅执行一次的问题
如何强制Make重复执行同一命令
问题背景
Make默认会对任务进行去重处理——当目标的依赖列表中出现同一个伪目标(.PHONY)多次时,只会执行一次该目标对应的命令。比如以下场景:
示例Makefile
.PHONY: double_pause double_pause: pause pause .PHONY: pause pause: bash entrypoint.sh pause
配套entrypoint.sh脚本
#!/usr/bin/env bash set -e +x _pause() { echo "Wait 5s..." sleep 5s } case $1 in pause) _pause;; *) exec "$@";;; esac
执行make double_pause时,只会输出一次Wait 5s...,不会按预期重复执行两次pause任务。
解决方法
以下三种方案可以实现强制重复执行同一命令:
方案1:用临时空文件替代伪目标
通过创建临时文件标记任务执行状态,每次执行前自动触发任务(因为临时文件不存在):
.PHONY: double_pause double_pause: pause1 pause2 pause1: bash entrypoint.sh pause touch $@ pause2: bash entrypoint.sh pause touch $@ .PHONY: clean clean: rm -f pause1 pause2
执行make double_pause后会依次运行两次命令,完成后可通过make clean清理临时文件。
方案2:递归调用Make
通过$(MAKE)递归触发目标,绕过去重机制:
.PHONY: double_pause double_pause: $(MAKE) pause $(MAKE) pause .PHONY: pause pause: bash entrypoint.sh pause
每次递归调用都会独立处理pause目标,从而实现重复执行。
方案3:直接重复写命令
如果不需要复用pause目标的逻辑,可直接在double_pause中重复命令:
.PHONY: double_pause double_pause: bash entrypoint.sh pause bash entrypoint.sh pause .PHONY: pause pause: bash entrypoint.sh pause
这种方式最直接,适合简单场景。
内容的提问来源于stack exchange,提问作者Michael Linker
相关产品推荐
相关产品推荐

