gccには,“gcc -M *.c”とすると,指定されたCソースコードがインクルードしている
インクルードファイルを列挙する機能がある.
この機能を利用して,Makefileの一部を自動生成することができる.
gmakeにはgccのこの機能をうまく利用するためにinclude機能が追加されている.
典型的な使用方法は以下のとおり.
[注:単にincludeだけであればgmakeに限らずほとんどの商用UNIX上のmakeでも使える.
ただ,単に“include x.d”と書けるだけでは使い勝手は微妙な感じ.
これだけでは“make depend”するときに“x.dがない”というエラーになってしまうので
(“x.d”は今まさに作ろうとしているファイルなので現時点で存在しないのは当然なのだけど…),
あらかじめ空のファイルを用意しておいたりしないといけなくて,わかりにくくなってしまう.]
CC = gcc
OBJS = main.o sub.o
%.d: %.c
$(CC) -M $< > $@
sample: $(OBJS)
$(CC) $(OBJS) -o $@
depend: $(DFILES)
include $(DFILES)
この機能を利用する場合は,まずmake dependとして*.dファイルを更新したのち,
再度makeを実行する.
※注意:“gcc -M *.c”の出力は標準出力にでるので,
“gcc -M main.c > main.d”のようにリダイレクトして結果をファイルに保存するのがよいと思われます.
出力先ファイル名を指定する“-o”も使えますけど,リダイレクトのほうがわかりやすいと思います.
ときどき,“gcc -c foo.c -ofoo.o”をコピーして“-M”オプションだけを加えて
“gcc -M -c foo.c -ofoo.o > foo.d”としてしまって混乱するときがあります(この場合
依存関係はfoo.oに書き出され,foo.dは空になる)ので気をつけてください.
Makefileにこのバグが入ると けっこう混乱します.
“gcc -M”だと,システム提供のヘッダファイル群(/usr/include/*)の依存関係も書き出してしまって
依存関係定義ファイル(*.d)が大変なことになってしまう傾向がある.
システム提供のヘッダファイル群の依存関係は気にしない場合には“gcc -MM”とするとよい.
[注:“gcc -MM”の仕様はgcc 3.0以前とそれ以降では少し使用が違っているらしい.
何が違っていたのかは よくわからなかったのだけど,info gccの-MMオプションのところに
そういう注意書きがあったので,念のため.]
gcc -M/-MMの詳細については,
info gccの“*Preporcessor Options::”セクションを見てください.