type.register

libルールは見つかるのに、exeルールやobjルールの定義が見当たらないなぁと思って探していたら、type.registerの中にありました。

rule register ( type : suffixes * : base-type ? )
{
    # 〜中略〜

    {
        # 〜中略〜

        main-rule-name = [ type-to-rule-name $(type) ] ;
        .main-target-type.$(main-rule-name) = $(type) ;

        IMPORT $(__name__) : main-target-rule : : $(main-rule-name) ;
    }
}

ここでは、typeからルール名を作って、その名前でmain-target-ruleをグローバルモジュールにインポートしています。
なので、tools/types/exe.jamの

type EXE : exe : : NT CYGWIN ;

で、exeルールはtype.main-target-ruleのエイリアスになるわけですね。
main-target-ruleはコールスタックから呼び出されたルール名(type)を判断し、typeに応じたターゲットをtargets.create-typed-targetを用いて生成するわけです。
これでexe/objなどのメインターゲットルールが抽象ターゲットを生成する流れは解明できました。
次はgenerateメソッドで仮想ターゲットが生成されるまでを追っていきます。