Parfois, la sortie de make remplit l'écran. Il est un peu difficile d'identifier toutes les lignes de messages d'avertissement et d'erreur. Je sais que les couleurs de Shell peuvent aider Quelqu'un peut-il m'aider?
Regardez colormake
, trouvé ici
$ apt-cache search colormake
colormake - simple wrapper around make to colorize output
En utilisant le pouvoir de Google, j'ai également trouvé cette fonction 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]}
}
Je suis venu à ces questions à la recherche d'une solution pour coloriser la sortie make
et puis je me suis rappelé il y a quelque temps que j'avais déjà cherché un bon colorant générique pour le journal et trouvé ccze
. Cela fonctionne avec tout ce que je lance des journaux de serveur Minecraft à Exim MTA.
make | ccze -A
NOTE: spécifier l'option -A active 'raw-ansi', sinon certaines sorties sont 'effacées' à la fin de l'exécution, selon mon expérience.
Si vous êtes un utilisateur emacs, vous pouvez utiliser la commande M-x compile
. Cela place la sortie dans un tampon en surbrillance, les erreurs agissant en tant que liens vers la ligne correspondante du code source.
Que diriez-vous de ce qui suit?
Il est produit par une version simplifiée de 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)
Cela suppose que tous les fichiers source C++ se trouvent dans le répertoire src
(extension .cc) et que les fichiers d'en-tête se trouvent dans le répertoire include
.
Juste une autre fonction bash, très 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]}
}
J'avais l'habitude d'utiliser multitail pour les fichiers journaux, il peut mettre en évidence (et filtrer) les lignes en fonction de divers critères.
Sur Mac, cela fonctionnait en imprimant des codes de couleur tput
autour de la chaîne d'erreur.
Premiers codes de couleur export tput
comme ci-dessous:
export red=`tput setaf 1`
export reset=`tput sgr0`
ajoutez ensuite une cible à Makefile comme ci-dessous:
...
check-env:
ifndef ENV
$(error ${red}ENV is undefined. Please export it using command [ export ENV=dev ]${reset})
endif
...
puis exécutez-le en tant que make check-env