2

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

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.txtd = 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) はおそらく間違っているというのが私の意見です。

4

1 に答える 1

4

マニュアルから、

前提条件が実際に存在するか言及されているルールは、他の暗黙のルールをチェーンすることによって作成する必要がある前提条件を持つルールよりも常に優先されます。

ルール#1には連鎖が必要であり、ルール#2には前提条件がないため、Makeはビルドを試みるときに#1ではなく#2を選択しますDIR/3/abc.txt

編集:

ディレクトリのリストを持って立つことができる場合:

DIRS := DIR/0 DIR/1 DIR/2 DIR/3

次に、静的パターンルールを使用してそれを行うことができます:

all: DIR/0/a.txt DIR/1/b.txt DIR/2/c.txt DIR/3/abc.txt

ABC_TXT := $(addsuffix /abc.txt, $(DIRS))

$(ABC_TXT): DIR/%/abc.txt : DIR/%/def.xtx

DIR/%.txt:
    mkdir -p $(@D)
    touch $@

DIR/%.xtx:
    touch $@

(そしてそれは.txtルールの重複も避けます!)

于 2012-10-23T16:47:35.530 に答える