私はGNU make 3.81を使用しています。ここでは、問題を示していたテストのmakefileは次のとおりです。マクロを使ってforeach内で複数のMakefileターゲット/ルールを生成するにはどうすればよいですか?不思議な挙動
define BOZO
a$(1): b c
touch a$(1)
endef
$(foreach i,1 2 3,$(call BOZO,$(i)))
ここでの考え方は、予測可能なパターンに従うルールを生成するために、マクロテンプレート(ボゾ)を使用することです。
問題:(ライン10は、foreachのとラインの場合)
Makefile.fake:10: *** multiple target patterns. Stop.
:私はこのメイクファイルでmakeを実行したときに、私はというエラーを取得します。
ここで、そのエラーが通常示していることを知っています。 info
関数を使って拡張を標準出力に送ることで、その行がどのように展開するのかを見てみましょう。
$(info $(foreach i,1 2 3,$(call BOZO,$(i))))
と私は実行します:私はあることを10行に変更
$ make -n
a1: b c
touch a1
a2: b c
touch a2
a3: b c
touch a3
make: *** No targets. Stop.
「無ターゲット」のメッセージが期待されていることに注意してください、$(情報...)関数は、空にすることを評価するのでなく、生成されたルールをに印刷にします。
これらのルールを実行しましょうか?
$make -n > out.txt
make: *** No targets. Stop.
$make -f out.txt a1 a2 a3
touch a1
touch a2
touch a3
$
AAARGH!ルールは正常に動作します。だから...作るか、私の理解のバグですか?その後、
$(foreach i,1,$(call BOZO,$(i)))
(ようにforeachのは一つだけの繰り返しを持っている)
と
$make a1
の操作を行います。私はforeachのラインを変更した場合:
一つの最終診断に役立つかもしれない手がかり別のエラーが発生する:
make: *** No rule to make target `a1'. Stop.
$(foreach)
の拡張子が「$(info)
」以外のものを「見る」ことはできません。その出力は正当なものなので、かなり困惑しています。
D'OH!まあまあ、私はMakefileマクロが初めてです。なぜこれが必要なのか、私はまだ分かりませんが、それがうまくいくので、私はそれを瞑想します。ありがとう! – Joe