make

Make と Makefile の説明の最初の例でつまづいた。

Makefile の例 (1) 愚直バージョン 〜

# Makefile 1 (「#」は行末までのコメント)

a.out: sub1.o sub2.o         # ターゲット a.out の依存ファイルは sub1.o, sub2.o
        cc -o a.out sub1.o sub2.o # a.out の生成コマンド

sub1.o: sub1.c               # sub1.o の依存ファイルは sub1.c
        cc -c sub1.c         # sub1.o の生成コマンド
sub2.o: sub2.c               # sub2.o の依存ファイルは sub2.c
        cc -c sub2.c         # sub2.o の生成コマンド

# header.h はコンパイル時に include されるので、実際には何もしなくてよい
sub1.c: header.h             # sub1.c の依存ファイルは header.h
sub2.c: header.h             # sub2.c の依存ファイルは header.h

上の例で、header.h は sub1.c, sub2.c 中に #include されているので、最後の sub1.c と sub2.c のための規則は、実際には何も行わない。これらの規則は header.h を修正したときのためにある。こうしておくと、make は header.h の更新をチェックすることで sub1.c や sub2.c も更新されたとみなし、sub1.c と sub2.c を自動的にコンパイルしなおしてくれる。

コンパイルしなおして欲しかったんだけど、してくれなかった。
実際の挙動が再コンパイルしないってことは、それが正しい動作なんだろうなぁ。
やっぱり*.oが*.hに依存することを直に書くしかないのか。

Gnu Makeの本でも読むか。オンラインでもあったと思うけど、どうも本の方がなじむ。
関数型言語 makeも。

あと、makeの-dオプションはいいなと思った。根性があれば、これで勉強できるだけのログ吐いてくれる。根性ないけど。