[英]Delayed Windows cmd echo with GNU Make environment
我有几个简单的目标可以为我创建一些文件。 例:
$(MAKE_INA):
@echo Building ASM compilation flags file $(notdir $(MAKE_INA))
@$(foreach i, $(sort $(ASMFLAGS) $(PFLAGS) $(ALL_INC_DIR) $(cppGetPreProcessorDefines)), $(shell echo $i >> $@ ))
目标工作正常,正在创建文件并显示回显文本,但按此顺序进行(首先构建文件,然后在cmd.exe控制台上显示回显)。
我想这与输出缓冲有某种关系,但我无法找到立即刷新回声的方法。
有什么提示吗? 可能吗?
我正在使用Gnu Make 4.0
您在这里混淆上下文。
第一行@echo
行是配方行,在目标运行时由外壳运行。
第二条$(foreach)
行在规则内,但是make上下文行, 在运行配方行之前由make评估。 在该行中$(shell)
也是一个make命令,它在配方的make扩展期间运行,而不是在配方执行时由shell运行。
要执行您想要的操作,您可以使用:
$(MAKE_INA):
@echo Building ASM compilation flags file $(notdir $(MAKE_INA))
@printf "%s\\n" $(sort $(ASMFLAGS) $(PFLAGS) $(ALL_INC_DIR) $(cppGetPreProcessorDefines)) >> $@
哪个在配方执行时执行echo
(因此具有正确的顺序),并使用对内置内置printf
的单个调用输出到文件,而不是运行N
调用echo
。
编辑:对于Windows cmd.exe
兼容,您需要使用echo $i >> $@ &
作为$(foreach)
主体,以便cmd.exe
正确运行多个命令。
如果您确实想保留N
echo调用,则可以使用:
$(MAKE_INA):
@echo Building ASM compilation flags file $(notdir $(MAKE_INA))
@$(foreach i, $(sort $(ASMFLAGS) $(PFLAGS) $(ALL_INC_DIR) $(cppGetPreProcessorDefines)), echo $i >> $@; ))
里面有$(foreach)
输出 echo XXX >> $@; ....; echo ZZZ >> $@;
echo XXX >> $@; ....; echo ZZZ >> $@;
作为要在配方执行期间执行的配方行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.