2017-01-21 11 views
0

このメークファイルでは、どうして私はセパレータエラーが発生したのかわかりません。メークファイルからの別のエラーが見つかりません

define foo 
$(eval a := $(1)) 
$(eval b := $(1)) 
endef 

$(call foo,hello) 

$(info $(a)) 
$(info $(b)) 

all: ; 

私はしかし、これで最初のevalを置き換える場合は、

$(eval a := $(1)) \ 

は、エラーが表示されなくなります。 evalは何も展開されておらず、defineの内部には1つの評価が幸いです。しかし、私はなぜこのケースでそれが不平を言うのか、なぜ後ろのスラッシュがそれを解決するのか分からない。

答えて

1
define foo 
$(eval a := $(1)) 
$(eval b := $(1)) 
endef 

bar:=$(call foo,hello) 

$(info $(a)) 
$(info $(b)) 
$(info bar=[$(bar)]) 

all: ; 

このメイクファイル出力を実行:

$ make -f Makefile.sample 
hello 
hello 
bar=[ 
] 
make: 'all' is up to date. 

だから、$(FOO)関数は、改行文字を出力します。何も出力しないか、値を変数に取り込むか、$(eval)または$(strip)でトラップする必要があります。

$(eval a := $(1)) \ $(foo)の新しい行出力がないため、問題が解決されます。あなたの$(FOO)にバックスラッシュを追加する

代替は、以下のとおりです。

#1:

define fooBody 
$(eval a := $(1)) 
$(eval b := $(1)) 
endef 
foo = $(strip $(call fooBody,$1,$2)) 

#2

define fooBody 
$(eval a := $(1)) 
$(eval b := $(1)) 
endef 
foo = $(eval $(call fooBody,$1,$2)) 

#3

$(strip $(call foo,hello)) 

#4

$(eval $(call foo,hello)) 

#5

.:=$(call foo,hello) 

私の個人的な選択は、#1です。両方evalさんは、空の文字列に展開さ

+0

あなたが変数に結果を割り当てる場合は、ストリップやevalを必要としません。変数に改行文字を含むことは問題ありません(実際には 'fooBody'は既に...) – MadScientist

+0

関数呼び出しの結果が変数に割り当てられていない場合のためのストリップと評価です。 –

+0

ああ、私はあなたが何を意味するかを見て、これはfooの代わりにfooを置き換えます。 Hm。個人的に私はそれが好きではありません:それは混乱しています。私はあなたが 'foo'を使うことができるということを知っています。個人的に私はこのような変数にevalを追加するというイディオム全体のファンではありません。通常の方法は 'foo'に代入を入れ、呼び出しの結果を評価することです。しかし、実際のメイクファイルではもっと意味があります。 – MadScientist

1

単一の改行でcall拡張結果(、あなたが言うように、ので。makeはそれを解析しようとすると、それはそれを理解して、このエラーをスローしません。

理解が重要なことは、入力が論理行に分割されてから展開を試みる前に、拡張が完了した後、makeは出力を1行表示することを期待しています。

おそらく012でバグを報告したいと思えば、これはもっとうまく処理できるかもしれません。

ETAは実際に私がチェックされ、これはすでに4.2を作るGNUで修正されています:

$ make-4.1 
Makefile:5: *** missing separator. Stop. 

$ make-4.2 
make: *** No targets. Stop. 
関連する問題