我有一个带有目标的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
定义存在问题,但我不知道是什么。
答案 0 :(得分:3)
make在新shell中运行每个命令行。我猜你的fd在eval
之后消失了。您可以使用单个命令行,并使用";"分隔命令。如果要清除命令行,则需要使用" \"结束除最后一行以外的所有行。请参阅制作手册Splitting Recipe Lines。或者使用shell脚本。