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
$
他にも応用範囲が広いです。