make-advent-calendar-2017-to-2019

依存

ターゲット の : の右側に、そのターゲットファイルが依存するファイルやターゲットを書くことができます。

国民の祝日CSVから、2018年の祝日を抜き出してみましょう。

YEAR := 2018

# 何もターゲットを指定しなければ syukujitsu.$(YEAR).csv を作りたい
all: syukujitsu.$(YEAR).csv

# syukujitsu.$(YEAR).csv は syukujitsu.csv に依存する
syukujitsu.$(YEAR).csv : syukujitsu.csv
	grep $(YEAR) syukujitsu.csv > syukujitsu.$(YEAR).csv

# syukujitsu.csv を取ってくる
syukujitsu.csv:
	curl -O http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

やってみましょう

$ make -C 05-prerequire
curl -sO http://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv
grep 2018 syukujitsu.csv > syukujitsu.2018.csv

makeは依存ファイルのタイムスタンプを見て、更新されたときだけ作ろうとします。もう一度同じコマンドを叩いてみましょう。

$ make -C 05-prerequire
[No write since last change]
make: Nothing to be done for `all'.

作りたい syukujitsu.2018.csv のタイムスタンプが依存する syukujitsu.csv よりも新しいので、やることは何もないよ、ということになります。 これは今よりもずっと計算機が遅かった頃に、無駄なコンパイルを避けて高速に開発するために必要だった機能です。今日においても便利ですね。

makeが参照しているのはタイムスタンプなので、タイムスタンプを更新してやるとまた走ります。

$ touch 05-prerequire/syukujitsu.csv
$ make -C 05-prerequire
grep 2018 syukujitsu.csv > syukujitsu.2018.csv

便利ですね。