Makefile 是否可以从GNU make内部检测输出是否重定向到文件?

Makefile 是否可以从GNU make内部检测输出是否重定向到文件?,makefile,gnu-make,Makefile,Gnu Make,通常,通过shell脚本,我们可以检测输出是否重定向到文件,如下所示: if [ -t 1 ]; then echo "shell"; fi 但是,我想在makefile中这样做,这意味着,好吧,唯一的方法是: ifeq ($(shell if [ -t 1 ]; then echo "1"; fi),1) ## in shell endif 然而,无论输出是否重定向到文件,情况似乎总是如此。我想这取决于$(shell…是如何实现的。所以我的问题是,我是否可以在make中测试任何东西,让我知

通常,通过shell脚本,我们可以检测输出是否重定向到文件,如下所示:

if [ -t 1 ]; then echo "shell"; fi
但是,我想在makefile中这样做,这意味着,好吧,唯一的方法是:

ifeq ($(shell if [ -t 1 ]; then echo "1"; fi),1)
## in shell
endif
然而,无论输出是否重定向到文件,情况似乎总是如此。我想这取决于
$(shell…
是如何实现的。所以我的问题是,我是否可以在
make
中测试任何东西,让我知道输出是否重定向到文件

有一点背景,我的makefiles生成了很多有用的输出,为了让事情变得更加明显,我使用了一些文本颜色-在控制台上这很好,但是在Hudson,当相同的构建作业运行时,输出(重定向到文件)中有所有的控制字符。。。因此,如果文件被重定向,我想做的是禁用make中的所有颜色代码。

您不能使用
$(shell…
),因为
$(shell…
的输出总是被重定向的:这必须是因为运行
$(shell…
的整个过程都是为了make捕获它的输出。您可以检查stderr是否是tty,前提是人们通常会同时重定向这两者。然而,在某些情况下,这可能是一个有缺陷的假设

除此之外,我看不到从make内部执行此检查的简单方法。检查必须在make配方中完成,因为这是make在不修改其标准输出的情况下调用shell的唯一地方。但不能在配方中更改makefile变量等

通过使用自动生成的include文件,我们可能会想出一个非常令人厌恶的方法,其中包含文件的构建会检查stdout是否是终端,并将变量赋值写入包含的makefile中。然后,诀窍是每次调用make时,将包含的makefile准确地重建一次,这并不容易,但可能是可以做到的。然而,这将涉及每次完全重新执行make,只是为了设置这个变量

当然,您也可以提供一个shell包装器,让人们运行它,而不是直接运行make,后者测试stdout是否是tty,然后根据结果使用变量赋值调用make。

您不能使用
$(shell…
),因为
$(shell…)的输出
总是被重定向:这是因为运行
$(shell…
的整个过程都是为了让make捕获它的输出。您可以检查stderr是否是tty,前提是人们通常会同时重定向这两者。然而,在某些情况下,这可能是一个有缺陷的假设

除此之外,我看不到从make内部执行此检查的简单方法。检查必须在make配方中完成,因为这是make在不修改其标准输出的情况下调用shell的唯一地方。但不能在配方中更改makefile变量等

通过使用自动生成的include文件,我们可能会想出一个非常令人厌恶的方法,其中包含文件的构建会检查stdout是否是终端,并将变量赋值写入包含的makefile中。然后,诀窍是每次调用make时,将包含的makefile准确地重建一次,这并不容易,但可能是可以做到的。然而,这将涉及每次完全重新执行make,只是为了设置这个变量


当然,您也可以提供一个shell包装器,让人们运行它,而不是直接运行make,它测试stdout是否是tty,然后根据结果使用变量赋值调用make。

您包括了与句柄很好地对齐的文件hack解决方案!!;)我想我只是要在Hudson作业中传递一个变量,它将禁用格式,这就是我真正关心这些字符的地方…事实上,你是对的,我将其更改为检测stderr,这将满足我的用例!有趣的是,stdin也可以工作,正如在《包含文件黑客解决方案》中提到的,它与您的句柄很好地对齐!!;)我想我只是要在Hudson作业中传递一个变量,它将禁用格式,这就是我真正关心这些字符的地方…事实上,你是对的,我将其更改为检测stderr,这将满足我的用例!有趣的是,stdin也可以工作,如中所述