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

如何让gmake在不修改makefile的情况下输出所有命令的返回码,makefile,return-value,gnu-make,Makefile,Return Value,Gnu Make,如何使gmake在不修改Makefile的情况下输出所有命令的退出状态代码?如果修改Makefile是一个选项,则可以执行以下操作: $(CC) -c -o $@ $< $(CFLAGS); echo $$? 如果命令正在运行,并且当前目录位于路径变量的前面,则可以在当前目录中创建名为gcc的脚本,其内容如下: /usr/bin/gcc "$@"; echo $? 我想知道是否有更好的、不那么粗俗、更优雅的解决方案?如果任何命令返回非零,则使目标失败,并打印出非零退出代码。因此,对

如何使
gmake
在不修改
Makefile
的情况下输出所有命令的退出状态代码?如果修改
Makefile
是一个选项,则可以执行以下操作:

$(CC) -c -o $@ $< $(CFLAGS); echo $$? 
如果命令正在运行,并且当前目录
位于
路径
变量的前面,则可以在当前目录中创建名为
gcc
的脚本,其内容如下:

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

我想知道是否有更好的、不那么粗俗、更优雅的解决方案?

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

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

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

要实现这一目标,您必须编写以下内容:

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

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

要实现这一目标,您必须编写以下内容:

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

这正是我想要的。只是一个跟进问题;如何添加一个计数器来跟踪步骤号?如果不修改makefile,就无法做到这一点。至少,如果您想支持并行构建,就不能这样做。shell命令是一个独立的进程,因此当它退出时,您对它所做的任何更改都将丢失,因此您不能使用环境等来计算。在根本不修改makefile的情况下,唯一可能的方法是将计数保存在临时文件中,但是如果使用并行构建,那么并行作业访问临时文件时就会出现问题:可能必须使用flock(1)。如果您愿意更改makefile,那么可以很容易地完成。这正是我想要的。只是一个跟进问题;如何添加一个计数器来跟踪步骤号?如果不修改makefile,就无法做到这一点。至少,如果您想支持并行构建,就不能这样做。shell命令是一个独立的进程,因此当它退出时,您对它所做的任何更改都将丢失,因此您不能使用环境等来计算。在根本不修改makefile的情况下,唯一可能的方法是将计数保存在临时文件中,但是如果使用并行构建,那么并行作业访问临时文件时就会出现问题:可能必须使用flock(1)。如果您愿意更改makefile,那么可以很容易地完成。
$ cat shexit
#!/bin/sh
/bin/sh "$@"
r=$?
echo $r
exit $r

$ chmod 755 shexit

$ make SHELL=$(pwd)/shexit