Gcc 在Makefiles中,如何显示编译百分比,后跟编译器';s警告/错误
这有点棘手 我希望Makefile显示编译的进度百分比。只要我使用tput或转义序列移动光标以修改百分比,这就很容易 但如果出现警告,下一个警告将出现在上一个警告上,依此类推 我怎么能做那样的事 我已经找到了一些想法,比如在变量中存储光标位置,但我失败了。 我曾想过将gcc(或clang的idc)的输出重定向到一个变量,但也失败了 我可以使用以下命令输出光标位置:Gcc 在Makefiles中,如何显示编译百分比,后跟编译器';s警告/错误,gcc,makefile,cursor-position,Gcc,Makefile,Cursor Position,这有点棘手 我希望Makefile显示编译的进度百分比。只要我使用tput或转义序列移动光标以修改百分比,这就很容易 但如果出现警告,下一个警告将出现在上一个警告上,依此类推 我怎么能做那样的事 我已经找到了一些想法,比如在变量中存储光标位置,但我失败了。 我曾想过将gcc(或clang的idc)的输出重定向到一个变量,但也失败了 我可以使用以下命令输出光标位置:echo-en“\033[6n”;read-sdR CURPOS;CURPOS=${CURPOS}*[};echo“$${CURPOS
echo-en“\033[6n”;read-sdR CURPOS;CURPOS=${CURPOS}*[};echo“$${CURPOS}”
,但我不能使用$(shell..)
,因为它只是无限循环(我猜)所以$(eval VAR=$(shell echo..)
是不可能的
也许我把问题看错了方向
我真的被困住了,谢谢你的帮助
编辑:
224全部:$(目标)
225如果[!'$(文件_TODO)=='0']];则echo-e$(RPO)$(ENDRASE)Done\n$(调试颜色)[链接]$(正常)-Done';fi
226$(ECHO)$(调试模式消息):$(如果$(ISXX),$(cxflags),$(CFLAGS))'
227
228$(目标):$(OBJFILES)
230$(CC)$(输出选项)$(LDFLAGS)$(LDLIBS)$(链接)$(如果$(单一),--覆盖率,)$^
231
232显示器:
233$(eval OBJ_NBR:=$(shell如果[[-d'$(OBJDIR)]];然后查找$(OBJDIR)-类型f-name\*$(OBJEXT);fi))
234$(评估对象编号:=$(shell echo-n“$$($(单词$(对象编号)))))
235$(eval FILE_TODO:=$(shell echo“$$($(SRC_NBR)-$(OBJ_NBR))))
236如果[!'$(文件_TODO)=='0']];则echo-en'$(调试颜色)【编译】$(正常)-(SPO)’;fi
237
238$(OBJDIR)/%%$(OBJEXT):%%$(SRCEXT)|显示
239$(评估I:=$(shell echo-n“$$($(I)+1)))
240$(评估百分比:=$(shell echo“$$((100*$(I)/$(文件\待办事项))))
$$(回声)$(rPOS)$(EnDRASE)$(%)%($ < P>作为注入规则的替代,MaFixFor文件中的目标,可能对构建过程产生负面影响,考虑一个将围绕生成程序工作的‘包装器’工具。
查询所需生成步骤的数量
执行make,定期检查剩余步骤,显示时间
一般来说,假设make过程很简单(例如,没有递归),执行“make-n”将很快,提供(相对)准确的结果,并且不会对构建过程产生负面影响。好吧,即使是脏的,一切似乎都在工作
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
238计数:$(OBJFILES)
239$(回声)$(计数)
240
241显示器:
242 ifneq($(MAKECMDGOALS),计数)
243$(评估文件\u TODO:=$(外壳$(制作)计数))
244如果[!'$(文件待办事项)==''];则echo-e'$(调试颜色)【编译】$(正常)-$(SPO);;fi
245 echo-en“\033[6n”;read-sdR CURPOS;echo${CURPOS.*[}>.curs\u pos.tmp
246 endif
247
248 CURPOS=$(外壳类别curs\u pos.tmp)
249
250$(OBJDIR)/%%$(OBJEXT):%%$(SRCEXT)|显示
251 ifneq($(MAKECMDGOALS),计数)
252$(评估I:=$(shell echo-n“$$($(I)+1)))
253$(评估百分比:=$(shell printf%.2f“$$((10000*$(I)-1)/($(文件待办事项)))e-2”))
254$(ECHO)-n'$(HIDECURS)$(rpo)$(ENDRASE)$(百分比)%($如果您认为计算和显示准确的百分比并不困难,这应该是一件轻而易举的事。百分比是什么?如何显示?向我们展示您到目前为止的情况。欢迎使用堆栈溢出。当编译器发出警告时,不清楚您希望此过程打印什么。我不确定将百分比输出集成到Makefile中是否正确考虑其他的替代/构建系统,它提供了这个功能。你打算如何测量“百分比”。要编译的文件的数量取决于修改的源文件的数量。问题的逻辑是基于计数文件。然而,通常会跳过最新对象的重建(基于时间戳)。.Counting“.o”可能是不同数量的编译任务。对伪目标“display”的额外依赖将禁用增量生成的(通常是非常理想的)功能。此外,在非交互式生成上会发生什么?输出将变得难以读取。由于“$(MAKE)count”,我可以计算需要重新编译的文件数,我创建的一个规则,用于计数,而无需通过ifneq($(MAKECMDGOALS),count进行编译
。问题是变量没有从子版本传递到当前版本。我仍然可以在当前版本中计数,并在子版本中编译,但这很奇怪……而且我真的不知道它是否会在您的包装器bash脚本中起作用TODO\u count=$(make count)
将为您提供一个变量,如果需要,您可以将该变量传递给以后的调用:make TODO\u COUNT=$TODO\u COUNT…
我不明白如何执行您所说的操作,因此我在$(shell)中使用了一个回音,以不同的方式执行此操作callRecommend查看它提供了一个框架,用于从命令行实用程序创建进度条。另外:
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