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

How can I get gmake to output return codes for all commands without modifying makefile

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

$(CC) -c -o $@ $< $(CFLAGS); echo $$? 

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

gcc -o $@ $^ $(CFLAGS) $(LIBS)

是命令运行,当前目录.PATH变量前面,那么就可以在当前目录下创建一个名为gcc的脚本包含以下内容的目录:

/usr/bin/gcc "$@"; echo $? 

我想知道是否有更好、更简洁、更优雅的解决方案?

如果任何命令 returns 非零,Make 将失败,并打印非零退出代码。因此,对于任何没有打印退出代码的命令,您已经知道它是什么 - 零。如果仅仅拥有这些知识是不够的,那么修复它是很容易的。如果您可以区分打印和其他输出的命令,您可以很容易地 运行 一个 sed 脚本将 0 粘贴在成功命令的正确位置。

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

要完成这项工作,您必须编写如下内容:

$(CC) -c -o $@ $< $(CFLAGS); r=$$?; echo $$r; exit $$r

我能想到的唯一 "clean" 方法是在不更改 makefile 的情况下执行此操作,但仍处理所有不同的目标,就是更改 SHELL make uses with your one of your拥有你想要的行为。不幸的是,这有点棘手,但这样的事情应该有效:

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

$ chmod 755 shexit

$ make SHELL=$(pwd)/shexit