ライブラリの名前を変更してauto_link.hppを使う

Boost.Buildで名前を変更する方法がよくわからなかったのでいろいろ調べてたらなんとなく理解できたのでメモ。

プロジェクトの設定でtagプロパティに名前を設定するruleを与えて、そのrule上で名前を返却すれば良いようです。commonモジュールを使って生成した名前を返却すればBoostのライブラリと同じ名前を返却することができます。

import common ;

rule library-name ( name : type ? : property-set )
{
    local name = [ common.format-name <base> <toolset> <threading> <runtime>
                                    : $(name)
                                    : $(type)
                                    : $(property-set) ] ;
    return $(name) ;
}

common.format-nameで名前を生成します。各プロパティの並び順を指定して後はruleで受け取った引数をそのまま全部渡してしまうだけ。ruleの引数は恐らくこれでないとまずい。後はこのruleをプロジェクトのtagプロパティに渡してビルドすれば良いだけ。私は面倒なのでprojectに設定します。

project
    : requirements <tag>@library-name
    : build-dir bin
    ;

これを自動リンクする場合、boost.configにあるauto_link.hppを使えば簡単ですね。BOOST_LIB_NAMEでライブラリの名前だけ指定してこのヘッダインクルードすると自動リンクできます。(といっても、コンパイラがpragma commentをサポートしていれば、の話ですが)
例として、boost.iostreamsのauto_link.hppはこういった形になっています。

#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_IOSTREAMS_DYN_LINK)
// ダイナミックリンク時にはこのマクロを定義しなければならない
#    define BOOST_DYN_LINK
#endif

#define BOOST_LIB_NAME boost_iostreams
#include <boost/config/auto_link.hpp> // 自動リンク, BOOST_LIB_NAMEはundefされる

追記)Boost以外のリンクを行う際

BOOST_LIB_VERSIONも必要とするので、それに関係したdefineもundefする必要があります。例えば、バージョンをライブラリ名に埋め込まない場合はBOOST_LIB_VERSIONを空にします
そんなことありませんでした。ただ空にするだけでは無理なようです。BOOST_AUTO_LINK_TAGGEDを定義してtoolsetとversionを外したライブラリ名にすることはできるようです。