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メソッドで仮想ターゲットが生成されるまでを追っていきます。