0

次のコードをデバッグしようとしています。

TESTS=$(shell cat yoursourcefile)
all: $(TESTS)

%: compile_design
compile $@_tb.vhd >> log_file.log
simulate $@

このエラーが発生しました:

makefile_tb.vhd >> log_file.log

あたかもmakefileがターゲットであるかのように

% の前に 1 つ以上の文字を追加すると、このエラーは消えます。

T%: compile_design
compile $@_tb.vhd >> log_file.log
simulate $@

これは機能しますが、すべてのターゲットが「T」で始まることを意味します。これは常にそうとは限りません。私の質問は次のとおりです: % here の機能は正確には何ですか? このエラーを取り除くにはどうすればよいですか?

提案どおり、追加しました

makefile: ; $@:

最後に、だから私は今持っています:

TESTS=$(shell cat yoursourcefile) 
all: $(TESTS)

%: compile_design 
compile $@_tb.vhd >> log_file.log
simulate $@

makefile: ; $@: 

それから私がするとき:

make all

[all] error2 all_tb.vhd >> log_file.log が表示されます

しかし、all_tb.vhd は存在しません。

4

1 に答える 1

1

%: compile_designルールは「何でも一致」パターン ルールです。「ねえ、make、任意のファイルを任意の名前でビルドしたい場合はこれらのコマンドを実行することで実行できます。ところで、ビルドしたいファイルがあり、それがそのcompile_designファイルよりも古い場合、その後、再構築する必要があります。」一般に、何にでも一致するルールは避けたいと考えていますが、ターゲット名に特定のパターンが本当にない場合はできません。

その前にを追加するTと、任意のファイルの代わりに、そのルールは で始まるファイルのみをビルドできることが make に指示されますT

make が makefile を再構築しようとする理由は、GNU make には独自の makefile を再作成できる特別な機能があるためです。そのため、makefile を読み取った後、再作成を試みます。通常、makefile を構築するルールがないため、これは効果がありませんが、ここでは make が何でも構築できるというルールを追加しました。を追加すると、で始まらないためT、パターンが一致しなくなります。MakefileMakefileT

最も簡単なことは、makefile に明示的な規則を定義することです。make は、パターン規則のような暗黙的な規則よりも、明示的な規則が存在する場合は常にそれを選択します。

Makefile: ; @:

これにより、何もしない明示的なルールが作成されます (:は何もしないシェル組み込みコマンドです)。

于 2013-09-18T12:06:13.700 に答える