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
さんは、空の文字列に展開さ
あなたが変数に結果を割り当てる場合は、ストリップやevalを必要としません。変数に改行文字を含むことは問題ありません(実際には 'fooBody'は既に...) – MadScientist
関数呼び出しの結果が変数に割り当てられていない場合のためのストリップと評価です。 –
ああ、私はあなたが何を意味するかを見て、これはfooの代わりにfooを置き換えます。 Hm。個人的に私はそれが好きではありません:それは混乱しています。私はあなたが 'foo'を使うことができるということを知っています。個人的に私はこのような変数にevalを追加するというイディオム全体のファンではありません。通常の方法は 'foo'に代入を入れ、呼び出しの結果を評価することです。しかし、実際のメイクファイルではもっと意味があります。 – MadScientist