C/C++ 開発のストレスを軽減する

少し前に Eclipse から NetBeans に移行したが、再度 Eclipse にもどることにした。なぜかというと、Neteans は SVN コミットで日本語コメントを入れるとエラーになったりしてストレスを感じていたのだ*1。ありえないよね、もったいない・・・。

いろいろと試した結果、Eclipse でも C/C++ プロジェクトではなく makefile プロジェクトを選択すれば十分に快適ということが分かった。もちろん、makefile を書かなくてはならないのだが、どうせ Autotools 向けのものは書くので苦にはならない。

これで基本的には OK。しかし、開発対象が途上であると Autotools は中々面倒くさくて、コードを追加していくと configure.ac や Makefile.am をいじることになり、その度に ./configure しないといけない。./configure は時間がかかるため、結構なストレスになる。

そこで、他のビルドルールを試すことにした。比較結果は以下のサイトがよくまとまっていると思う。

試したのは CMake、SCons の二つ。なぜかというと、Visual C++ コンパイラを使ったビルドが簡単で、Objective-C コードのビルドも難なくこなせるからだ。マルチプラットフォームに対応したコードを開発する上で、これは重要である*2

一ヶ月ほど 30000 行程度のあるコードのビルドを Autotools、CMake、SCons で、それぞれ WindowsLinuxMac OS X 上で試用してみた。所感は以下のとおり。

  • Autotools
    • どんな環境でも動くといっていい
    • ./configure には結構時間がかかる
    • Visual C++ との連携が困難
  • CMake
  • SCons
    • そこそこ速い
    • Python で記述できるので強力
      • CMake と比べると記述量が多くうざい
    • Visual C++ との連携が容易

この程度のコード量だと、大規模開発にはスケールしないと言われている SCons でも十分実用に耐えるビルド速度だった。SCons は確か差分ビルドの基準がファイルの MD5 だったりしたので、その辺が効いてくるんじゃないだろうか。この辺を変更したい場合は、StackOverflow に投稿されている以下の質問が参考になる。

env.Decider('timestamp-newer') としてやれば、タイムスタンプで差分を検出するようになり、scons -j 2 などとすれば並列でビルドしてくれるようになるらしい。

結局 Autotools と SCons を使うことにした。CMake は Objective-C がちょっと怪しいので止めた。ビルド設定を二種類メンテナンスしていくのは骨が折れるので、そのうち SCons 一本でいくかもしれない。

ストレス軽減のまとめ。

  1. EclipseC/C++ 開発をするときは、C/C++ プロジェクトではなく makefile プロジェクトを選択する
  2. SCons で Autotools の ./configure の煩わしさを避ける

*1:6.9.1 on Mac OS X

*2:一概にはいえないが、Windows 向けバイナリはやはり Visual C++ が出力するコードが一番優れていると信じている