我有一个Makefile构建了许多带有长命令行的C文件,我们通过以下规则清理输出:
.c${MT}.doj:
@echo "Compiling $<";\
$(COMPILER) $(COPTS) -c -o $@ $<
现在这很好,因为@抑制了正在发出的编译行。 但是当我们收到错误时,我们得到的只是错误消息,没有命令行。 谁能想到一个“整洁”的方式发出命令行? 我能想到的就是将它回显到一个文件,并有一个更高级别的make捕获错误并捕获文件。我知道Hacky。
答案 0 :(得分:7)
经过测试并且有效(在Linux中为GNU make):
.c${MT}.doj:
@echo "Compiling $<";\
$(COMPILER) $(COPTS) -c -o $@ $< \
|| echo "Error in command: $(COMPILER) $(COPTS) -c -o $@ $<" \
&& false
答案 1 :(得分:7)
这个问题已经很老了,但是对于那些谷歌用户来说,我认为在这种情况下我要做的是在我的shell中将make
改为make -s
(静音模式),并且只放在@
或其他诊断命令被调用的行之前的echo
前缀。当我想要make
的完整输出时,我会通过将其命名为\make
来覆盖我的别名。
另请注意,在这种情况下,您需要执行典型操作,并将@echo
放在自己的行上,实际的规则命令位于不同的行上且没有@
。
答案 2 :(得分:0)
一个简单的解决方案是使用如下所示的简单脚本abc
:
#!/bin/bash
$@
code=$?
if (( code )); then
echo error running $@
fi
exit $code
然后您可以在abc $(COMPILER) $(COPTS) -c -o $@ $<
中写下Makefile
。请注意,当您有管道或重定向时,这不起作用(因为它们将应用于abc
而不是您要运行的命令)。
如果可以的话,您也可以直接在Makefile
中添加类似的代码。
答案 3 :(得分:0)
我最近使用了一个名为logtext的实用程序,用于跟踪在执行bat文件过程中发生的输出。检查一下,如果你想知道在哪里发生了什么错误,你会发现这非常有用。