2016-08-25 10 views
0

私はmakeのドキュメントを正しく理解していれば、自分のターゲットパターンで文字%を1回しか使用できません!Gnuはパターンルールに複数の%を付けますか?

私は私の目標は次のようになりある条件直面しています:

$(Home)/ecc_%_1st_%.gff: %.fpp

そして、私は/home/ecc_map_1st_map.gff: map.fpp メイクは、そのパターンを見つけることができない文句を言い一致しようとしていますたびに。

私はそれが原因で二回($(Home)/ecc_map_1st_%.gff: %.fppルーン完璧)%を使用するのである知っている

私は1つのターゲットで二パーセントを使用することができますとにかくがあります!

ありがとうございました

+2

ファイル名に 'map'という単語が2回必要ですか? – igagis

答えて

0

パターンは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を生成することさえできます)。

関連する問題