如何突出make输出中的警告和错误行?

Eri*_*uan 28 bash shell makefile gnu-make

有时,make的输出填满了屏幕.识别所有警告和错误消息行有点困难.我知道可能壳颜色输出可以帮助任何人都可以帮助我?

Fre*_*ihl 37

看看colormake,在这里找到

$ apt-cache search colormake
colormake - simple wrapper around make to colorize output
Run Code Online (Sandbox Code Playgroud)

利用谷歌的力量,我也发现了这个bash功能.

make()
{
  pathpat="(/[^/]*)+:[0-9]+"
  ccred=$(echo -e "\033[0;31m")
  ccyellow=$(echo -e "\033[0;33m")
  ccend=$(echo -e "\033[0m")
  /usr/bin/make "$@" 2>&1 | sed -E -e "/[Ee]rror[: ]/ s%$pathpat%$ccred&$ccend%g" -e "/[Ww]arning[: ]/ s%$pathpat%$ccyellow&$ccend%g"
  return ${PIPESTATUS[0]}
}
Run Code Online (Sandbox Code Playgroud)

  • 这里给出的pathpat并不适合我,所以我使用了pathpat ="^.*:[0-9] +"代替 (2认同)

Dan*_*ski 17

我已经来到这个问题寻找一个颜色化make输出的解决方案,然后记住了一段时间我已经研究了一个很好的通用日志着色器,并找到了ccze.它适用于我从Minecraft服务器日志到Exim MTA的任何东西.

make | ccze -A

注意:指定-A选项启用'raw-ansi',否则根据我的经验,在运行结束时某些输出被"清除". 在此输入图像描述

  • 当你有管道时谁需要一个"插件"?能够管理程序(人们现在称之为"应用程序"的东西由于某种原因:P)在一起可能是Unix哲学的核心.任何适当的管道接收程序在使用GNU`make`的输出时都应该没有问题.当然,我刚刚测试的那些工作很棒. (3认同)

Dan*_*Dan 7

如果您是emacs用户,则可以使用该命令M-x compile.这会将make输出放在突出显示的缓冲区中,错误充当源代码中相关行的链接.


Jai*_*ach 5

只是另一个 bash 函数,非常简洁

make()
{
  /usr/bin/make "$@" 2>&1 | sed -E -e "s/error/ $(echo -e "\\033[31m" ERROR "\\033[0m"/g)"   -e "s/warning/ $(echo -e "\\033[0;33m" WARNING "\\033[0m"/g)"
  return ${PIPESTATUS[0]}
}
Run Code Online (Sandbox Code Playgroud)


gos*_*pes 5

下面的怎么样?

make 的彩色输出

它是由该 Makefile的简化版本生成的。

PROJECT = programname
SHELL   = /bin/bash
OBJS    = $(patsubst src/%.cc,obj/%.o,$(wildcard src/*.cc))

RESET          = \033[0m
make_std_color = \033[3$1m      # defined for 1 through 7
make_color     = \033[38;5;$1m  # defined for 1 through 255
WRN_COLOR = $(strip $(call make_std_color,3))
ERR_COLOR = $(strip $(call make_std_color,1))
STD_COLOR = $(strip $(call make_color,8))

COLOR_OUTPUT = 2>&1 |                                   \
    while IFS='' read -r line; do                       \
        if  [[ $$line == *:[\ ]error:* ]]; then         \
            echo -e "$(ERR_COLOR)$${line}$(RESET)";     \
        elif [[ $$line == *:[\ ]warning:* ]]; then      \
            echo -e "$(WRN_COLOR)$${line}$(RESET)";     \
        else                                            \
            echo -e "$(STD_COLOR)$${line}$(RESET)";     \
        fi;                                             \
    done; exit $${PIPESTATUS[0]};

.PHONY: $(PROJECT)

$(PROJECT): bin/$(PROJECT)

bin/$(PROJECT): $(OBJS)
    @mkdir -p bin
    @echo g++ -o $@ $(OBJS) -Iinclude
    @g++ -o $@ $(OBJS) -Iinclude $(COLOR_OUTPUT)

obj/%.o: src/%.cc
    @mkdir -p obj
    @echo g++ -o $@ -c $< -Wall -Wextra
    @g++ -o $@ -c $< -Wall -Wextra $(COLOR_OUTPUT)
Run Code Online (Sandbox Code Playgroud)

它假定所有 C++ 源文件都在该src目录中(扩展名 .cc)并且头文件都在该include目录中。