16

次のようなメイクファイルがあります。

m1:
    @echo building m1

m1_:
    @echo building m1_


m2:
    @echo building m2

m2_:
    @echo building m2_

m3_DEPS = m2 m1

SUBSTITUTE=$(patsubst %,%_,$($@_DEPS))
.SECONDEXPANSION:

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

キーラインは

%:  $$(patsubst \%,\%_,$$($$@_DEPS))

パターン ルールと、それ自体がパーセント記号を使用する patsubst の両方を使用しています。%で文字をエスケープできると思いました\が、まだ期待どおりの動作が得られません。「make m3」を実行すると、出力が得られます

building m2
building m1
Building m3
Dependencies are m2 m1

しかし、私は得ることを期待しています

building m2_
building m1_
Building m3
Dependencies are m2_ m1_

その行をコメントアウトしpatsubst、変数を介して間接的に呼び出すと、実際にその出力が生成されます。

SUBSTITUTE=$(patsubst %,%_,$($@_DEPS))

%: $$(SUBSTITUTE)

また、パターン以外の規則を使用しても機能することをテストしました。これは、パターン規則とパーセント記号の相互作用に関係していると思われます。

m3:  $$(patsubst %,%_,$$($$@_DEPS))
4

3 に答える 3

20

\メイクファイルのコンテキストでは、「エスケープ」ではなく、行の継続のためです。変数に隠したものをエスケープするには:

PERCENT := %

アイデアは、エスケープされた文字が意味のあるメイクファイルフラグメントが解析されるときに、それをエスケープすることです。

したがって、あなたの状況では、次を使用する必要があります$$(PERCENT)

$$(patsubst $$(PERCENT),$$(PERCENT)_,$$($$@_DEPS))

于 2013-10-11T17:41:21.747 に答える