我有几个简单的目标可以为我创建一些文件。 例如:
[^0-9]
目标工作正常,正在创建文件并显示echo文本,但按此顺序(首先构建文件,然后在cmd.exe控制台上显示echo)。
我猜这与输出缓冲有某种关系,但我无法立即找到冲洗回声的方法。
任何提示?它甚至可能吗?
我正在使用Gnu Make 4.0
答案 0 :(得分:1)
你在这里混淆了上下文。
第一个@echo
行是一个配方行,当目标运行时由shell运行。
第二行$(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
内置的单个调用输出到文件而不是运行{{1} }调用N
。
修改:对于Windows echo
compat,您需要使用cmd.exe
作为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)
作为配方行,然后在配方执行期间执行。