ルールに%文字を含む複数のターゲットがある場合、makeが奇妙に動作するのはなぜですか?

ルールに%文字を含む複数のターゲットがある場合、makeが奇妙に動作するのはなぜですか?

~によるとGNU製作マニュアル

複数の目標を持つルールは、それぞれが目標を持つ複数のルールを作成するのと同じで、その他は同じです。同じレシピがすべてのターゲットに適用されますが、「$@」を使用して実際のターゲット名をレシピに変更できるため、効果が異なる場合があります。さらに、この規則はすべてのターゲットに対して同じ前提条件を提供します。

最初に生成されたファイル:
%.in %.out:
    echo BLANK > $@

対応するbashセッション:

$ ls
Makefile

$ make a.in a.out
echo BLANK > a.in
make: Nothing to be done for 'a.out'.

$ ls
Makefile  a.in

$ make a.out
echo BLANK > a.out

$ ls
Makefile  a.in  a.out

$ make b.in c.out
echo BLANK > b.in
echo BLANK > c.out

$ make d.in d.out
echo BLANK > d.in
make: Nothing to be done for 'd.out'.

$ make e.out e.in
echo BLANK > e.out
make: Nothing to be done for 'e.in'.

$ ls
Makefile  a.in  a.out  b.in  c.out  d.in  e.out
2番目の生成されたファイル:
%.in:
    echo BLANK > $@

%.out:
    echo BLANK > $@

対応するbashセッション:

$ ls
Makefile

$ make a.in a.out
echo BLANK > a.in
echo BLANK > a.out

$ ls
Makefile  a.in  a.out

$ # nice       

したがって、質問は次のようになります。

最初のMakefileがターゲット<name>.in <same name>.outを生成しないのはなぜですか?解釈が2番目のMakefileと似ていないのはなぜですか?

ベストアンサー1

あなたのルールによると、makeレシピへの単一の呼び出しで両方そして目標.in.out

https://www.gnu.org/software/make/manual/html_node/Pattern-Intro.htmlこれについて説明します。 (第2段落では)次のように言います。

パターンルールには複数のターゲットを含めることができますが、各ターゲットには%文字を含める必要があります。記号。

次のリンクをクリックしてください多くの目標グループ化されたターゲット(&:通常は明示的なルールがある場合は区切り文字を使用)が、make作成するレシピへの単一の呼び出しを通知することを説明します。みんな一度に一つずつではなく、その一つです。

したがって、パターンルールは次のようになります。

a.in a.out &:
        echo BLANK > $@

...欲しいものと同等の代わりに:

a.in a.out :
        echo BLANK > $@

私が知る限り、後者のように動作し、一度に1つだけを生成するパターンルールを作成する方法はありません。あなたはただ持っていればいい分離%.inそしてルール%.out

おすすめ記事