How can I highlight the warning and error lines in the make output?

前端 未结 7 2091
醉话见心
醉话见心 2021-01-30 11:19

Sometimes, make\'s output fills the screen. It\'s a little bit hard to identify all the warning and error message lines. I know may shell color output can help Can anyone can he

相关标签:
7条回答
  • 2021-01-30 11:31

    Just another bash function , much concise

    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]}
    }
    
    0 讨论(0)
  • 2021-01-30 11:35

    I have came to this questions searching for a solution to colorize make output and then remembered a while back I have researched a good generic log colorizer and found ccze. It works with anything I throw at it from Minecraft server logs to Exim MTA.

    make | ccze -A

    NOTE: specifying -A option enables 'raw-ansi' otherwise some output is 'cleared' at end of run in my experience. enter image description here

    0 讨论(0)
  • 2021-01-30 11:43

    If you're an emacs user, you can use the command M-x compile. This puts the make output in a highlighted buffer, with errors acting as links to the relevant line in the source code.

    0 讨论(0)
  • 2021-01-30 11:50

    Have a look at colormake, found here

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

    Using the power of google, I also found this 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]}
    }
    
    0 讨论(0)
  • 2021-01-30 11:51

    On Mac, it worked by printing tput color codes around the error string.

    First export tput color codes as below:

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

    then, add a target to Makefile as below:

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

    then, run it as make check-env

    Screen shot -

    0 讨论(0)
  • 2021-01-30 11:52

    How about the following?

    It is produced by a simplified version of 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)
    

    It assumes all C++ source files are in the src directory (extention .cc) and header files are in the include directory.

    0 讨论(0)
提交回复
热议问题