2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-02 08:42:13 +00:00

Say goodbye to the composing-generator class.

* new/generators.jam
    (generator): New argument 'composing'
    (run): Use 'self.composing'.
    (convert-multiple-sources-to-consumable-types): Moved from
       composing-generator.
    (composing-generator): Remove

* new/builtin.jam
    (linking-generator, register-linker): Use the argument to generator's
       ctor. Allow to make generator non-composing.

* new/msvc.jam: Make msvc.link generator non-composing.


[SVN r17572]
This commit is contained in:
Vladimir Prus
2003-02-21 08:29:34 +00:00
parent 9b3fd4f503
commit 05fcdfc33a
4 changed files with 86 additions and 101 deletions

View File

@@ -95,10 +95,12 @@ rule init ( version ? path ? : vendor ? : setup ? compiler ? linker ? )
# Declare generators
# is it possible to combine these?
generators.register-linker msvc.link : RSP : EXE : <toolset>msvc ;
generators.register-linker msvc.link : RSP : SHARED_LIB IMPORT_LIB : <toolset>msvc ;
# make the generators non-composing, so that they don't convert each source
# into separate rsp file.
generators.register-linker msvc.link "" : RSP : EXE : <toolset>msvc ;
generators.register-linker msvc.link "" : RSP : SHARED_LIB IMPORT_LIB : <toolset>msvc ;
generators.register-composing msvc.archive : RSP : STATIC_LIB : <toolset>msvc ;
generators.register-standard msvc.archive : RSP : STATIC_LIB : <toolset>msvc ;
generators.register-c-compiler msvc.compile : CPP : OBJ : <toolset>msvc ;
generators.register-c-compiler msvc.compile : C : OBJ : <toolset>msvc ;

View File

@@ -87,7 +87,11 @@ rule normalize-target-list ( targets )
# Creates a generator
rule generator (
id # identifies the generator - should be name of the rule which
# sets up build actions
# sets up build actions
composing ? # whether generator processes each source target in
# turn, converting it to required types.
# Ordinary generators pass all sources together to
# recusrive generators.construct-types call.
: source-types * # types that this generator can handle
@@ -111,6 +115,7 @@ rule generator (
import errors : error ;
self.id = $(id) ;
self.composing = $(composing) ;
self.source-types = $(source-types) ;
self.target-types-and-names = $(target-types-and-names) ;
self.requirements = $(requirements) ;
@@ -232,13 +237,13 @@ rule generator (
{
generators.dout [ indent ] " generator" $(self.id) ;
generators.dout [ indent ] " multiple:" $(mutliple) ;
# Ordinary generators take only one source targets
if $(sources[2])
generators.dout [ indent ] " composing:" $(self.composing) ;
if ! $(self.composing) && $(sources[2]) && $(self.source-types[2])
{
error "unsupported" ;
errors.error "Unsupported source/source-type combination" ;
}
if $(self.source-types[2])
{
multiple = ;
@@ -249,20 +254,25 @@ rule generator (
# Targets that can't be consumed and will be returned as-is.
local bypassed = ;
convert-to-consumable-types $(project) $(name) :
$(property-set) : $(sources) : $(multiple)
:
: consumed bypassed ;
if $(self.composing)
{
convert-multiple-sources-to-consumable-types $(project)
: $(property-set) : $(sources) : consumed bypassed ;
}
else
{
convert-to-consumable-types $(project) $(name) :
$(property-set) : $(sources) : $(multiple)
:
: consumed bypassed ;
}
local result ;
if $(consumed)
{
result = [ construct-result $(consumed) : $(project) $(name)
: $(property-set) ] ;
if $(result)
{
result += $(bypassed) ;
}
result += $(bypassed) ;
}
@@ -293,7 +303,7 @@ rule generator (
{
local result ;
# If this is 1->1 transformation, apply it to all consumed targets in order.
if ! $(self.source-types[2])
if ! $(self.source-types[2]) && ! $(self.composing)
{
generators.dout [ indent ] "alt1" ;
for local r in $(consumed)
@@ -384,7 +394,7 @@ rule generator (
# handle. The intention is to produce the set of targets can should be
# used when generator is run.
rule convert-to-consumable-types ( project name ? :
property-set : source : multiple ?
property-set : sources + : multiple ?
: only-one ? # convert 'source' to only one of source types
# if there's more that one possibility, report an
# error
@@ -399,9 +409,18 @@ rule generator (
local _consumed ;
local _bypassed ;
local missing-types ;
consume-directly $(source) : _consumed : missing-types ;
if $(sources[2])
{
# Don't know how to handle several sources yet. Just try
# to pass the request to other generator
missing-types = $(self.source-types) ;
}
else
{
consume-directly $(sources) : _consumed : missing-types ;
}
# No need to search for transformation if
# some source type has consumed source and
# no more source types are needed.
@@ -418,7 +437,7 @@ rule generator (
if $(missing-types)
{
local transformed = [ generators.construct-types $(project) $(name)
: $(missing-types) : $(multiple) : $(property-set) : $(source) ] ;
: $(missing-types) : $(multiple) : $(property-set) : $(sources) ] ;
# Add targets of right type to 'consumed'. Add others to
# 'bypassed'. The 'generators.construct' rule has done
@@ -463,50 +482,6 @@ rule generator (
$(bypassed-var) += $(_bypassed) ;
}
rule consume-directly ( source : consumed-var : missing-types-var )
{
local real-source-type = [ $(source).type ] ;
for local st in $(self.source-types)
{
# The 'source' if of right type already)
if $(real-source-type) = $(st) ||
[ type.is-derived $(real-source-type) $(st) ]
{
$(consumed-var) += $(source) ;
}
else
{
$(missing-types-var) += $(st) ;
}
}
}
# Returns the class to be used to actions. Default implementation
# returns "action".
rule action-class ( )
{
return "action" ;
}
}
class generator ;
# Generator which is able to produce desired target types from arbitrary number
# of sources, provided they all are of supported times. This is different from
# ordinary generator, which does maps N sources to M targets, where both N and M
# are fixed. For example, compiler takes cpp files and produces object. Linker
# can take any number of objects, and produces one exe.
#
# The generator works by attempting to convert each source into one of the
# allowed target types, and then consuming the result of convertion.
rule composing-generator ( id : source-types * : target-types + :
requirements * )
{
generator.__init__ $(id) : $(source-types) : $(target-types) :
$(requirements) ;
# Converts several files to consumable types.
rule convert-multiple-sources-to-consumable-types
( project : property-set : sources * : consumed-var bypassed-var )
@@ -536,34 +511,36 @@ rule composing-generator ( id : source-types * : target-types + :
$(bypassed-var) = ;
}
}
rule run ( project name ? : property-set : sources + : multiple ? )
{
generators.dout [ indent ] " composing generator" $(self.id) ;
local consumed ;
local bypassed ;
convert-multiple-sources-to-consumable-types $(project)
: $(property-set) : $(sources) : consumed bypassed ;
rule consume-directly ( source : consumed-var : missing-types-var )
{
local real-source-type = [ $(source).type ] ;
local result ;
if $(consumed)
for local st in $(self.source-types)
{
generators.dout [ indent ] " SUCCESS" ;
result += [ generated-targets $(consumed) : $(property-set)
: $(project) $(name) ] ;
result += $(bypassed) ;
}
else
{
generators.dout [ indent ] " FAILURE" ;
}
return $(result) ;
# The 'source' if of right type already)
if $(real-source-type) = $(st) ||
[ type.is-derived $(real-source-type) $(st) ]
{
$(consumed-var) += $(source) ;
}
else
{
$(missing-types-var) += $(st) ;
}
}
}
# Returns the class to be used to actions. Default implementation
# returns "action".
rule action-class ( )
{
return "action" ;
}
}
class composing-generator : generator ;
class generator ;
import errors : error ;
@@ -596,7 +573,7 @@ rule register-standard ( id : source-types + : target-types + : requirements * )
# registers it.
rule register-composing ( id : source-types + : target-types + : requirements * )
{
local g = [ new composing-generator $(id) : $(source-types)
local g = [ new generator $(id) true : $(source-types)
: $(target-types) : $(requirements) ] ;
register $(g) ;
}
@@ -695,14 +672,14 @@ rule try-one-generator ( project name ? : generator multiple ? :
}
rule construct-types ( project name ? : target-types + : multiple ? :
property-set : source )
property-set : sources + )
{
local result ;
local matched-types ;
for local t in $(target-types)
{
local r = [ construct $(project) $(name) : $(t) $(multiple) : $(property-set) :
$(source) ] ;
$(sources) ] ;
if $(r)
{
result += $(r) ;
@@ -723,7 +700,7 @@ rule construct-types ( project name ? : target-types + : multiple ? :
}
else
{
return $(source) ;
return $(sources) ;
}
}

View File

@@ -416,7 +416,11 @@ rule generate-dependencies ( property-set : project : generation-ps )
{
errors.error "cannot generate dependency " $(p) ;
}
xproperties += $(p:G)$(g) [ $(g).usage-requirements ] ;
xproperties += $(p:G)$(g) ;
for local gi in $(g)
{
xproperties += [ $(gi).usage-requirements ] ;
}
}
local r = [ property-set.create
[ $(property-set).base ]

View File

@@ -347,7 +347,7 @@ type.register C : c ;
# "shared" feature.
rule lib-generator ( )
{
composing-generator.__init__ lib-generator : : LIB : <main-target-type>LIB ;
generator.__init__ lib-generator true : : LIB : <main-target-type>LIB ;
rule run ( project name ? : property-set : sources * )
{
@@ -372,7 +372,7 @@ rule lib-generator ( )
}
}
class lib-generator : composing-generator ;
class lib-generator : generator ;
generators.register [ new lib-generator ] ;
@@ -567,10 +567,12 @@ rule link-action ( targets + : sources * : action-name : properties * )
class link-action : action ;
rule linking-generator ( id : source-types + : target-types + :
rule linking-generator ( id composing ? : source-types + : target-types + :
requirements * )
{
composing-generator.__init__ $(id) : $(source-types) : $(target-types) :
# If composing is not specified, set it to true, which is "false" in Jam.
composing ?= true ;
generator.__init__ $(id) $(composing) : $(source-types) : $(target-types) :
$(requirements) ;
rule action-class ( )
@@ -579,13 +581,13 @@ rule linking-generator ( id : source-types + : target-types + :
}
}
class linking-generator : composing-generator ;
class linking-generator : generator ;
rule register-linker ( id : source-types + : target-types + :
rule register-linker ( id composing ? : source-types + : target-types + :
requirements * )
{
local g = [ new linking-generator $(id) : $(source-types)
local g = [ new linking-generator $(id) $(composing) : $(source-types)
: $(target-types) : $(requirements) ] ;
generators.register $(g) ;
}