2012-05-03 14 views
5

どのようにeval関数をmakefileで使うことができますか?手動で

のeval関数は非常に特別である:それはあなたが一定ではない新しい メイクファイルの構造を定義することができます。これは他の変数と関数を評価する の結果です。 eval 関数への引数が展開され、その展開結果が メイクファイルの構文として解析されます。

eval引数が2回展開されていることを認識することが重要です。最初にeval関数で を実行すると、その展開結果はmakefile構文として解析されたときに再度展開されて になります。これは、 がevalを使用している場合に、 が "$"文字にエスケープのレベルを追加する必要があるかもしれないことを意味します。

「拡張された2倍」は私を混乱させる。例えば、私はメイクファイルを

を作成します。

define func 
    tmp = $(OBJPATH)/$(strip $1) 
    objs += $$(tmp) 
    $$(tmp) : $2 
     gcc $$^ -o [email protected] 
endef 

all : foo 

$(eval $(call func, foo, 1.c))  

eval関数が展開されますか?

+0

"eval関数はどのように拡張されますか?"あなたはそれを試しましたか? – Beta

答えて

15

それを理解する最も簡単な方法は、情報ではevalを置き換えることです:

$(info $(call func, foo, 1.c)) 

あなたが実際にパースされます作るものを見ることができるように、出力として最初の拡張の結果を表示します。 、

tmp = obj/foo 
objs += $(tmp) 
$(tmp) : 1.c 
    gcc $^ -o [email protected] 

その後メイクパーサはこれを評価します:あなたはOBJPATH変数の値を提供しなかったが、それはで、あなたのケースで、その後例えば(コール機能の)最初の拡張の結果objた場合処理中に再び展開されるので、$(tmp)のようなものが展開されます。

関連する問題