web-dev-qa-db-ja.com

make出力で警告行とエラー行を強調表示するにはどうすればよいですか?

場合によっては、makeの出力が画面いっぱいになります。すべての警告およびエラーメッセージ行を識別するのは少し難しいです。シェルのカラー出力が役立つことを知っています。

30
Eric guan

colormakeを見て、見つかった ここ

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

グーグルの力を使って、この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]}
}
37
Fredrik Pihl

私はmakeの出力を色付けするための解決策を探すためにこの質問に行きましたが、しばらくの間覚えていて、優れた汎用ログカラライザーを調査してcczeを見つけました。これは、MinecraftサーバーログからExim MTAに送ったもので動作します。

make | ccze -A

[〜#〜] note [〜#〜]:-Aオプションを指定すると「raw-ansi」が有効になります。それ以外の場合、私の経験では、実行の最後に一部の出力が「クリア」されます。 enter image description here

17

Emacsユーザーの場合は、コマンドM-x compileを使用できます。これにより、ソースコードの関連する行へのリンクとして機能するエラーとともに、make出力が強調表示されたバッファーに配置されます。

7
Dan

次はどうですか?

colored output of make

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ディレクトリにあると想定しています。

3
gospes

もう1つの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
Jain Rach

以前は multitail を使用していましたが、さまざまな基準に基づいて行を強調表示(およびフィルター)できるログファイルです。

1
Zsolt Botykai

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として実行します

スクリーンショット- enter image description here

0
Robert Ranjan