web-dev-qa-db-fra.com

Comment mettre en évidence les lignes d’avertissement et d’erreur dans la sortie de make?

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?

25
Eric guan

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]}
}
36
Fredrik Pihl

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. enter image description here

16

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.

6
Dan

Que diriez-vous de ce qui suit?

 colored output of make

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

3
gospes

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]}
}
3
Jain Rach

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.

1
Zsolt Botykai

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

Capture d'écran -  enter image description here

0
Robert Ranjan