diff --git a/src/build/generators.py b/src/build/generators.py index e1babe040..7c8264538 100644 --- a/src/build/generators.py +++ b/src/build/generators.py @@ -400,6 +400,9 @@ class Generator: dir = os.path.dirname(fullname) name = os.path.basename(fullname) + idx = name.find(".") + if idx != -1: + name = name[:idx] if dir and not ".." in dir and not os.path.isabs(dir): # Relative path is always relative to the source @@ -470,9 +473,6 @@ class Generator: post = self.name_postfix_ for t in self.target_types_: basename = os.path.basename(name) - idx = basename.find(".") - if idx != -1: - basename = basename[:idx] generated_name = pre[0] + basename + post[0] generated_name = os.path.join(os.path.dirname(name), generated_name) pre = pre[1:] @@ -1080,4 +1080,18 @@ def construct (project, name, target_type, prop_set, sources, top_level=False): __active_generators = saved_active return result - + +def add_usage_requirements (result, raw_properties): + if result: + if isinstance (result[0], property_set.PropertySet): + return (result[0].add_raw(raw_properties), result[1]) + else: + return (propery_set.create(raw-properties), result) + #if [ class.is-a $(result[1]) : property-set ] + #{ + # return [ $(result[1]).add-raw $(raw-properties) ] $(result[2-]) ; + #} + #else + #{ + # return [ property-set.create $(raw-properties) ] $(result) ; + #} diff --git a/src/build/targets.py b/src/build/targets.py index a35612cea..b8546809a 100644 --- a/src/build/targets.py +++ b/src/build/targets.py @@ -1290,7 +1290,8 @@ class TypedTarget (BasicTarget): def construct (self, name, source_targets, prop_set): - r = generators.construct (self.project_, name, self.type_, + r = generators.construct (self.project_, os.path.splitext(name)[0], + self.type_, prop_set.add_raw(['' + self.type_]), source_targets, True) diff --git a/src/tools/builtin.py b/src/tools/builtin.py index eba1b8c91..72a344a86 100644 --- a/src/tools/builtin.py +++ b/src/tools/builtin.py @@ -715,6 +715,14 @@ class ArchiveGenerator (generators.Generator): ### ### +class DummyGenerator(generators.Generator): + """Generator that accepts everything and produces nothing. Useful as a general + fallback for toolset-specific actions like PCH generation. + """ + def run (self, project, name, prop_set, sources): + return (property_set.empty(), []) + + get_manager().projects().add_rule("variant", variant) import stage diff --git a/src/tools/gcc.py b/src/tools/gcc.py index 2a3e675ef..b0aba1d29 100644 --- a/src/tools/gcc.py +++ b/src/tools/gcc.py @@ -23,13 +23,16 @@ import re import bjam from b2.tools import unix, common, rc, pch, builtin -from b2.build import feature, type, toolset, generators +from b2.build import feature, type, toolset, generators, property_set +from b2.build.property import Property from b2.util.utility import os_name, on_windows from b2.manager import get_manager from b2.build.generators import Generator from b2.build.toolset import flags from b2.util.utility import to_seq + + __debug = None def debug(): @@ -222,12 +225,12 @@ class GccPchGenerator(pch.PchGenerator): # Find the header in sources. Ignore any CPP sources. header = None for s in sources: - if type.is_derived(s.type, 'H'): + if type.is_derived(s.type(), 'H'): header = s # Error handling: Base header file name should be the same as the base # precompiled header name. - header_name = header.name + header_name = header.name() header_basename = os.path.basename(header_name).rsplit('.', 1)[0] if header_basename != name: location = project.project_module @@ -239,14 +242,15 @@ class GccPchGenerator(pch.PchGenerator): # return result of base class and pch-file property as usage-requirements # FIXME: what about multiple results from generator.run? - return (property_set.create('' + pch_file[0], '-Winvalid-pch'), + return (property_set.create([Property('pch-file', pch_file[0]), + Property('cflags', '-Winvalid-pch')]), pch_file) # Calls the base version specifying source's name as the name of the created # target. As result, the PCH will be named whatever.hpp.gch, and not # whatever.gch. def generated_targets(self, sources, prop_set, project, name = None): - name = sources[0].name + name = sources[0].name() return Generator.generated_targets(self, sources, prop_set, project, name) diff --git a/src/tools/pch.py b/src/tools/pch.py index 21d3db09d..71cb7166e 100644 --- a/src/tools/pch.py +++ b/src/tools/pch.py @@ -29,6 +29,7 @@ # ; from b2.build import type, feature, generators +from b2.tools import builtin type.register('PCH', ['pch']) type.register('C_PCH', [], 'PCH') @@ -48,7 +49,7 @@ class PchGenerator(generators.Generator): from being run unless it's being used for a top-level PCH target. """ def action_class(self): - return 'compile-action' + return builtin.CompileAction def run(self, project, name, prop_set, sources): if not name: @@ -65,7 +66,7 @@ class PchGenerator(generators.Generator): pass else: r = self.run_pch(project, name, - prop_set.add_raw('BOOST_BUILD_PCH_ENABLED'), + prop_set.add_raw(['BOOST_BUILD_PCH_ENABLED']), sources) return generators.add_usage_requirements( r, ['BOOST_BUILD_PCH_ENABLED']) @@ -74,10 +75,9 @@ class PchGenerator(generators.Generator): def run_pch(self, project, name, prop_set, sources): pass -#FIXME: dummy-generator in builtins.jam needs to be ported. # NOTE: requirements are empty, default pch generator can be applied when # pch=off. -###generators.register( -### [ new dummy-generator pch.default-c-pch-generator : : C_PCH ] ; -###generators.register -### [ new dummy-generator pch.default-cpp-pch-generator : : CPP_PCH ] ; +generators.register(builtin.DummyGenerator( + "pch.default-c-pch-generator", False, [], ['C_PCH'], [])) +generators.register(builtin.DummyGenerator( + "pch.default-cpp-pch-generator", False, [], ['CPP_PCH'], []))