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 help me?
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]}
}
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.
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.
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]}
}
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.
I used to use multitail for log files it can highlight (and filter) lines based on various criteria.
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 -
GCC has an environment variable for that:
export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
I recently looked into this for our team and I modified the source of make to produce output where CL.EXE (Windows) output get the text 'warning' and 'error' in a color using ANSI escape codes.
I dropped it on github here: https://github.com/XtheOne/make-colorized
It could be further developed by making the words that needs replacing configurable as parameter or in a file. But for now it works just fine for us.
精彩评论