プログラミングユーティリティ

パターン置換マクロ参照

接尾辞の規則およびパターンマッチングの規則と同様に、指定したマクロ参照の語を変更する方法として、マクロ参照で接尾辞を置換する既存の方法よりもさらに汎用性が高い、パターン置換マクロ参照が追加されました。パターン置換マクロ参照は、以下の形式で記述します。

$(macro:p%s=np %ns)

ここで、p は既存の接頭辞 (ある場合)、s は既存の接尾辞 (ある場合)、np および ns は新しい接頭辞および接尾辞、% は 0 文字または 1 文字以上の一致文字列を示すワイルドカードです。

接頭辞および接尾辞の置換は、既存のパターンに一致するマクロの値中のすべての語に適用されます。この機能は、特にサブディレクトリの名前をそのサブディレクトリに含まれる各ファイルの接頭辞として使用する場合に便利です。以下にメークファイルの例を示します。

SOURCES= x.c y.c z.c 
SUBFILES.o= $(SOURCES:%.c=subdir/%.o) 

all: 
        	@echo $(SUBFILES.o)

結果は以下のようになります。

$ make
subdir/x.o subdir/y.o subdir/z.o

= 記号の右側 (置換後の語) では、任意の数だけワイルドカードの % を必要に応じて使用できます。以下に例を示します。

...
NEW_OBJS= $(SOURCES:%.c=%/%.o)

この置換は、以下のような結果になります。

...
x/x.o y/y.o z/z.o

パターン置換マクロ参照は、パターンマッチングの規則が記述されているターゲットエントリの依存関係を示す行では使用しないでください。使用した場合は、予期しない結果が生じます。以下にその例を示します。

OBJECT= .o 

x: 
%: %.$(OBJECT:%o=%Z) 
        	cp $< $@

このメークファイルは、makex.Z というファイルから x を構築しようとして記述したものです。しかし、依存関係の行に複数含まれている % のうち、どれをパターンマッチングの規則で使用し、どれをマクロ参照に適用するかを、make が特定できないため、パターンマッチングの規則は認識されません。

したがって、x.Z のターゲットエントリは実行されません。このような問題を回避するため、他の行で中間マクロを使用できます。

OBJECT= .o 
ZMAC= $(OBJECT:%o=%Z) 

x: 
%: %$(ZMAC) 
        	cp $< $@