2012年6月12日火曜日
Makefile 変数のスコープ
Linux の Makefile には以下のような記述が出てきます。
clean: rm-dirs := $(CLEAN_DIRS)
clean: rm-files := $(CLEAN_FILES)
(ターゲット): (代入文)
という記述方法ですが、これっていったいどういう機能を持つのでしょうか?
以下のような簡単な Makefile を書いて実験してみます。
foo := 1
all: bar := 1
sub: baz := 1
all: sub
all sub:
@ echo foo = $(foo) in $@
@ echo bar = $(bar) in $@
@ echo baz = $(baz) in $@
$(warning foo = $(foo) in warning)
$(warning bar = $(bar) in warning)
$(warning baz = $(baz) in warning)
$ make
を実行すると
Makefile:12: foo = 1 in warning
Makefile:13: bar = in warning
Makefile:14: baz = in warning
foo = 1 in sub
bar = 1 in sub
baz = 1 in sub
foo = 1 in all
bar = 1 in all
baz = in all
と表示されました。
$(warning ) 文からは bar と baz の値が見えてないですし、
all の構築ルールの中では baz の値が見えてないですね。
また
$ make sub
を実行すると
Makefile:12: foo = 1 in warning
Makefile:13: bar = in warning
Makefile:14: baz = in warning
foo = 1 in sub
bar = in sub
baz = 1 in sub
sub の構築ルールの中では bar の値が見えないですね。
foo := 1 がグローバル変数的な振る舞いをするのに対して、
all: bar := 1 と書くと、all を構築している間だけこの代入文が見えます。
all の構築が終わると消えます。
sub: baz := 1 も同様。
ローカル変数的に使うことができますね。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿