【问题标题】:How can I highlight the warning and error lines in the make output?如何突出显示 make 输出中的警告和错误行?
【发布时间】:2011-09-20 03:54:39
【问题描述】:

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

【问题讨论】:

  • 如果你只对错误和警告感兴趣,那么你可以简单地 grep 那些。并且 grep 也会为“警告”和“错误”着色:D.
  • 按照 Priyank 的建议去做:make 2>&1 | grep -E --color=always 'error|warning|$'。 $ 用于匹配每一行,以便您查看所有输出,但只会突出显示“错误”和“警告”字符串。
  • 如果您使用的是 g++,另请参阅 c++ - Improving g++ output - Stack Overflow

标签: bash shell makefile gnu-make


【解决方案1】:

在 Mac 上,它通过在错误字符串周围打印tput 颜色代码来工作。

第一个export tput颜色代码如下:

export red=`tput setaf 1`
export reset=`tput sgr0`

然后,将目标添加到 Makefile,如下所示:

...
check-env:
ifndef ENV
    $(error ${red}ENV is undefined. Please export it using command [ export ENV=dev ]${reset})
endif
...

然后,以make check-env 运行它

屏幕截图 -

【讨论】:

    【解决方案2】:

    只是另一个 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]}
    }
    

    【讨论】:

      【解决方案3】:

      看看colormake,发现here

      $ apt-cache search colormake
      colormake - simple wrapper around make to colorize output
      

      借助google的力量,我也找到了这个bash-function。

      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]}
      }
      

      【讨论】:

      • 这里给出的 pathpat 不太适合我,所以我用 pathpat="^.*:[0-9]+" 代替
      【解决方案4】:

      我曾经将multitail 用于日志文件,它可以根据各种标准突出显示(和过滤)行。

      【讨论】:

        【解决方案5】:

        下面的呢?

        this 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)
        

        假设所有 C++ 源文件都在 src 目录(扩展名 .cc)中,头文件在 include 目录中。

        【讨论】:

          【解决方案6】:

          我来这个问题是为了寻找对make 输出着色的解决方案,然后记得不久前我研究了一个很好的通用日志着色器并找到了ccze。它适用于我扔给它的任何东西,从 Minecraft 服务器日志到 Exim MTA。

          make | ccze -A

          注意:根据我的经验,指定 -A 选项会启用“raw-ansi”,否则在运行结束时会“清除”某些输出。

          【讨论】:

          • +1 这个应用程序非常酷。我希望有一个 GNU-Make 插件。
          • 当您有管道时,谁需要“插件”?能够将程序(人们现在出于某种原因称为“应用程序”的东西:P)一起传送可能是 Unix 哲学的“核心”。任何适当的管道接收程序在处理 GNU make 的输出时应该没有问题;当然,我刚刚测试过的那些效果很好。
          【解决方案7】:

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

          【讨论】:

            猜你喜欢
            • 2015-10-03
            • 2014-07-31
            • 2012-03-03
            • 1970-01-01
            • 1970-01-01
            • 2018-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多