【发布时间】:2014-07-31 10:04:12
【问题描述】:
我写了一个运行良好的 Makefile;我只是发布正在调查的部分:
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
我想在不使用外部工具(如 colorgcc 或 CMake)的情况下突出显示编译器给出的警告和错误;我认为破解它的好方法是通过“bash 脚本技巧”。查看How Can I highlight the warning and error lines in the make output? 中发布的解决方案,我尝试了以下方法:
pathpat="(/[^/]*)+:[0-9]+"
ccred=$(echo -e "\033[0;31m")
ccyellow=$(echo -e "\033[0;33m")
ccend=$(echo -e "\033[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
但它不起作用。我得到以下输出
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
提前致谢!
【问题讨论】:
-
该makefile到底发生了什么(或没有发生)?快速浏览一下,您可能只需要在主体规则中转义
$,因此s%$pathpat%$ccred&$ccend%g需要为s%$$pathpat%$$ccred&$$ccend%g,等等。此外,pipestatus echo 不会像它需要那样在自己的行上工作与编译行在同一命令行上以按照您想要的方式工作。 -
我已经编辑了帖子,但出现了错误
-
你的命令行基本上是
sed -e "...1" -e "...2" echo ""。这告诉sed对名称为echo和空字符串的文件执行sed 命令...1和...2。因此,错误消息是合乎逻辑的。此外,在 makefile 中,设置make变量的命令不能使用 bash 语法。所以ccred=$(echo -e "\033[0;31m")并没有按照你的想法去做。最后,正如 Etan 指出的那样,makefile 中的$替换是在命令行传递给 bash 之前处理的,因此您需要转义$以进行 bash 替换,或者将()放在 make 变量的名称周围。跨度> -
您需要在
echo之前放置一个分号以将其分隔为第二个命令,而不仅仅是将其附加到 sed 命令。我最初误读了$(echo -e "\033[0;31m"),您要么想从该行中删除$()并在规则正文中使用$$(echo "$$ccred"),要么使用$(shell echo ...)来获取命令的输出。 -
顺便说一句,除了了解更多关于
bash和make的价值之外,我看不出避免使用colorgcc或colormake等简单工具的理由。但可能最好的解决方案是使用clang编译,它会自行为错误消息和警告着色。
标签: linux bash colors sed makefile