ksaitoの日記

日々試したことの覚え書き

makeでシェルの結果を利用する

makeでログファイルや実行結果を保存する場合、タイムスタンプを付けたファイルやディレクトリを使いたいことがあります。
単純にdateコマンドで作成したタイムスタンプをTSという変数に入れてみます。

$ cat Makefile
TS=`date +%Y%m%d%H%M%S`

all:
	echo ${TS}
	sleep 2
	echo ${TS}
$

この方法だとdateコマンドの結果ではなくコマンドシーケンス全体がTSに格納されるため1秒以上かかる処理があるとタイムスタンプがずれてしまいます。

$ make
echo `date +%Y%m%d%H%M%S`
20100205005347
sleep 2
echo `date +%Y%m%d%H%M%S`
20100205005349
$

こういう場合、$(shell コマンド)という形式を利用するとコマンドの実行結果が文字列として格納できます。

$ cat Makefile 
TS=$(shell date +%Y%m%d%H%M%S)

all:
	echo ${TS}
	sleep 2
	echo ${TS}
$ make
echo 20100205005924
20100205005924
sleep 2
echo 20100205005924
20100205005924
$

他にも応用範囲が広いです。