题
我有一个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
其他提示
这个问题很老了,但是对于那些谷歌用户来说,我认为我在这种情况下做的是别名make
到make -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文件执行的过程。检查一下,如果你想知道在哪里发生了什么错误,你会发现这非常有用。
不隶属于 StackOverflow