如何在不修改makefile的情况下让gmake输出所有命令的返回码

Har*_*der 1 makefile return-value gnu-make

如何gmake在不修改Makefile?的情况下输出所有命令的退出状态代码?如果修改Makefile是一个选项,可能会出现以下内容:

$(CC) -c -o $@ $< $(CFLAGS); echo $$? 
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现的另一种方法是包装我正在运行的命令.例如,如果

gcc -o $@ $^ $(CFLAGS) $(LIBS)
Run Code Online (Sandbox Code Playgroud)

是运行的命令,当前目录.位于PATH变量的前面,然后您可以gcc使用以下内容创建在当前目录中调用的脚本:

/usr/bin/gcc "$@"; echo $? 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好,更少hackish,更优雅的解决方案?

Mad*_*ist 5

请注意,所有建议的解决方法都已损坏:因为您现在echo作为配方中的最后一个命令运行,配方将始终以返回代码退出echo,这始终是成功的.如果您按照描述进行更改,换句话说,make将不再检测到任何构建失败并将每个命令视为成功.

要完成这项工作,你必须写下这样的东西:

$(CC) -c -o $@ $< $(CFLAGS); r=$$?; echo $$r; exit $$r
Run Code Online (Sandbox Code Playgroud)

我可以想到的唯一"干净"方式是在不更改makefile但仍处理所有不同目标的情况下执行此操作,将SHELL使用您自己的一种方式更改make使用方式.不幸的是,这有点棘手,但这样的事情应该有效:

$ cat shexit
#!/bin/sh
/bin/sh "$@"
r=$?
echo $r
exit $r

$ chmod 755 shexit

$ make SHELL=$(pwd)/shexit
Run Code Online (Sandbox Code Playgroud)