为配置脚本的输出着色
Colorize output from configure script
我正在寻找一种方法来为 ./configure
的输出着色,以便检查结束时 yes
的所有实例都以一种颜色显示,而 no
以另一种颜色显示.我认为可能有一种方法可以使用 AS_IF
创建回显消息来测试检查结果,然后使用通常的 bash 颜色命令设置输出。如果已经完成,我显然宁愿不必花时间做这件事。
这可能是个愚蠢的问题。我为包裹检查写了一个:
AC_DEFUN([COLOR_PKG_CHECK],[
red=$(tput setaf 1)
grn=$(tput setaf 2)
clr=$(tput sgr0)
PKG_CHECK_EXISTS([],[],[found=yes],[found=no])
AS_IF([test "x$found" = "xyes"],[
msg="checking for ... ${grn}yes${clr}"
AC_MSG_RESULT($msg)
],[
msg="checking for ... ${red}no${clr}"
AC_MSG_RESULT($msg)
])
])
这行得通,但有点指出,执行此操作的唯一方法是以相同方式包装任何感兴趣的调用。我不想那样做。
幸运的是,Autoconf 基本上是一个巨大的 C 预处理器滥用,因此它的内部结构全部暴露并且很容易做一些骇人听闻的事情,公平警告,可能不会从一个 Autoconf 版本转移到下一个版本。
AC_MSG_RESULT
的定义(它打印大部分 yes/no 消息)在 /usr/share/autoconf/autoconf/general.m4
中找到,并且非常简单地定义为将给定消息打印到日志文件中以及终端:
m4_define([AC_MSG_RESULT],
[{ _AS_ECHO_LOG([result: ])
_AS_ECHO([]); }dnl
])
由于在该宏中调用的 Autoconf 内部结构暴露给您的 configure.ac,您只需使用调用它们的自己的宏覆盖 AC_MSG_RESULT
。这是一个对我有用的,打印 "yes" 为绿色, "no" 为红色,所有其他结果为蓝色。在 configure.ac:
中的任何其他宏调用之前包含它
m4_pushdef([AC_MSG_RESULT], [
{ result=""
_AS_ECHO_LOG([result: $result])
AS_CASE(["x$result"],
[xnone\ needed], _AS_ECHO([$(tput setaf 4)$result$(tput sgr0)]),
[xyes*], _AS_ECHO([$(tput setaf 2)$result$(tput sgr0)]),
[xno*], _AS_ECHO([$(tput setaf 1)$result$(tput sgr0)]),
_AS_ECHO([$(tput setaf 4)$result$(tput sgr0)])); }dnl
])
但是说真的,不要这样做。
我正在寻找一种方法来为 ./configure
的输出着色,以便检查结束时 yes
的所有实例都以一种颜色显示,而 no
以另一种颜色显示.我认为可能有一种方法可以使用 AS_IF
创建回显消息来测试检查结果,然后使用通常的 bash 颜色命令设置输出。如果已经完成,我显然宁愿不必花时间做这件事。
这可能是个愚蠢的问题。我为包裹检查写了一个:
AC_DEFUN([COLOR_PKG_CHECK],[
red=$(tput setaf 1)
grn=$(tput setaf 2)
clr=$(tput sgr0)
PKG_CHECK_EXISTS([],[],[found=yes],[found=no])
AS_IF([test "x$found" = "xyes"],[
msg="checking for ... ${grn}yes${clr}"
AC_MSG_RESULT($msg)
],[
msg="checking for ... ${red}no${clr}"
AC_MSG_RESULT($msg)
])
])
这行得通,但有点指出,执行此操作的唯一方法是以相同方式包装任何感兴趣的调用。我不想那样做。
幸运的是,Autoconf 基本上是一个巨大的 C 预处理器滥用,因此它的内部结构全部暴露并且很容易做一些骇人听闻的事情,公平警告,可能不会从一个 Autoconf 版本转移到下一个版本。
AC_MSG_RESULT
的定义(它打印大部分 yes/no 消息)在 /usr/share/autoconf/autoconf/general.m4
中找到,并且非常简单地定义为将给定消息打印到日志文件中以及终端:
m4_define([AC_MSG_RESULT],
[{ _AS_ECHO_LOG([result: ])
_AS_ECHO([]); }dnl
])
由于在该宏中调用的 Autoconf 内部结构暴露给您的 configure.ac,您只需使用调用它们的自己的宏覆盖 AC_MSG_RESULT
。这是一个对我有用的,打印 "yes" 为绿色, "no" 为红色,所有其他结果为蓝色。在 configure.ac:
m4_pushdef([AC_MSG_RESULT], [
{ result=""
_AS_ECHO_LOG([result: $result])
AS_CASE(["x$result"],
[xnone\ needed], _AS_ECHO([$(tput setaf 4)$result$(tput sgr0)]),
[xyes*], _AS_ECHO([$(tput setaf 2)$result$(tput sgr0)]),
[xno*], _AS_ECHO([$(tput setaf 1)$result$(tput sgr0)]),
_AS_ECHO([$(tput setaf 4)$result$(tput sgr0)])); }dnl
])
但是说真的,不要这样做。