【问题标题】:In Makefile, how to cleanup lockfile files?在 Makefile 中,如何清理 lockfile 文件?
【发布时间】:2011-09-27 01:11:00
【问题描述】:

在 GNU Make 3.81 中,如果工具链的任何部分出现错误,我需要删除一个锁定文件。是否有一个特殊的目标可以让我这样做?我需要写一个包装脚本吗?

在下面的示例中,如果 file.out 的规则失败,我需要解锁 ID。

谢谢! -杰夫

all: lock_id file.out unlock_id

file.out: file.in
    file-maker < file.in > $@

lock_id:
    lockfile file.lock

unlock_id:
    rm -rf file.lock

【问题讨论】:

  • 特定命令出错,还是 Make 过程中的任何地方出错?
  • 您好 Beta,我更新了问题的详细信息。谢谢!

标签: makefile gnu-make onerror lockfile


【解决方案1】:

我会在与file-maker 相同的目标中进行锁定/解锁:

file.out: file.in
        lockfile $@.lock
        file-maker < $< > $@; \
        status=$$?; \
        rm -f $@.lock; \
        exit $$status

这会在同一个 shell 中执行file-maker 和解锁步骤,保存file-maker 的状态,因此如果file-maker 失败,make 将失败。

【讨论】:

    【解决方案2】:

    这有点杂乱无章,但确实有效:

    all:
            @$(MAKE) file.out || $(MAKE) unlock_id
    

    【讨论】:

    • 您也可以在任何可能失败的命令之后发送垃圾邮件,作为 Beta 全局解决方案的替代方案。 ./commandThatMightFail.sh || $(MAKE) unlock_id
    【解决方案3】:

    您需要.DELETE_ON_ERROR 目标,它允许您指定在出错时要删除的文件。

    http://www.gnu.org/s/hello/manual/make/Special-Targets.html

    编辑

    我的错,那是半真半假。它允许您指定要删除文件,但至于哪些文件以及在什么情况下,这取决于make

    【讨论】:

    • 嗨,克里斯,我有一个 .DELETE_ON_ERROR,但文档表明它的工作方式不同。对于 Makefile 中的所有目标,如果相应的目标失败,它看起来会删除 $@。话虽如此,我从来没有真正让 .DELETE_ON_ERROR 的行为按我的预期工作......“.DELETE_ON_ERROR 如果在 makefile 中的任何位置提到 .DELETE_ON_ERROR 作为目标,那么如果规则的目标已更改并且它的目标,make 将删除它配方以非零退出状态退出,就像它收到信号时一样。请参阅配方中的错误。谢谢! -杰夫
    • @Jeff: .DELETE_ON_ERROR 对我有用(GNUMake 3.81),但前提是目标的名称是文件的名称。在您的情况下,看起来目标的名称是lock_id,但您尝试构建(并想要删除)的文件是foo.lock
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2012-11-06
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多