我有几个简单的目标,为我创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 >> $@;
作为在配方执行期间执行的配方行。