Как выделить строки предупреждений и ошибок в выводе make? - PullRequest
26 голосов
/ 22 июня 2011

Иногда вывод make заполняет экран.Немного сложно определить все строки предупреждений и сообщений об ошибках.Я знаю, может ли вывод цвета оболочки помочь. Кто-нибудь может мне помочь?

Ответы [ 7 ]

37 голосов
/ 22 июня 2011

Посмотрите на colormake, найдено здесь

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

Используя силу Google, я также нашел эту функцию 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]}
}
17 голосов
/ 06 июня 2014

Я пришел к этим вопросам в поисках решения для раскраски make выходных данных, а затем вспомнил, что некоторое время назад я исследовал хороший общий колориметр журналов и нашел ccze.Он работает со всем, что я кидаю из журналов сервера Minecraft в Exim MTA.

make | ccze -A

ПРИМЕЧАНИЕ : указание опции -A разрешает использование raw-ansi в противном случаепо моему опыту, некоторые результаты «очищаются» в конце цикла.enter image description here

7 голосов
/ 23 июня 2011

Если вы пользователь emacs, вы можете использовать команду M-x compile.Это помещает вывод make в выделенный буфер с ошибками, действующими как ссылки на соответствующую строку в исходном коде.

3 голосов
/ 23 марта 2016

Как насчет следующего?

colored output of 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)

Предполагается, что все исходные файлы C ++ находятся в каталоге src (extention .cc), а заголовочные файлы находятся в каталоге include.

3 голосов
/ 09 декабря 2014

Просто еще одна функция 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]}
}
1 голос
/ 22 июня 2011

Раньше я использовал multitail для файлов журналов, он может выделять (и фильтровать) строки по различным критериям.

0 голосов
/ 29 ноября 2018

На Mac он работал, печатая tput цветовые коды вокруг строки ошибки.

Сначала export tput цветовые коды, как показано ниже:

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

, затем добавьте цель кСоздайте файл, как показано ниже:

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

, затем запустите его как make check-env

Снимок экрана - enter image description here

...