~によると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