【问题标题】:Makefile ignore segfaultMakefile 忽略段错误
【发布时间】:2014-10-02 19:26:19
【问题描述】:

我正在尝试使用 GNU Make 自动将一组 .mmpz 文件转换为使用 lmms.ogg 文件。目前lmms 中存在一个错误,导致它在生成输出文件后出现段错误,导致make 吐出错误。在规则之前添加- 会强制make 忽略错误并阻止它删除输出文件,但仍会产生错误消息。我尝试了以下方法:

-@lmms -r $(MPPZDIR)/$*.mmpz -f ogg -o $(OGGDIR)/$*.ogg
-@lmms -r $(MPPZDIR)/$*.mmpz -f ogg -o $(OGGDIR)/$*.ogg 2> /dev/null
-@lmms -r $(MPPZDIR)/$*.mmpz -f ogg -o $(OGGDIR)/$*.ogg || true

它们都会产生类似的东西

/bin/sh: line 1:  3325 Segmentation fault      (core dumped) lmms -r resources/mmpz/song.mmpz -f ogg -o content/music/song.ogg 2> /dev/null
Makefile:28: recipe for target 'content/music/song.ogg' failed
make: [content/music/song.ogg] Error 139 (ignored)

考虑到段错误是预期的并且并不表示生成输出文件失败,有没有办法隐藏这个错误直到错误被修复? make -i 似乎仍然在输出错误。

【问题讨论】:

  • || true 与前导 - 具有相同的效果,让 make 忽略 lmms 命令的失败。
  • @MarkGaleck 在这方面我完全同意你的看法。 || true 绝对优于领先的 -。我的观点主要是两者都不是必需的,就像 OP 示例的第三行一样。
  • @Etan 好吧,我收回了,对不起,这不是一个好点

标签: makefile gnu-make


【解决方案1】:
define EXPECTED_FAIL
if ! { $1 ; } 2>$@.temp; then \
    echo EXPECTED FAILURE: ; cat $@.temp; \
fi
endef

<target>: <prerequisites>
    $(call EXPECTED_FAIL, lmms -r $(MPPZDIR)/$*.mmpz -f ogg -o $(OGGDIR)/$*.ogg )

【讨论】:

  • 这仍然会为每个失败打印分段错误消息(在打印 EXPECTED FAILURE: 之前)。
  • @murphyslaw 哦,我知道这是因为分段错误不是“正常”错误消息,它不会打印在进程 stderr 上。等等,让我看看这个。
  • @murphyslaw 好的,现在试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2018-11-07
  • 2012-02-10
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多