如何保护make目标免受并发执行?

时间:2015-09-16 10:15:07

标签: makefile

确保

的最简单方法是什么?
make target

不会同时运行?如果两个进程同时运行make target,则两个进程都会运行目标并且可能会相互踩到脚趾。

一个shell代码段,例如

dotlockfile target.lock || exit 1
trap "dotlockfile -u target.lock" EXIT
make target

运行良好:如果两个进程同时运行该代码段,其中一个将获得锁定,另一个将等待它完成。当第一个进程完成时,另一个进程运行make target,它将立即返回并且不执行任何操作,因为目标已经构建完毕。

我希望有一种更简单的方法来做同样的事情。

2 个答案:

答案 0 :(得分:0)

以下(在您的makefile中)应该会显着降低多个进程发生冲突的可能性:

target:
    @if [ -f making.target ]; then \
        echo "Already making target..."; \
        exit 1; \
    else \
        touch making.target; \
        <do whatever is needed to make target>; \
        rm making.target; \
    fi

您可以通过将<do whatever is needed to make target>替换为sleep 10来轻松测试,并尝试make target两次,在启动第二个时,等待和不等待第一个。请注意,您也可以跳过配方而不是中止整个make运行:只需删除exit 1行。

答案 1 :(得分:0)

更简单的解决方案是使用flock,如下所示:

flock /tmp/target.lock make target

如果在另一个持有锁的情况下运行此命令,它将等待它完成并在释放锁时运行。或者,如果意图是在make target已经运行的情况下放弃,可以像这样使用-n标志:

flock -n /tmp/target.lock make target