make -> scons

dtlはヘッダファイルのみから構成されるライブラリなので、単にdtlを使用するユーザはdtl自体を特にビルドする必要はないんだけど、サンプルプログラムとテストプログラムはmakeかsconsを使ってビルドする必要がある。

元々はMakefileだけ用意していたんだけど、今年の春ぐらいにSConstruct*1を使ってビルドできるようにした。というのもここから先、makeの延長上でさらに自動化しようとするとautotoolsが真っ先に挙がるけど、サンプルとテストのプログラムのためだけに用意するのも億劫なので、別手段を考えていたというのがある。もっとも最初の理由はMakefileの頭に「CPP =g++」と環境べったりな書き方をしていてどうにかしたかったからなのだが。

あと、やっぱり自分で依存関係書き出すのがめんどくさい。あ〜、いや、どうせGCCの-MMオプション使うから書くのは面倒でもなんでもないんだけど、更新は自分の手でやんないといけない。こんな風にdependターゲットを定義して。

CPP = g++
                     ・
                     ・
                     ・
DEPENDENCY_FILE = Makefile.depend
                     ・
                     ・
                     ・
depend:
        @echo "generating dependency file"
        @$(CPP) -MM *.cpp > $(DEPENDENCY_FILE)

include $(DEPENDENCY_FILE)

SConsだとファイル間の依存関係は自動で解析してくれる上に実行環境の違いも全部面倒を見てくれる。*2

まとめると、

  • ライブラリを使用するだけであればMakefileはあまり関係がない(開発者用のファイル)
  • makeの延長上で自動化するのはいろいろと面倒というか大げさ。(あとMakefileで「CPP = g++」とベタ書きしているのが個人的にイマイチ)
  • 依存関係の更新が必要
  • SConsの方が単純明快(少なくともdtlのサンプルおよびテストプログラム用には)

というわけで、dtlの次のバージョンからはサンプルおよびテストプログラム用のMakefileは削除することにした。

*1:SCons用のMakefileみたいなもの

*2:autotoolsやCMakeはビルドスクリプトを環境に合わせて生成する