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 ) 文からは barbaz の値が見えてないですし、
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 も同様。

ローカル変数的に使うことができますね。

0 件のコメント:

コメントを投稿