2017-05-06 229 views
0

エラー:メークファイル:12:***最初のターゲットの前にレシピが開始されます。やめる。最初のターゲットの前にレシピが開始されます

私のメイクファイル:

objDir := obj 
incDir := include 
srcDir := src 
binDir := bin 
files := matrix palindrome encryption 

define generateObject 
    @nasm -f elf32 -o $(objDir)/$(1).o $(srcDir)/$(1).asm 
endef 

object: $(addprefix $(srcDir)/,$(addsuffix .asm,$(files))) 
    @echo -n "Generating object files... " 
    $(foreach file,$(files),$(eval $(call generateObject,$(file)))) 
    @echo "Done" 

私はこれが不要な空白/タブに起因することができることを記事で読んしかし、私はいずれかを見つけることができませんでした。

私はcat -e -t -v Makefileを試してみましたが、出力されました:

objDir := obj$ 
incDir := include$ 
srcDir := src$ 
binDir := bin$ 
files := matrix palindrome encryption$ 
$ 
define generateObject$ 
^[email protected] -f elf32 -o $(objDir)/$(1).o $(srcDir)/$(1).asm$ 
endef$ 
$ 
object: $(addprefix $(srcDir)/,$(addsuffix .asm,$(files)))$ 
^[email protected] -n "Generating object files... "$ 
^I$(foreach file,$(files),$(eval $(call generateObject,$(file))))$ 
^[email protected] "Done"$ 
+0

私が見ることができるこのメイクファイルには何も問題はありません。私がそれを使ってmakeを実行すると、そのようなエラーは発生しません。どのオペレーティングシステムを使用していますか? makeのどのバージョンを使用していますか( 'make --version'を実行してください)? – MadScientist

+0

私はUbuntu 16.04でGNU Make 4.1を使用しています。 –

答えて

0

あなたの問題はeval機能を使用することです。 evalは、makeの構文を解析するために使用されますが、シェルコマンドに渡しています。

$(foreach file,$(files),$(eval $(call generateObject,$(file)))) 

generateObjectと呼び出すたびにファイル名を付けます。それはシェルコマンドに拡張されます。

^[email protected] -f elf32 -o obj/matrix.o src/matrix.asm 

が次にあなたがそのテキスト文字列を取り、メイクファイルとしてそれを読み取ろうとevalに渡します。たとえばfileは、callはに拡大します行列ある場合。 evalに渡されるテキストは、完全で有効なメイクファイルでなければなりません。あなたがmakeを再帰的に呼び出すようなもので、この文字列をmakefileとして与えましたが、解析の結果は現在のmakefileに適用されます。有効なメイクファイルの一部(レシピの1つのコマンドラインのようなもの)だけをevalに与えることはできず、それを現在のメイクファイルに挿入することもできません。その行自体は有効ではないため、このエラーが発生します。

結果にevalを実行する代わりに、それらを1つのシェルコマンドに連結する必要があります。これを試してみてください:

define generateObject 
    nasm -f elf32 -o $(objDir)/$(1).o $(srcDir)/$(1).asm 
endef 

object: $(addprefix $(srcDir)/,$(addsuffix .asm,$(files))) 
     @echo -n "Generating object files... " 
     @$(foreach file,$(files),$(call generateObject,$(file)) &&) true 
     @echo "Done" 

しかし、それは本当に「やり方」ではありません。 1つのルール内に複数のターゲットを構築する必要はありません。これは、古いもののファイルのみを再構築するというmakeの主な点を打ち破ります。

あなたはこのようなあなたのメイクファイルを作成する必要があります。

object: $(files:%=$(objDir)/%.o) 

$(objDir)/%.o : $(srcDir)/%.asm 
     @nasm -f elf32 -o [email protected] $< 

あなたはgenerateObject変数、またはcall、またはevalを必要とする、あるいはforeachません。

+0

ソリューションとアドバイスをありがとう。 –

関連する問題