【问题标题】:In Makefiles, how to display percentage of compilation followed by compiler's warnings/errors在 Makefiles 中,如何显示编译百分比以及编译器的警告/错误
【发布时间】:2019-11-12 15:04:17
【问题描述】:

这有点棘手......

我希望我的 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) $<

【问题讨论】:

  • 如果您认为计算和显示准确的百分比并不难,这应该是轻而易举的事。百分之几?怎么显示?向我们展示您目前所拥有的。
  • 欢迎来到 Stack Overflow。当编译器发出警告时,不清楚您希望此过程打印什么。
  • 我不确定将百分比输出集成到 Makefile 中是正确的逻辑。考虑提供此功能的其他替代方案/构建系统
  • 您打算如何衡量“百分比”。要编译的文件数量取决于修改的源文件数量?
  • 问题中的逻辑是基于计数文件的。但是,make 通常会跳过重建最新对象(基于时间戳)。计算“.o”可能是非常不同的编译任务数量。对伪目标“显示”的额外依赖将禁用增量构建的(通常非常需要的)功能。另外,非交互式构建会发生什么?输出将变得难以阅读

标签: gcc makefile cursor-position


【解决方案1】:

作为注入规则的替代方法,Makefile 中的目标可能会对构建过程产生负面影响,请考虑使用可围绕 make 程序工作的“包装器”工具。

  1. 查询需要构建步骤的数量
  2. 执行 make,定期检查剩余步骤,显示 %-age。

一般来说,假设 make 过程很简单(例如,没有递归),执行 'make -n' 会很快,提供(相对)准确的结果,并且不会对构建过程产生负面影响

【讨论】:

  • 感谢“$(MAKE) count”,我可以计算需要重新编译的文件数量,这是我创建的规则,无需通过ifneq ($(MAKECMDGOALS), count) 编译即可计算。问题是变量没有从子 make 传递到当前 make。我仍然可以计算当前的 Make 并在子 Make 中编译,但这很奇怪......而且我真的不知道它是否能正常工作
  • 在你的包装 bash 脚本 TODO_COUNT=$(make count) 中会给你一个变量,如果需要,你可以将它传递给未来的调用:make TODO_COUNT=$TODO_COUNT ...
  • 我不明白你说的怎么做,所以我通过在 $(shell) 调用中使用 echo 来完成它
【解决方案2】:

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多