概要
Makefile のルールの中で変数を宣言し、それを使いまわしたい.
動機
代入する中身をshellコマンドにする場合 $(shell ...)
とすれば、そのコマンドの出力を代入できる. (代入する値が定数ならこの記事に書いて有ることは気にせず、ルールの外で代入しておけばよい.) shellコマンドによっては (例えば peco
コマンド) 何度も実行したくないし、別のルールを make する場合は一度も実行したくない. なので、あるルールの中で唯一度だけshellコマンド実行し、その出力を代入し、それを何度も使いたいという動機がある.
方法
通常、Makefile における変数の代入は :=
で行う.
しかしこれは (ba)sh のコマンドではないのでルールの中には書けない. つまり下のような Makefile は違法.
bad.makefile
rule:
F := $(shell seq 10 | peco)
echo $(F)
echo $(F)
$(eval ...)
の中に入れてやると良いということらしい.
good.makefile
rule:
$(eval F := $(shell seq 10 | peco))
echo $(F)
echo $(F)
他のルールから参照
することも問題なくできます.
a:
$(eval A := $(shell date))
echo "set A"
b: a
echo $(A)
$ make b
echo "set A"
set A
echo 2017年 8月24日 木曜日 15時12分07秒 JST
2017年 8月24日 木曜日 15時12分07秒 JST