5

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

.c${MT}.doj:

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

现在这很好,因为 @ 抑制了正在发出的编译行。但是当我们得到一个错误时,我们得到的只是错误信息,没有命令行。谁能想到一种“简洁”的方式来发出命令行?我能想到的就是将它回显到一个文件中,并让更高级别的 make 捕获错误并 cat 文件。哈基我知道。

4

4 回答 4

7

经过测试并且可以正常工作(Linux中的GNU make):

.c${MT}.doj:
     @echo "Compiling $<";\
          $(COMPILER) $(COPTS) -c -o $@ $<  \
          || echo "Error in command: $(COMPILER) $(COPTS) -c -o $@ $<" \
          && false
于 2008-10-20T12:42:26.147 回答
7

这个问题已经很老了,但是对于那些在谷歌上搜索的人来说,我认为在这种情况下我要做的就是在我的 shell 中make使用make -s(silent mode) 的别名,并且只将@前缀放在echo正在调用其他诊断命令的行之前。当我想要完整的输出时make,我将通过调用它来覆盖我的别名\make

另请注意,在这种情况下,您需要做典型的事情并将 放在@echo单独的行上,实际的规则命令放在单独的行上并且不带@'s。

于 2012-04-22T04:46:49.160 回答
0

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

#!/bin/bash

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

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

您也可以直接将类似的代码放入Makefileif that's优选。

于 2008-10-20T12:43:02.790 回答
0

我最近使用了一个名为logtext的实用程序来跟踪 bat 文件执行过程中发生的输出。检查一下,如果您想知道发生了什么错误,您可能会发现这非常有用。

于 2008-10-20T12:44:10.340 回答