パターンは2つありません。最良の方法は、ターゲット名にmap
を2回もたないことです。
あなたがしなければならない場合、あなたはGNU makeを使用している、secondary expansionは役に立つかもしれない:
.SECONDEXPANSION:
$(Home)/ecc_%.gff: $$(word 1,$$(subst _, ,$$*)).fpp
通常は、前提条件で、このような$*
などautomatic variablesを使用することはできませんが、二次拡張あなたはちょうどそれを行うことができます。実際の展開が2回目のパスで起こり、最初のパスでは起こらないように、$
の代わりに$$
を使用しました。
$(Home)/ecc_map_1st_map.gff
と言っています。 $*
変数がステムになります。つまり、map_1st_map
です。次に$(subst _, ,...)
は、アンダースコアをスペースで置き換えてmap 1st map
を取得します。今度は$(word N,...)
はそこにN番目のスペースで区切られた単語を抽出します。最初の単語は最初のmap
、2番目は1st
、3番目の単語はmap
となります。私は最初のものを選んでいます。
もちろんこれはかなり甘くて、あなたが望むターゲットと正確に一致することを保証するものではありません($(Home)/ecc_map_2nd_notmap__foo.gff
は一致し、map.fpp
となります)。あなたはさらにチェックを行うことができます(途中で1st
を、他の2つは一致している必要があります)と救済:
extract-name = $(call extract-name-helper,$1,$(word 1,$(subst _, ,$1)))
extract-name-helper = $(if $(filter $2_1st_$2,$1),$2,$(error Invalid .gff target))
.SECONDEXPANSION:
ecc_%.gff: $$(call extract-name,$$*).fpp
をしかし、それは賢明な解決策のようにしていません。
折り返し、同様の名前のファイルがない場合は、最初の解決策がうまくいくはずです。また、あらかじめターゲット名を知っていれば、明示的なパターンルールで安全にすることができます(あるいは、on the flyを生成することさえできます)。
ファイル名に 'map'という単語が2回必要ですか? – igagis