Makefile 如何防止make目标并发执行?

Makefile 如何防止make目标并发执行?,makefile,Makefile,确保这一点的最简单方法是什么 make target 不同时运行吗?如果两个进程同时运行make target,则两个进程都将运行目标,并且很可能会互相攻击 shell代码段,例如 dotlockfile target.lock || exit 1 trap "dotlockfile -u target.lock" EXIT make target 工作良好:如果两个进程同时运行该代码段,其中一个进程将获取锁,另一个进程将等待锁完成。当第一个进程完成时,另一个进程开始运行maketarget

确保这一点的最简单方法是什么

make target
不同时运行吗?如果两个进程同时运行
make target
,则两个进程都将运行目标,并且很可能会互相攻击

shell代码段,例如

dotlockfile target.lock || exit 1
trap "dotlockfile -u target.lock" EXIT
make target
工作良好:如果两个进程同时运行该代码段,其中一个进程将获取锁,另一个进程将等待锁完成。当第一个进程完成时,另一个进程开始运行
maketarget
,该进程将立即返回,并且不执行任何操作,因为目标已经生成

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

以下内容(在您的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
目标:
@如果[-f制定目标];然后\
回声“已经形成目标…”\
出口1\
否则\
触控目标\
; \
rm.target\
fi
您可以通过将
替换为
sleep 10
来轻松测试它,并尝试
make target
两次,在启动第二个时可以等待第一个,也可以不等待第一个。请注意,您也可以简单地跳过配方而不是中止整个生成运行:只需删除
exit 1
行。

以下内容(在您的生成文件中)将显著降低多个进程发生冲突的可能性:

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
目标:
@如果[-f制定目标];然后\
回声“已经形成目标…”\
出口1\
否则\
触控目标\
; \
rm.target\
fi

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

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

flock /tmp/target.lock make target
如果在另一个用户持有锁时运行此命令,它将等待该命令完成,并在释放锁时运行。或者,如果打算在
生成目标
已经运行时放弃,则可以像这样使用
-n
标志:

flock -n /tmp/target.lock make target

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

flock /tmp/target.lock make target
如果在另一个用户持有锁时运行此命令,它将等待该命令完成,并在释放锁时运行。或者,如果打算在
生成目标
已经运行时放弃,则可以像这样使用
-n
标志:

flock -n /tmp/target.lock make target

这为问题的发生留下了机会之窗。不幸的是,它比我目前拥有的解决方案(有效防止并发运行)更复杂。更复杂:是和否。它依赖于make only,这是一种简化。但我同意,这还不简单,也不是100%安全。这为问题的发生留下了机会之窗。不幸的是,它比我目前拥有的解决方案(有效防止并发运行)更复杂。更复杂:是和否。它依赖于make only,这是一种简化。但我同意它还不简单,也不是100%安全。“更简单”是非常主观的。“更简单”是非常主观的。