我有一个Makefile构建了许多带有长命令行的C文件,我们通过以下规则清理输出:

.c${MT}.doj:

        @echo "Compiling $<";\
         $(COMPILER) $(COPTS) -c -o $@ $<

现在这很好,因为@抑制了正在发出的编译行。 但是当我们收到错误时,我们得到的只是错误消息,没有命令行。 任何人都可以想到<!> quot; neat <!> quot;发出命令行的方法? 我能想到的就是将它回显到一个文件,并有一个更高级别的make捕获错误并捕获文件。我知道Hacky。

有帮助吗?

解决方案

经过测试并且有效(在Linux中为GNU make):

.c${MT}.doj:
     @echo "Compiling $<";\
          $(COMPILER) $(COPTS) -c -o $@ $<  \
          || echo "Error in command: $(COMPILER) $(COPTS) -c -o $@ $<" \
          && false

其他提示

这个问题很老了,但是对于那些谷歌用户来说,我认为我在这种情况下做的是别名makemake -s(无声模式)在我的shell中,并且只有将@前缀放在echo或其他诊断命令被调用的行之前。当我想要\make的完整输出时,我将通过将其命名为@echo来覆盖我的别名。

另请注意,在这种情况下,你需要做一些典型的事情并将<=>放在自己的行上,实际的规则命令在不同的行上,没有<=> <! >#8217; S

一个简单的解决方案是使用一个简单的脚本abc,如下所示:

#!/bin/bash

$@
code=$?
if (( code )); then
  echo error running $@
fi
exit $code

然后你可以在abc $(COMPILER) $(COPTS) -c -o $@ $<中写Makefile。请注意,当您有管道或重定向时,这不起作用(因为它们将应用于<=>而不是您要运行的命令)。

如果可以的话,您也可以直接在<=>中添加类似的代码。

我最近使用了一个名为 logtext 的实用程序,用于跟踪期间输出的内容bat文件执行的过程。检查一下,如果你想知道在哪里发生了什么错误,你会发现这非常有用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top