Open3

独学Makefileメモ

Yu MatsuzawaYu Matsuzawa

Makefileで、ディレクトリターゲットをつくり、中の処理としてはcp -Rやrsyncで別の元ディレクトリからたくさんの静的ファイルを纏めて持ってきて配置するとする。

dist/target/static/:
  rsync -av --delete source/static dist/target/

このターゲットを$(shell find <元ディレクトリ>)に依存させることで、元ディレクトリの中身に変化があればremakeさせることができる

dist/target/static/: $(shell find source/static)
  rsync -av --delete source/static dist/target/

find source/static -type fにすると存在するファイルしか列挙されない。つまりファイル削除を検知できない。ディレクトリも列挙に含めておけば削除を検知できる)

が、makeはmtimeでremakeするかどうか判定するので、ターゲットであるディレクトリ自体のmtimeが変わらない場合、元ディレクトリのコンテンツのほうがディレクトリのmtimeより新しければ常にremakeされてしまって効率が悪い。

思いついた方法としては処理の後touch <ターゲットディレクトリ>してmtimeを更新すること。するとターゲットディレクトリのほうが新しくなるので、元ディレクトリのコンテンツのどれかが本当に更新されるまでremakeは行われなくなり、よい

dist/target/static/: $(shell find source/static)
  rsync -av --delete source/static dist/target/
  touch dist/target/static/
Yu MatsuzawaYu Matsuzawa

make/Makefileは結構好きなんだけど完全に独学なので有識者コメントもらえることを期待