GNU make で外部からの変数の追加 ― 2016年09月30日 12時17分16秒
Makefile では単純に二つの変数を表示する。
そして、そのままでは A が表示される。
% cat Makefile
LIST1 = A
LIST2 += A
print :
@echo $(LIST1)
@echo $(LIST2)
% gmake
A
A
今度は、引数から値を変更してみる。
+= も = と同じ結果になる。Makefile 内の LIST2 += A が無効になっていて、引数からの LIST2+=B も変数に追加になっていないのが分かる。Makefile 内の変数の処理が終った後にコマンドラインのものが処理されて、上書きされている様な動作だ。
% gmake LIST1=B LIST2=B
B
B
% gmake LIST1+=B LIST2+=B
B
B
今度は環境変数を通して値を設定するとまた動作が変わる。ここでは csh 系を使っているので、env を指定している。sh 系では env は必要無い。
環境変数だと、gmake 実行する前に値が設定されて、それを Makefile 内の記述が変更するようになる。LIST1 は = なので、A に変わり、LIST2 は += なので、A が追加されている。
% env LIST1=B LIST2=B gmake
A
B A
大概のシェルだと += で環境変数を追加することは出来ない。構文エラーにこそされないものの、B の影は無い。
ところが、bash には += 演算子があるのでこうなる
% env LIST1+=B LIST2+=B gmake
A
A
なお、make と bash で += の空白の処理が違う。
% bash
bash% LIST1+=B LIST2+=B gmake
A
B A
bash% LIST1+=B LIST2+=B LIST2+=C gmake
A
BC A
最近のコメント