続・Boost C++ Libraries は本当に便利なのか?
前回の記事に短時間でそこそこのアクセスがあったようですので、もう少し補足してみたいと思います。単なる愚痴なので、補足するのもおかしな話なのですが...
まずは、Boost C++ Libraries のバージョンを上げたことで遭遇した具体的な問題をいくつか挙げてみたいと思います。更新履歴に表れているような、互換性を損なう大きな仕様変更はもちろんですが、それ以外にも細々したことがあります。
1.33.1 からバージョンを上げたときだったと思いますが、それまで不要だった(というか存在しなかった) -lboost_system* が必要になりました。(私が作ったプログラムは)ソースコードで頒布している以上、ユーザーの手元でアプリケーションをビルドしなければならないわけですが、当然リンクエラーを生じて失敗します。
他には、Spirit のスキップパーサーの挙動が変わったために、バージョンアップによって不具合を生じたケースが確実に記憶しているだけでも二回ありました(Spirit のバージョンは 2.x ではありません)。現象さえつかめれば修正はそれほど難しくはありませんが、すでに出回っているソースコードはどうしようもありません。
次に、環境によってライブラリファイルの名前にまったく一貫性がないのも困りものです。libboost_filesystem-xx.a の -xx の部分です。大体ルール通りにはなっているようなのですが、環境によっては -mt 付きのものが存在しなかったり、逆に -mt 付きのものしかなかったり、-s 付きのものが存在しなかったりとバラバラです。toolset の部分はもっと悲惨です。こんな状況で、どうやって汎用的な Makefile を書けばよいのか、途方にくれてしまいます。
そういえば、MinGW の場合は bjam でビルドすると、GCC のくせに .a ではなく .lib が生成されます。結果として -lboost_filesystem... のように記述できなかったりします。MSYS で ./configure; make とすればよいのでしょうか? そういえばちゃんと試したことがありません(何年も前に挑戦してうまくいかなかった記憶が...)。
そして、これは Boost C++ Libraries の責任ではないのかもしれませんが、一部の環境、例えば Cygwin では、/usr/include/boost-1_33_1 にインクルードパスを通さないと、ヘッダファイルをインクルードできませんでした。バージョンに依存したディレクトリ名を指定しないといけないわけですが、もし複数のバージョンがインストールされていたらどうすればよいのか困ってしまいます。なお、現在の Cygwin ではこの問題は解消されているようです(ただし、アップデートしても古いバージョンのライブラリが残ってしまうので、手作業で消さないといけなかったような記憶が...)
Cygwin といえば、以前は GCC の例外処理の方式が sjlj だったのに、少し前から --disable-sjlj-exceprions が指定されています。にもかかわらず、一時期、Cygwin の setup.exe でインストールされる Boost C++ Libraries は sjlj のものだったので、当然リンクエラーが発生していました。これも現在は解消されているようです。
バージョン付きのライブラリファイル名をハードコーディングするようなヘマをしたのならともかく、そうでなければ、ライブラリがバージョンアップしても、同じようにコンパイル・リンクができて、同じように振る舞って欲しいというのはごく普通の希望だと思います(自分が開発しているツールなどもそうなっていないので、大きなことはいえないのですが...)。

もう少し補足
configureやMakefileについては、AX_BOOST_* を使うという手もあるのですが、大して賢くない割には大きなスクリプトが生成されるので、個人的には好きではありません(好き嫌い以前に、詳しくは書けませんが、諸般の事情で使用が制限されていることのほうが大きいのですが...)。そもそも問題の一部しか解決されませんし。