CFormat:
define Format_File :=
@echo Formatting
ifneq ("$(wildcard $(1))","")
@echo if1
# The default extensions for intermediate files are not used,
# to avoid collisions with backup files open in the editor, etc.
# Save the original source file with an '_X' suffix on the extension.
ifneq("$(wildcard $(1)_X)","")
@echo if2
else
@echo else2
endif
@ren $(1) $(1)_X
# C-Comment is invoked separately, due to pathing limitations
# The redirection is a means to suppress blabbering.
@echo Formatting $(1) . . .
$(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $(1)_X -o$[Base, $(1)].tmp -ino >temp.tmp;
$(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $(1)].tmp -o$(1) >temp.tmp;
else
@echo else1
endif
endef
FormatAll: CFormat
$(foreach loopFile,$(ALL_S_SOURCES),$(eval $(call Format_File,$(loopFile))))
.PHONY: FormatAll
当我用 info 替换 eval 时,它正确打印出函数调用,但每次我尝试实际评估格式化程序时,它都会在标题中给出错误。
编辑:这个问题到处都受到语法错误的困扰,但按照@MadScientist的建议,我最终能够使用shell循环让它工作。
最简单的答案是,你不能那样做。单个函数如$(foreach ...)
,或单个变量展开,可以never扩展到 makefile 中的多个逻辑行。 make 解析器不是这样工作的。
更远,$(eval ...)
可以用来构建一个完整的规则,但你不能用它来构建规则的一部分:在 make 开始解析评估的输出之前,它将“关闭”当前正在定义的任何规则(就像你可以的那样) t 将规则的介绍放在一个文件中,将配方放在另一个文件中并使用include
包括食谱)。
你还没有真正解释为什么你想以这种方式做事。一个简单的答案是使用 shell 循环,而不是 makefile 循环,如下所示:
FormatAll: CFormat
@for f in $(ALL_S_SOURCES); do \
echo Formatting; \
if [ -f $$f ]; then \
echo if1; \
if [ -f $${f}_X ]; then \
echo if2; \
else \
echo else2; \
fi; \
ren $$f $${f}_X; \
echo Formatting $$f . . .; \
$(CFORMAT_PATH)\Cformat -h$(CFORMAT_PATH) $F{f}_X -o$[Base, $$f].tmp -ino >temp.tmp; \
$(CFORMAT_PATH)\Ccomment -h$(CFORMAT_PATH) $[Base, $$f].tmp -o$$f >temp.tmp; \
else \
echo else1; \
fi; \
done
我同意 Etan 的观点$[Base ...]
语法很奇怪而且肯定不正确。
如果您想了解更多详细信息eval
和调试,你可以看看这个帖子 http://make.mad-scientist.net/the-eval-function/以及该系列的早期作品。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)