繁体   English   中英

使用GNU Make环境延迟Windows cmd回显

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM