次のメイクファイルがあります。
all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt
DIR/%/abc.txt: DIR/%/def.xtx # rule #1
mkdir -p $(@D)
touch $@
DIR/%.txt: # rule #2
mkdir -p $(@D)
touch $@
DIR/%.xtx:
touch $@
DIR/%/def.xtx
が生成されるたびに生成したいDIR/%/abc.txt
。それ以外の場合は生成のみDIR/%.txt
。
ただし、GNU Make 3.81 で上記の makefile を使用すると、生成されるだけでDIR/3/abc.txt
、生成されDIR/%/def.xtx
ません。
GNU make ユーザーマニュアルの「暗黙のルール検索アルゴリズム」に従うと、次のようになります。
(1) t を d と呼ばれるディレクトリ部分と n と呼ばれる残りの部分に分割します。たとえば、t が 'src/foo.o' の場合、d は 'src/' であり、n は 'foo.o' です。
DIR/3/abc.txt
、d = DIR/3
およびn = abc.txt
. _
(2) ターゲットの 1 つが t または n に一致するすべてのパターン規則のリストを作成します。ターゲット パターンにスラッシュが含まれている場合は、t と照合されます。それ以外の場合は、n に対して。
ルール #1 と #2 が一致します。
(3) そのリストのいずれかのルールが何でもマッチ ルールでない場合は、リストからすべての非終端マッチ ルールを削除します。
不明: リストから削除されるルールはありません。
(4) レシピのないすべてのルールをリストから削除します。
ルールは削除されません。
(5) リスト内のパターンルールごとに:
(5.a) 語幹 s を見つけます。これは、ターゲット パターンの '%' に一致する t または n の空でない部分です。
ルール 1 については、s = 3
. ルール 2 については、s = 3/abc
(5.b) '%' を s に置き換えて前提条件の名前を計算します。ターゲット パターンにスラッシュが含まれていない場合は、各前提条件名の前に d を追加します。
ルール #1 の場合、次のようになります。DIR/3/abc.txt: DIR/3/def.xtx
ルール #2 には前提条件がありません。
(5.c) すべての前提条件が存在するかどうか、または存在する必要があるかどうかをテストします。(ファイル名がターゲットとして、または明示的な前提条件として makefile で言及されている場合、それは存在すべきであると言います。)
不明:DIR/3/def.xtx
はルールで言及されていDIR/%.xtx:
ます。
この長い長い説明の後で、(5.c) はおそらく間違っているというのが私の意見です。