2013-10-07 11 views
7

私は次のようなMakefileを持っている:パターンルールとpatsubstをGNU makeで使用するときに "%"記号を正しくエスケープする方法は?

m1: 
    @echo building m1 

m1_: 
    @echo building m1_ 


m2: 
    @echo building m2 

m2_: 
    @echo building m2_ 

m3_DEPS = m2 m1 

SUBSTITUTE=$(patsubst %,%_,$([email protected]_DEPS)) 
.SECONDEXPANSION: 

#%: $$(SUBSTITUTE) 
%: $$(patsubst \%,\%_,$$([email protected]_DEPS)) 
    @echo Building [email protected] 
    @echo Dependencies are $^ 

キーの行は、私は、それ自体がパーセント記号を使用するパターンルールとpatsubst、両方を使用しています

%: $$(patsubst \%,\%_,$$([email protected]_DEPS)) 

です。私は\%文字をエスケープできると思ったが、まだ期待された動作を得ていない。 「M3を作る」実行すると、出力に

building m2 
building m1 
Building m3 
Dependencies are m2 m1 

を与えるしかし、私は

building m2_ 
building m1_ 
Building m3 
Dependencies are m2_ m1_ 

は、その行をコメントアウトし、実際にその出力を生成しない変数を介して間接的にpatsubstを呼び出してもらうことを期待しています。

SUBSTITUTE=$(patsubst %,%_,$([email protected]_DEPS)) 

%: $$(SUBSTITUTE) 

また、私は私はパターンルールとパーセント記号の相互作用とは何かであると思わせるこれは、非パターンルールが機能使用していることをテストしています

m3: $$(patsubst %,%_,$$([email protected]_DEPS)) 

答えて

11

\のメークファイルコンテキストは、行継続のためのものであり、 "エスケープ"のものではありません。物事を脱出するには、変数にそれらを隠す:

PERCENT := % 

アイデアはmakefileの一部は、エスケープ文字が有意義であり、あなたはそれをエスケープ解析された時点で、です。

だから、あなたの状況では、あなたが$$(PERCENT)を使用する必要があります。

$$(patsubst $$(PERCENT),$$(PERCENT)_,$$([email protected]_DEPS))

+0

これは私が変数に式全体を隠して何をしたかのようであるが、より直接的に質問に答えます。 –

+0

ああ申し訳ありませんが、私はあなたがそれをしたことに気付かなかった。私はちょうど「これは可能ではないようです」と見て、残りの部分はスキップしました。 –

1

私は「ドントンパターンルールから「%」を隠す方法を知っているが、この場合には、あなたはそれを回避することができます。

%: $$(addsuffix _,$$($$*_DEPS)) 
    @echo Building [email protected] 
    @echo Dependencies are $^ 
0

これが可能であるようには見えません。

いくつかの回避策については、質問とベータの回答を参照してください。

関連する問題