首页 > 解决方案 > 在 Makefiles 中,如何显示编译百分比以及编译器的警告/错误

问题描述

这有点棘手……

我希望我的 Makefile 显示我的编译进度百分比。只要我使用 tput 或转义序列来移动光标以修改我的百分比,这很容易。

但如果出现警告,下一个警告将在前一个警告上,依此类推......

我怎么能做这样的事情?

我已经找到了一些想法,比如将光标位置存储在变量中,但我失败了。我曾考虑将 gcc(或 clang 的 idc)输出重定向到一个变量,但它也失败了。

我可以用 : 输出光标位置,echo -en "\033[6n" ; read -sdR CURPOS ; CURPOS=$${CURPOS#*[} ; echo "$${CURPOS}"但我不能使用$(shell ..),因为它只是无限循环(我猜)所以$(eval VAR = $(shell echo ..))是不可能的。

也许我把问题看错了?

我真的被困住了,所以谢谢你的帮助

编辑:

224 all : $(TARGET)
225     if [[ ! '$(FILE_TODO)' == '0' ]]; then echo -e $(RPOS)$(ENDRASE)Done\n$(DEBUG_COLOR)[Linkage]$(NORMAL) - Done'; fi
226     $(ECHO) '$(DEBUG_MODE_MSG) : $(if $(ISXX),$(CXXFLAGS),$(CFLAGS))'
227                                                                                   
228 $(TARGET) : $(OBJFILES)
230     $(CC) $(OUTPUT_OPTION) $(LDFLAGS) $(LDLIBS) $(LINKAGE) $(if $(UNITARY),--coverage,) $^
231 
232 display :
233     $(eval OBJ_NBR := $(shell if [[ -d '$(OBJDIR)' ]]; then find $(OBJDIR) -type f -name \*$(OBJEXT); fi))
234     $(eval OBJ_NBR := $(shell echo -n "$$(($(words $(OBJ_NBR))))"))
235     $(eval FILE_TODO := $(shell echo "$$(($(SRC_NBR)-$(OBJ_NBR)))"))
236     if [[ ! '$(FILE_TODO)' == '0' ]]; then echo -en '$(DEBUG_COLOR)[Compilation]$(NORMAL) - $(SPOS)'; fi
237 
238 $(OBJDIR)/%$(OBJEXT) : %$(SRCEXT) | display
239     $(eval I := $(shell echo -n "$$(($(I)+1))"))
240     $(eval PERCENT := $(shell echo "$$((100*$(I)/$(FILE_TODO)))"))
241     $(ECHO) '$(RPOS)$(ENDRASE)$(PERCENT)% ($<)' 
242     $(MKDIR) $(@D) $(patsubst $(OBJDIR)%,$(DEPDIR)%,$(@D))                             
243     $(CC) -c $(OUTPUT_OPTION) $(DEPFLAGS) $(if $(ISXX),$(CXXFLAGS),$(CFLAGS)) $(CPPFLAGS) $(WARNING) $(WNO) $(COMPILATION) $<

标签: gccmakefilecursor-position

解决方案


好吧,即使它很脏,一切似乎都在工作

238 count : $(OBJFILES)
239     $(ECHO) $(COUNTING)
240 
241 display :
242 ifneq ($(MAKECMDGOALS), count)
243     $(eval FILE_TODO := $(shell $(MAKE) count))                                                                                                                                            
244     if [[ ! '$(FILE_TODO)' == '' ]]; then echo -e '$(DEBUG_COLOR)[Compilation]$(NORMAL) - $(SPOS)'; fi
245     echo -en "\033[6n" ; read -sdR CURPOS ; echo $${CURPOS#*[} > .curs_pos.tmp
246 endif
247 
248 CURPOS          =   $(shell cat .curs_pos.tmp)
249 
250 $(OBJDIR)/%$(OBJEXT) : %$(SRCEXT) | display
251 ifneq ($(MAKECMDGOALS), count)
252     $(eval I := $(shell echo -n "$$(($(I)+1))"))
253     $(eval PERCENT := $(shell printf %.2f "$$((10000*$(I)-1)/($(FILE_TODO))))e-2"))
254     $(ECHO) -n '$(HIDECURS)$(RPOS)$(ENDRASE)$(PERCENT)% ($<)'
255     $(eval CURPOS = $(shell cat .curs_pos.tmp))
256     $(ECHO) -n "\033[$(CURPOS)H$(SHOWCURS)"
257     $(MKDIR) $(@D) $(patsubst $(OBJDIR)%,$(DEPDIR)%,$(@D))
258     $(CC) -c $(OUTPUT_OPTION) $(DEPFLAGS) $(if $(ISXX),$(CXXFLAGS),$(CFLAGS)) $(CPPFLAGS) $(WARNING) $(WNO) $(COMPILATION) $<
259     echo -en "\033[6n" ; read -sdR CURPOS ; echo $${CURPOS#*[} > .curs_pos.tmp
260 else
261     $(eval COUNTING = $(shell echo -n "$$(($(COUNTING)+1))"))
262 endif

谢谢你,我正在听每一个评论......


推荐阅读