# Copyright (c) 2009 Vladimir Prus
#
# Use, modification and distribution is subject to the Boost Software
# License Version 1.0. (See accompanying file LICENSE.txt or
# https://www.bfgroup.xyz/b2/LICENSE.txt)

# Implements 'convert' target that takes a bunch of source and
# tries to convert each one to the specified type.
#
# For example:
#
#   convert objects obj : a.cpp b.cpp ;
#

import targets ;
import generators ;
import project ;
import type ;
import "class" : new ;

class convert-target-class : typed-target
{
    rule __init__ ( name : project : type
    : sources * : requirements * : default-build * : usage-requirements * )
    {
        typed-target.__init__ $(name) : $(project) : $(type)
          : $(sources) : $(requirements) : $(default-build) : $(usage-requirements) ;
    }

    rule construct ( name : source-targets * : property-set )
    {
        local r = [ generators.construct $(self.project) : $(self.type)
          : [ property-set.create [ $(property-set).raw ] # [ feature.expand
              <main-target-type>$(self.type) ]
          # ]
            : $(source-targets) ] ;
        if ! $(r)
        {
            errors.error "unable to construct" [ full-name ] ;
        }

        return $(r) ;
    }

}

rule convert ( name type : sources * : requirements * : default-build *
    : usage-requirements * )
{
    local project = [ project.current ] ;

    # This is a circular module dependency, so it must be imported here
    modules.import targets ;
    targets.main-target-alternative
      [ new convert-target-class $(name) : $(project) : [ type.type-from-rule-name $(type) ]
        : [ targets.main-target-sources $(sources) : $(name) ]
        : [ targets.main-target-requirements $(requirements) : $(project) ]
        : [ targets.main-target-default-build $(default-build) : $(project) ]
        : [ targets.main-target-usage-requirements $(usage-requirements) : $(project) ]
      ] ;
}
IMPORT $(__name__) : convert : : convert ;
