NMAKE は部分文字列の置換を除いて多くの文字列処理を備えておらず、これでもマクロ展開を行うことはできません。ただし、NMAKE は makefile のインクルードをサポートしているため、実装がやや複雑ではありますが、活用できる明らかな手法があります。
アイデアは、一時的なメイクファイルを作成し、再帰呼び出しに含めることで、必要に応じて別のマクロ展開ラウンドを実行することです。これを使用して、変数の接頭辞、接尾辞、または区切り記号を文字列のリストに追加できます。必要に応じて、さらに拡張ラウンドを同様に実行できます。
次のスニペットは、メソッドを示しています。a b c d e
リストを次のように変換します[a];[b];[c];[d];[e]
(つまり、プレフィックス、サフィックス、および要素間の区切り記号を追加します)。元のメイクファイル (NMAKE が 2 次展開をサポートする場合に実行されるルール) はほとんど変更されていません。最後に、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
これによる唯一の注意点は、コマンドライン マクロが再帰呼び出しに渡されないため、あまり役に立たないことです。