Gcc 在Makefiles中,如何显示编译百分比,后跟编译器';s警告/错误

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

这有点棘手

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

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

我怎么能做那样的事

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

我可以使用以下命令输出光标位置:
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