# Copyright 2003 Dave Abrahams
# Copyright 2003 Douglas Gregor
# Copyright 2006 Rene Rivera
# Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)

#  This module defines the 'make' main target rule.

import "class" : new ;
import errors : error ;
import project ;
import property ;
import property-set ;
import regex ;
import targets ;


class make-target-class : basic-target
{
    import type regex virtual-target ;
    import "class" : new ;

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

    rule construct ( name : source-targets * : property-set )
    {
        local action-name = [ $(property-set).get <action> ] ;
        # 'm' will always be set -- we add '@' ourselves in the 'make' rule
        # below.
        local m = [ MATCH ^@(.*) : $(action-name) ] ;

        local a = [ new action $(source-targets) : $(m[1]) : $(property-set) ] ;
        local t = [ new file-target $(self.name) exact : [ type.type
            $(self.name) ] : $(self.project) : $(a) ] ;
        return [ property-set.empty ] [ virtual-target.register $(t) ] ;
    }
}


# Declares the 'make' main target.
#
rule make ( target-name : sources * : generating-rule + : requirements * :
    usage-requirements * )
{
    local project = [ project.current ] ;

    # The '@' sign causes the feature.jam module to qualify rule name with the
    # module name of current project, if needed.
    local m = [ MATCH ^(@).* : $(generating-rule) ] ;
    if ! $(m)
    {
        generating-rule = @$(generating-rule) ;
    }
    requirements += <action>$(generating-rule) ;

    targets.main-target-alternative
        [ new make-target-class $(target-name) : $(project)
            : [ targets.main-target-sources $(sources) : $(target-name) ]
            : [ targets.main-target-requirements $(requirements) : $(project) ]
            : [ targets.main-target-default-build : $(project) ]
            : [ targets.main-target-usage-requirements $(usage-requirements) :
                $(project) ] ] ;
}


IMPORT $(__name__) : make : : make ;
