# Copyright (c) 2009 Vladimir Prus
#
# Use, modification and distribution is subject to the Boost Software
# License Version 1.0. (See accompanying file LICENSE_1_0.txt or
# http://www.boost.org/LICENSE_1_0.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 ;
