NMAKE除了子串替换之外没有太多的字符串处理,甚至不能进行宏扩展。但是,由于 NMAKE 支持 makefile 包含,因此您可以利用一种明显的技术,尽管它的实现有些复杂。
这个想法是创建一个临时生成文件,通过包含在递归调用中,在需要时执行另一轮宏扩展。这可用于向字符串列表添加变量前缀、后缀或分隔符。如果需要,同样可以进行进一步的扩展轮次。
以下代码段说明了该方法。它将列表a b c d e
转换为[a];[b];[c];[d];[e]
(即在元素之间添加前缀、后缀和分隔符)。原始的 makefile(如果 NMAKE 支持二次扩展将执行的规则)大部分未更改。最后,NMAKE 在整个运行之后不会留下任何临时文件。
# The name of the makefile.
MAKEFILE = test.mak
# The list of strings to be processed. The elements can be separated by one or more spaces or tabs.
LIST = a b c d e
# The prefix to add to each element.
PREFIX = [
# The suffix to add to each element.
SUFFIX = ]
# The separator to add between each element.
SEP = ;
#####
# Replace tabs with spaces.
# Note: there is a hard tab character between the colon and the equal sign.
LIST = $(LIST: = )
!IFNDEF TEMPFILE
# Write a temporary makefile.
target1 target2:
@$(MAKE) /nologo /C /$(MAKEFLAGS) /F$(MAKEFILE) TEMPFILE=<< $@
LIST = $(PREFIX)$$(LIST: =$(SUFFIX)$(SEP)$(PREFIX))$(SUFFIX)
LIST = $$(LIST:$(PREFIX)$(SUFFIX)$(SEP)=)
<<NOKEEP
!ELSE
# Here goes your original makefile.
! INCLUDE $(TEMPFILE)
target1:
@echo.$@
@echo.$(LIST)
target2:
@echo.$@
@echo.$(LIST)
!ENDIF
唯一需要注意的是命令行宏不会传递给递归调用,因此不再有用。