gpt4 book ai didi

makefile - 将: . DELETE_ON_ERROR设置为目录目标

转载 作者:行者123 更新时间:2023-12-04 15:57:35 28 4
gpt4 key购买 nike

GNU Make包含一个称为.DELETE_ON_ERROR的特殊目标。如果您的Makefile中包含此文件,Make将删除其构建序列以非零返回状态完成的任何目标。这很有用,因此在以后的调用中,Make不会假定已正确构建了目标。

这是一个虚拟的例子。

.DELETE_ON_ERROR:

out.dat: in.dat
touch out.dat
false

由于 false提供的返回值非零,因此该构建被视为失败,并且Make删除了 out.dat目标。这是广告和预期的行为。但是,当目标是目录时,似乎不会保留此行为。考虑另一个虚拟的例子。
.DELETE_ON_ERROR:

outdir/: in.dat
mkdir outdir/
false

在这种情况下,构建将再次失败,但是Make不会删除 outdir目录。 我有什么方法可以指示Make做到这一点?

最佳答案

如评论中所述,很难在目录上使用时间戳。几种选择:

  • 代理目标(%.dir)
  • 使用临时文件夹的原子更新。

  • 使用代理目标,可以将Makefile修改为包含“%.done”目标,该目标将嵌入清除逻辑。
    .PHONY: %.dir

    outdir.dir:
    $(MAKE) outdir ; if [ $? -ne 0 ] ; then echo CLEANUP $@ ; rm -rf dir ; false ; fi

    outdir: ... # as before

    并将outdir.dir用作依赖项。不优雅,但是可以完成工作。可能可以转换为规则(免责声明:我没有测试这种方法)。
    .PHONY %.dir

    %.dir:
    $(MAKE) $* ; if [ $? -ne 0 ] ; then echo CLEANUP $* ; rmd -rf $* ; false ; fi

    另一个变化是更改outdir以添加“完成”指示 rune 件(如果成功完成),并使用代理目标进行验证
    %.dir:
    $(MAKE) $* ; if [ ! -f $*.done ] ; then rm -rf $* ; false ; fi

    outdir:
    ... commands, any can fail.
    touch $*.done

    作为最后的选择(或根据您的具体情况,选择第一种方法),请考虑为outdir'atomic'构建-创建一个临时文件夹,并在成功时将其重命名为outdir
    outdir:
    rm -rf $@.new $@
    mkdir $@.new
    # Command to create outdir.new here
    mv $@.new $@

    关于makefile - 将: . DELETE_ON_ERROR设置为目录目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25752543/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com