GNU Make环境延迟了Windows cmd

我有几个简单的目标,为我创build一些文件。 例:

$(MAKE_INA): @echo Building ASM compilation flags file $(notdir $(MAKE_INA)) @$(foreach i, $(sort $(ASMFLAGS) $(PFLAGS) $(ALL_INC_DIR) $(cppGetPreProcessorDefines)), $(shell echo $i >> $@ )) 

目标工作正常,正在创build文件并显示回显文本,但按照该顺序(首先构build文件,然后在cmd.exe控制台上显示回显)。

我猜这与输出缓冲有关,但我无法立即find回显的方法。

任何提示? 这甚至有可能吗?

我正在使用Gnu Make 4.0

这里混合了上下文。

第一个@echo行是一个配方行,当目标运行时由shell运行。

第二个$(foreach)行在规则内,但是是一个make context行, 运行配方行之前由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)) >> $@ 

哪个在配方执行时间回显(所以有正确的顺序),并使用一个调用内置的printf输出到文件,而不是运行N呼叫echo

编辑:对于Windows cmd.exe compat,您需要使用echo $i >> $@ &作为$(foreach)正文,以便cmd.exe正确运行多个命令。

如果你确实想保持N回声呼叫,那么你可以使用:

 $(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 >> $@; 作为在配方执行期间执行的配方行。