From d3e782c083bfb5662b9ae576a130e6be18ec5ea1 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Tue, 5 Aug 2003 06:10:57 +0000 Subject: [PATCH] Fixes to toolset inheritance. * new/generators.jam (generator.constructor): Import property so clone works. (register): Generate the correct toolset name. * new/toolset.jam Import generators so the inherit calls work. (inherit-generators): Generate the correct new generator id. Patch from Christopher Currie. [SVN r19460] --- new/generators.jam | 17 ++++++++++++++++- new/toolset.jam | 20 ++++++++++++++++++-- v2/build/generators.jam | 17 ++++++++++++++++- v2/build/toolset.jam | 20 ++++++++++++++++++-- 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/new/generators.jam b/new/generators.jam index b4ff6e0df..20dbf77ab 100644 --- a/new/generators.jam +++ b/new/generators.jam @@ -100,6 +100,7 @@ class generator import type ; import virtual-target ; import "class" : new ; + import property ; EXPORT class@generator : indent increase-indent decrease-indent generators.dout ; @@ -622,7 +623,21 @@ rule register ( g ) # Update the set of generators for toolset local id = [ $(g).id ] ; - .generators-for-toolset.$(id:S=) += $(g) ; + + # Some generators have multiple periods in their name, so the + # normal $(id:S=) won't generate the right toolset name. + # e.g. if id = gcc.compile.c++, then + # .generators-for-toolset.$(id:S=) will append to + # .generators-for-toolset.gcc.compile, which is a separate + # value from .generators-for-toolset.gcc. Correcting this + # makes generator inheritance work properly. + # See also inherit-generators in module toolset + local base = $(id) ; + while $(base:S) + { + base = $(base:B) ; + } + .generators-for-toolset.$(base) += $(g) ; } # Creates new instance of the 'generator' class and registers it. diff --git a/new/toolset.jam b/new/toolset.jam index 23f47751f..7bb4ce6c6 100644 --- a/new/toolset.jam +++ b/new/toolset.jam @@ -10,6 +10,7 @@ import numbers ; import errors : error ; import property ; import path ; +import generators ; .flag-no = 1 ; @@ -263,7 +264,22 @@ rule inherit-generators ( toolset : base ) for local g in $(base-generators) { local id = [ $(g).id ] ; - local new-id = $(id:B=$(toolset)) ; + + # Some generator names have multiple periods in their name, so + # $(id:B=$(toolset)) doesn't generate the right new-id name. + # e.g. if id = gcc.compile.c++, $(id:B=darwin) = darwin.c++, + # which is not what we want. Manually parse the base and suffix + # (if there's a better way to do this, I'd love to see it.) + # See also register in module generators. + local base = $(id) ; + local suffix = "" ; + while $(base:S) + { + suffix = $(base:S)$(suffix) ; + base = $(base:B) ; + } + local new-id = $(toolset)$(suffix) ; + generators.register [ $(g).clone $(new-id) : $(toolset) ] ; } } @@ -317,4 +333,4 @@ local rule __test__ ( ) local p = 0 1 2 3 4 ; assert.result 1/2/3 : find-property-subset 1/2/3 0/0/1 2/5 9 : $(p) ; assert.result : find-property-subset 0/0/9/9/5 9 : $(p) ; -} \ No newline at end of file +} diff --git a/v2/build/generators.jam b/v2/build/generators.jam index b4ff6e0df..20dbf77ab 100644 --- a/v2/build/generators.jam +++ b/v2/build/generators.jam @@ -100,6 +100,7 @@ class generator import type ; import virtual-target ; import "class" : new ; + import property ; EXPORT class@generator : indent increase-indent decrease-indent generators.dout ; @@ -622,7 +623,21 @@ rule register ( g ) # Update the set of generators for toolset local id = [ $(g).id ] ; - .generators-for-toolset.$(id:S=) += $(g) ; + + # Some generators have multiple periods in their name, so the + # normal $(id:S=) won't generate the right toolset name. + # e.g. if id = gcc.compile.c++, then + # .generators-for-toolset.$(id:S=) will append to + # .generators-for-toolset.gcc.compile, which is a separate + # value from .generators-for-toolset.gcc. Correcting this + # makes generator inheritance work properly. + # See also inherit-generators in module toolset + local base = $(id) ; + while $(base:S) + { + base = $(base:B) ; + } + .generators-for-toolset.$(base) += $(g) ; } # Creates new instance of the 'generator' class and registers it. diff --git a/v2/build/toolset.jam b/v2/build/toolset.jam index 23f47751f..7bb4ce6c6 100644 --- a/v2/build/toolset.jam +++ b/v2/build/toolset.jam @@ -10,6 +10,7 @@ import numbers ; import errors : error ; import property ; import path ; +import generators ; .flag-no = 1 ; @@ -263,7 +264,22 @@ rule inherit-generators ( toolset : base ) for local g in $(base-generators) { local id = [ $(g).id ] ; - local new-id = $(id:B=$(toolset)) ; + + # Some generator names have multiple periods in their name, so + # $(id:B=$(toolset)) doesn't generate the right new-id name. + # e.g. if id = gcc.compile.c++, $(id:B=darwin) = darwin.c++, + # which is not what we want. Manually parse the base and suffix + # (if there's a better way to do this, I'd love to see it.) + # See also register in module generators. + local base = $(id) ; + local suffix = "" ; + while $(base:S) + { + suffix = $(base:S)$(suffix) ; + base = $(base:B) ; + } + local new-id = $(toolset)$(suffix) ; + generators.register [ $(g).clone $(new-id) : $(toolset) ] ; } } @@ -317,4 +333,4 @@ local rule __test__ ( ) local p = 0 1 2 3 4 ; assert.result 1/2/3 : find-property-subset 1/2/3 0/0/1 2/5 9 : $(p) ; assert.result : find-property-subset 0/0/9/9/5 9 : $(p) ; -} \ No newline at end of file +}