【问题标题】:Auto delete hook in GNU MakeGNU Make 中的自动删除钩子
【发布时间】:2014-07-08 09:52:23
【问题描述】:

默认情况下,make 会在不再需要目标时自动删除它们。

例如:

do_it: write_bar write_baz
    echo done > $@

.INTERMEDIATE: write_foo write_bar write_baz

write_foo:
    echo foo > $@

write_bar: write_foo
    cat $< > $@
    echo bar >> $@

write_baz: write_foo
    echo buz > $@

这里的write_foo会在write_barwrite_baz都执行后被删除。

我不想简单地删除文件,而是在 write_foo 删除之前执行一些操作。

我可以更改自动删除命令或为此操作分配任何挂钩吗?

更新:自动删除仅适用于中间规则。

【问题讨论】:

  • 不,你今天不能这样做。事实上,make 甚至不运行rm 命令,它只是打印rm,但在内部它使用unlink() 系统调用来删除文件。

标签: makefile gnu-make


【解决方案1】:
  • make(至少是 GNU Make)不会自动删除成功构建的目标(如果 make 是 killed,它会删除目标)。
  • .DEFAULT 没有做你期望它做的事情。见https://www.gnu.org/software/make/manual/html_node/Special-Targets.html
  • 在命令行上调用make 会执行第一个目标。由于您的第一个目标是 write_foo,因此只会执行 write_foo。

如果你调用make do_it,所有的目标都会被执行(当前目录会出现3个文件)。

问题更新后添加:

根据https://www.gnu.org/software/make/manual/html_node/Special-Targets.html,在.PRECIOUS的先决条件中包括中间目标@特殊目标防止删除它。

【讨论】:

  • 不,我希望它们在执行后被删除,所以PRECIOUS 对我没有帮助。我只需要在删除它之前对这个文件执行几个命令。
  • @werehuman 您是否考虑将它们与.PRECIOUS 一起保存并在执行您想要的操作后手动删除它们?
猜你喜欢
  • 1970-01-01
  • 2018-05-06
  • 2019-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
相关资源
最近更新 更多