詳細なmakefile評価関数

関数関数:関数「eval」は特別な関数です。これを使用して、Makefileで変数ルール構造の関係(依存関係チェーン)を構築します。この関係では、他の変数や関数を使用できます。関数「eval」はそのパラメーターを展開し、展開された結果はMakefileの一部として使用され、makeは展開されたコンテンツを解析できます。拡張の結果には、新しい変数、目標、暗黙的または明示的なルールなどが含まれる可能性があります。つまり、この関数の機能は、主に、パラメーターの関係と構造に従ってそれらを置き換えて拡張することです。

戻り値:関数「eval」の戻り値は時空間であるか、戻り値がないと言えます。
関数の説明:「eval」関数が実行されると、そのパラメーターは2回展開されます。最初の展開は関数自体によって実行され、2番目の展開は、関数の展開の結果がmakeによって解析されるときにMakefileのコンテンツとして使用される場合です。このプロセスを知ることは、「評価」機能を使用するために非常に重要です。関数「eval」の2番目の展開を理解した後。実際の使用では、関数の展開結果に参照がある場合(形式:(x))、関数パラメーターで「(x))を使用し、関数パラメーターで「(x))を使用する必要があります。X そのことの機能パラメータの数であることが原因により」の代わりに「」の代わりに"によって置き換えるために、」「ため


Makefileの評価を明確にするために非常に簡単な例を考えました。Makefile:

 2 pointer := pointed_value
 3 
 4 define foo 
 5 var := 123
 6 arg := $1
 7 $$($1) := ooooo
 8 endef 
 9 
10 $(info $(call foo,pointer))
11 #$(eval $(call foo,pointer))
12 
13 target:
14         @echo -----------------------------
15         @echo var: $(var), arg: $(arg)
16         @echo pointer: $(pointer), pointed_value: $(pointed_value)
17         @echo done.
18         @echo -----------------------------
19 

上記の例では、行$(eval $(call foo、pointer))がコメント化されていることに注意してください。最初にコメント行を指定してMakefileを実行すると、結果は次のようになります。

var := 123
arg := pointer
$(pointer) := ooooo
-----------------------------
var: , arg:
pointer: pointed_value, pointed_value:
done.
-----------------------------


var:= 123
arg:= router
$(pointer):= ooooo
これらの行は$(call foo、pointer)の結果であることに注意してください(またはfooをこの「関数」と呼びます(Makefileの正式な名前はマクロパッケージと呼ばれるため) )戻り値)。同時に、var、arg、pointed_valueはすべて空の値であることに注意してください。これは、実際には、パラメーターの後に$(info)関数を使用してfoo関数本体を置き換えるか、$(call foo、pointer)の戻り値が標準に出力されるためです。出力は($ 1はポインターであり、関数を呼び出し、パラメーターを直接置き換えるだけです)のみであるため、これらの数行のコードは実際には実行されません。

この$(call foo、pointer)は、Makefileによるfoo関数の最初の評価であることに注意してください。上記のように、評価の結果は実際にはMakefileコードです。

その後、問題が発生しています。評価の結果はまだMakefileコードであるため、このコードはどのように実行されますか?答えは、別の評価をパックすることです。そのため、評価は2回目に評価されます。
したがって、行$(eval $(all foo、pointer))のコメントを解除すると、実行結果は次のようになります。

var := 123
arg := pointer
$(pointer) := ooooo
-----------------------------
var: 123, arg: pointer
pointer: pointed_value, pointed_value: ooooo
done.
-----------------------------

OK。var、arg、pointed_valueはすべて割り当てられた値であることに注意してください。この割り当て操作は、最初に評価されたコードを実行した結果です。

では、fooパッケージを作成するときに$$($ 1):= oooooを作成する必要があるのはなぜですか?

Makefileの$はメタ文字(meta-chara ...)であるため、つまり、特別な意味があります。次に、$$を使用してMakefileの「文字」$を表現する必要があります。最初の評価の結果を確認できます。言うまでもありません。

おすすめ

転載: blog.csdn.net/xingzhibo/article/details/108000123