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::
”セクションを見てください.