在Makefile中锁定整个目标

时间:2016-09-19 23:47:12

标签: bash shell makefile locking sh

我有一个带有目标的Makefile,它执行多个系统范围的操作(例如安装包),因此我希望以其他make进程在该目标上等待的方式锁定目标,从而阻止并行执行。

我尝试使用flock,如this answer中所述,但我认为makefile的特殊性正在阻碍。

这就是我现在所拥有的:

LOCKFILE=/var/lock/makefile.lock
LOCKFD=200

mytarget:
    # make sure to release the lock in any case
    eval "exec $(LOCKFD)>$(LOCKFILE)"; trap "flock -xn $(LOCKFD) && rm -f $(LOCKFILE)" EXIT
    # get exclusive waiting lock
    flock -x $(LOCKFD)
    [regular target operations...]
    # release lock and delete the lock file
    flock -u $(LOCKFD); flock -xn $(LOCKFD) && rm -f $(LOCKFILE)

它因此错误而失败,因为未正确设置文件描述符200:

$ make mytarget
# make sure to release the lock in any case
eval "exec 200>/var/lock/makefile.lock"; trap "flock -xn 200 && rm -f /var/lock/makefile.lock" EXIT
# get exclusive waiting lock
flock -x 200
flock: 200: Bad file descriptor
Makefile:57: recipe for target 'mytarget' failed

eval定义存在问题,但我不知道是什么。

1 个答案:

答案 0 :(得分:3)

make在新shell中运行每个命令行。我猜你的fd在eval之后消失了。您可以使用单个命令行,并使用";"分隔命令。如果要清除命令行,则需要使用" \"结束除最后一行以外的所有行。请参阅制作手册Splitting Recipe Lines。或者使用shell脚本。