Makefile “multiple target patterns. Stop.”ソリューション
3347 ワード
数日、同僚のXenのtoolsのコンパイルを手伝っていたとき、configファイルをいくつか変更して、「Makefile:72:***multiple target patterns.Stop.」というエラーに遭遇しました.約30分かかってやっとこのエラーを見つけたのは、自分が構成を間違えた理由で、その過程とその根本的な原因を話しました.
総じて言えば、「mutiple target patterns」というエラーは、一般的にMakefileのtargetの行に余分なコロン(:)があるため(Makefileのコロンは前がコンパイルの目標であることを識別するために使用されていることを知っています)、余分なコロンがあればエラーを報告します.この問題を調べるには、自分で別の目標を定義し、間違った行を抱いている情報をすべて印刷して、余分なコロンがあるかどうかを確認する方法があります.
私が出会った間違いの行は以下の通りです:roms.inc: $(ROMBIOS_ROM) $(SEABIOS_ROM) $(stdVGA_ROM) $(CIRRUSVGA_ROM) ../etherboot/eb-roms.hは4つの変数に依存しており,そのうちのいくつかの変数はこのMakefileで直接定義されていないため,見つけるのが面倒である.Makefileにtargetを追加してこの変数を印刷してみました.追加したMakefileコードは次のとおりです.
View Code BASH
その後、元のエラーの行をコメントして「make mydebug」を実行し、/tmp/debug-makefileを見てみましょう.logファイルでは、ここの$(SEABIOS_ROM)変数に不正なコロン文字が含まれていることに気づきました.その値は:git://vt-sync/seabios.git/out/bios.bin探し続けると、私はConfigにいることに気づきました.mkに「SEABIOS_DIR?=git://vt-sync/seabios.git」というミス.簡単な説明のために、次の簡単な例を見てください.Makefileは次のようになります.
View Code BASH
「build:temp$(OBJ 1)」と同じように「make build」を実行すると「Makefile:3:***multiple target patterns.Stop.」とエラーが表示されます.そして原因を調べるために、buildというtargetを注釈して「make test」を実行すると、すぐにOBJ 1='temp 1:'になるので間違いがあります.実際に発生した問題は、この小さな例ほど簡単ではありません.エラーの変数は必ずしも現在のMakefileに直接定義されているわけではありません.エラーを排除するために、いくつかの変数の値を直接echoして表示することができます.
`missing target pattern. Stop.’ `multiple target patterns. Stop.’ `target pattern contains no `%’. Stop.’ These are generated for malformed static pattern rules. The first means there’s no pattern in the target section of the rule, the second means there are multiple patterns in the target section, and the third means the target doesn’t contain a pattern character (%). Makefile error: http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_121.html
変換元:http://smilejay.com/2012/03/makefile_multiple_target_patterns/
総じて言えば、「mutiple target patterns」というエラーは、一般的にMakefileのtargetの行に余分なコロン(:)があるため(Makefileのコロンは前がコンパイルの目標であることを識別するために使用されていることを知っています)、余分なコロンがあればエラーを報告します.この問題を調べるには、自分で別の目標を定義し、間違った行を抱いている情報をすべて印刷して、余分なコロンがあるかどうかを確認する方法があります.
私が出会った間違いの行は以下の通りです:roms.inc: $(ROMBIOS_ROM) $(SEABIOS_ROM) $(stdVGA_ROM) $(CIRRUSVGA_ROM) ../etherboot/eb-roms.hは4つの変数に依存しており,そのうちのいくつかの変数はこのMakefileで直接定義されていないため,見つけるのが面倒である.Makefileにtargetを追加してこの変数を印刷してみました.追加したMakefileコードは次のとおりです.
View Code BASH
1
2
3
4
mydebug:
echo "/* just for debugging in Makefile */"
echo "$(ROMBIOS_ROM) $(SEABIOS_ROM) $(STDVGA_ROM) $(CIRRUSVGA_ROM)" > /tmp/debug-makefile.log
echo "/* END for debugging in Makefile */"
その後、元のエラーの行をコメントして「make mydebug」を実行し、/tmp/debug-makefileを見てみましょう.logファイルでは、ここの$(SEABIOS_ROM)変数に不正なコロン文字が含まれていることに気づきました.その値は:git://vt-sync/seabios.git/out/bios.bin探し続けると、私はConfigにいることに気づきました.mkに「SEABIOS_DIR?=git://vt-sync/seabios.git」というミス.簡単な説明のために、次の簡単な例を見てください.Makefileは次のようになります.
View Code BASH
1
2
3
4
5
OBJ1="temp1:"
#build: temp $(OBJ1)
test: temp
echo "OBJ1='$(OBJ1)'" > /tmp/debug-makefile.log
「build:temp$(OBJ 1)」と同じように「make build」を実行すると「Makefile:3:***multiple target patterns.Stop.」とエラーが表示されます.そして原因を調べるために、buildというtargetを注釈して「make test」を実行すると、すぐにOBJ 1='temp 1:'になるので間違いがあります.実際に発生した問題は、この小さな例ほど簡単ではありません.エラーの変数は必ずしも現在のMakefileに直接定義されているわけではありません.エラーを排除するために、いくつかの変数の値を直接echoして表示することができます.
`missing target pattern. Stop.’ `multiple target patterns. Stop.’ `target pattern contains no `%’. Stop.’ These are generated for malformed static pattern rules. The first means there’s no pattern in the target section of the rule, the second means there are multiple patterns in the target section, and the third means the target doesn’t contain a pattern character (%). Makefile error: http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_121.html
変換元:http://smilejay.com/2012/03/makefile_multiple_target_patterns/