Mise en évidence des couleurs des avertissements et des erreurs Makefile
J'ai écrit un Makefile qui fonctionne très bien; je suis en train de poster la partie objet de l'enquête:
BUILD_PRINT = @echo -e "\e[1;34mBuilding $<\e[0m"
COMPILE_cpp = $(CXX) $(CFLAGS) -o $@ -c $< $(MAKEDEP) $(INCLUDES)
%.o : %.cpp
$(BUILD_PRINT)
$(COMPILE_cpp)
.SUFFIXES: .o .cpp
Je tiens à souligner les erreurs et avertissements donnés par le compilateur sans l'aide d'outils externes (tels que colorgcc ou CMake); j'ai pensé qu'une bonne façon de pirater c'est par "script bash astuces". En regardant la solution posté dans Comment puis-je mettre en évidence l'avertissement et d'erreur de lignes dans la sortie? j'ai essayé ce qui suit:
pathpat="(/[^/]*)+:[0-9]+"
ccred=$(echo -e "3[0;31m")
ccyellow=$(echo -e "3[0;33m")
ccend=$(echo -e "3[0m")
BUILD_PRINT = @echo -e "\e[1;34mBuilding $<\e[0m"
COMPILE_cpp = $(CXX) $(CFLAGS) -o $@ -c $< $(MAKEDEP) $(INCLUDES)
%.o : %.cpp
$(BUILD_PRINT)
$(COMPILE_cpp) 2>&1 | sed -e "/[Ee]rror[: ]/s%$pathpat%$ccred&$ccend%g" -e "/[Ww]arning[: ]/s%$pathpat%$ccyellow&$ccend%g" echo "${PIPESTATUS[0]}"
.SUFFIXES: .o .cpp
mais ça ne fonctionne pas. J'obtiens le résultat suivant
Building main.cpp
g++ -o main.o -c main.cpp 2>&1 | sed -e "/[Ee]rror[: ]/s%athpat%cred&cend%g" -e "/[Ww]arning[: ]/s%athpat%cyellow&cend%g" echo ""
sed: can't read echo: No such file or directory
sed: can't read : No such file or directory
Merci d'avance!
source d'informationauteur helmet_23
Vous devez vous connecter pour publier un commentaire.
À faire contexte les lignes suivantes ne se comportent pas de la manière qu'ils le feraient dans le shell:
Dans le shell a ceux qui voudraient mettre l'écho de sortie à ces variables. En faire qui tente d'exécuter la
echo
de commande, qui n'existe pas, et finit par créer des vides variables.Ces lignes doivent être
ccred=$(shell echo -e "\033[0;31m")
pour exécuter les commandes via le shell et stocker la sortie et de l'utiliser comme$(ccred)
dans le corpsccred=\033[0;31m
pour stocker la chaîne de caractères dans la variable, puis utilisé comme$$(echo -e '$(ccred)')
dans le corpsccred=echo -e "\033[0;31m"
pour stocker la commande dans la variable, puis utilisé comme$$($(ccred)
dans le corpsSoit de la première ou de la deuxième options est susceptible d'une amende. (Utiliser := au lieu de = dans la première option pour faire exécuter uniquement la commande echo une fois, à faire l'analyse, au lieu de chaque fois
ccred
est utilisé.)faire et variables shell partager un préfixe prefix $. En tant que tel à l'utilisation des variables shell dans des contextes nécessite de s'échapper de la $ shell contextes en le doublant d' $$. En tant que tel
s%$pathpat%$ccred&$ccend%g
doit êtres%$$pathpat%$$ccred&$$ccend%g
etc.Chaque ligne d'une règle de corps est exécuté en tant que distincte de commande shell, tels que les commandes ne peuvent pas interagir les uns avec les autres. Afin d'utiliser des constructions comme les
echo "${PIPESTATUS[0]}"
de façon significative, par conséquent, exige qu'ils soient sur la même ligne de commande en faire. En tant que telle la ligne de compilation dans le modèle la règle devrait être$(COMPILE_cpp) 2>&1 | sed ...; echo "${PIPESTATUS[0]}"
.Cependant, même cela ne va pas faire ce que vous voulez puisque vous n'avez pas besoin de faire l'écho de l'état de sortie de la compilation vous avez besoin de sortir avec elle, de sorte que vous voudrez probablement
; exit "${PIPESTATUS[0]}"
il ya lieu.Ai eu de travail.
Tout d'abord merci @EtanReisner et @rici. Voici le code:
Toutes les commandes sont invoquées par un seul
echo
parce que je veux toutes les sorties (la chaîne de commande et avertissements/erreurs) regroupées de façon cohérente pour chaque fichier construit lorsque je lance une compilation parallèle avecmake -j
.$(BUILD_PRINT)
se contente d'afficher le chemin du fichier en cours de construction.$(COMPILE_cpp)
imprime la chaîne du compilateur, afin que je puisse voir la commande avec tous les drapeaux/dépendances/etc...$(COMPILE_cpp_OUT)
magasins de la sortie du compilateur et de modifier certains mot couleur viased
commande.