12

したがって、次のようなターゲット依存関係を持つメイクファイルがあります。

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xml$(lang)))

targetName ターゲットは次のようになります。

targetName%.xml%: MODEL\=% targetName.xml*

しかし、うまくいきません。次のエラーが表示されます。

make[1]: *** No rule to make target `targetNameMYMODEL.xmlen', needed by `all'.  Stop.

ただし、次のように targetName ターゲットでハードコードされた言語を使用して「all」を呼び出すと機能します。

all: $(foreach lang, $(LANGS), $(foreach models,$(MODELS),targetName$(model).xmlen))

また、all または targetName に言語を指定せずに「all」を呼び出しても問題なく動作します。おそらく、Makefile はターゲット名に 2 つのパーセント記号が含まれることを好まないのではないかと考えています。

また、私はこの makefile を継承しているので、MODEL\=% の意味を誰か教えてもらえますか? 次のようなターゲットがもう 1 つあります。MODEL%: ;しかし、\=% の意味がわかりません。

編集:したがって、この応答に基づいてさらに明確にするために:

たとえば、5 つのモデルのリストと 5 つの言語のリストがあります。目標は、言語とモデルの組み合わせごとに 1 つずつ、25 個のファイルを生成することです。

targetName%.xml ターゲットは、本来は targetName.xml というファイルを作成しますが、現在は targetName.xml のようなファイルを作成する必要があるため、2 つの % 記号が必要でした。

上記のように、ネストされた foreach を使用してこれら 2 つのリストを循環していますが、これらの変数をターゲットに渡すのに苦労しています。foreach ステートメントから言語変数をエクスポートしようとしました。targetName%.xml の内容を for ループに入れて、そこで言語をループしようとしました。ループの 'do' 部分に Makefile コマンド (eval など) があるため、後者は機能しません。

4

2 に答える 2

5

%その通りです。Makeは、ターゲット名に2 つの記号が含まれることを好みません。これは、Make のワイルドカード処理がすべてではないと思われる方法の 1 つにすぎません。1 つの変数の値を反復する (そして%他の変数に使用する) すべてのパターン ルールを自動的に生成する方法があります。少し醜いですが、それが必要な場合はお見せできます。

しかし、この行は混乱しています:

targetName%.xml%: MODEL\=% targetName.xml*

ターゲット内の 2 つのワイルドカードの問題を除けば、最後の preq は、targetName.xml*まさにそれを意味します: というターゲット (またはファイル) targetName.xml*. アスタリスクは展開されず、 で始まる既存のすべてのファイルのリストには展開されませtargetName.xmlん。

次に がありMODEL\=%ます。これは、この makefile の作成者が少し混乱していたことを示しています (そして、テストを信じていませんでした)。ワイルドカードの値が の場合、fooこれは という名前のターゲット (またはファイル) である前提条件を示しますMODEL=foo。はを\「エスケープ」する=ため、Make は中止されませんが、これは健全なエラー メッセージを単に抑制するだけです。著者の意図は次のようなものだったと思います。

targetName%.xml: MODEL=%

targetName%.xml: $(wildcard targetName.xml*)
    do some things

最初のルールは前提条件を指定しておらず、ターゲット固有の変数を設定しています。したがって、Make がtargetNamefoo.xmlによってビルドしようとするdoing some thingsと、変数はそのコマンドのコンテキストでMODEL値を持ちます。foo2 番目のルールには、によって生成された preq リストがありwildcardます。ターゲット固有の変数と preq を 1 行に混在させることはできません。

さらにアドバイスをすることもできますが、あなたが何をしようとしているのかをもう少し明確に把握できれば助かります。

于 2012-06-14T17:06:19.167 に答える