diff options
Diffstat (limited to 'tools/build/v2/manager.py')
-rw-r--r-- | tools/build/v2/manager.py | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/tools/build/v2/manager.py b/tools/build/v2/manager.py new file mode 100644 index 0000000000..473857fc76 --- /dev/null +++ b/tools/build/v2/manager.py @@ -0,0 +1,110 @@ +# Copyright Pedro Ferreira 2005. Distributed under the Boost +# Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +import bjam + +# To simplify implementation of tools level, we'll +# have a global variable keeping the current manager. +the_manager = None +def get_manager(): + return the_manager + +class Manager: + """ This class is a facade to the Boost.Build system. + It serves as the root to access all data structures in use. + """ + + def __init__ (self, engine, global_build_dir): + """ Constructor. + engine: the build engine that will actually construct the targets. + """ + from build.virtual_target import VirtualTargetRegistry + from build.targets import TargetRegistry + from build.project import ProjectRegistry + from build.scanner import ScannerRegistry + from build.errors import Errors + from b2.util.logger import NullLogger + from build import build_request, property_set, feature + + self.engine_ = engine + self.virtual_targets_ = VirtualTargetRegistry (self) + self.projects_ = ProjectRegistry (self, global_build_dir) + self.targets_ = TargetRegistry () + self.logger_ = NullLogger () + self.scanners_ = ScannerRegistry (self) + self.argv_ = bjam.variable("ARGV") + self.boost_build_path_ = bjam.variable("BOOST_BUILD_PATH") + self.errors_ = Errors() + self.command_line_free_features_ = property_set.empty() + + global the_manager + the_manager = self + + def scanners (self): + return self.scanners_ + + def engine (self): + return self.engine_ + + def virtual_targets (self): + return self.virtual_targets_ + + def targets (self): + return self.targets_ + + def projects (self): + return self.projects_ + + def argv (self): + return self.argv_ + + def logger (self): + return self.logger_ + + def set_logger (self, logger): + self.logger_ = logger + + def errors (self): + return self.errors_ + + def getenv(self, name): + return bjam.variable(name) + + def boost_build_path(self): + return self.boost_build_path_ + + def command_line_free_features(self): + return self.command_line_free_features_ + + def set_command_line_free_features(self, v): + self.command_line_free_features_ = v + + def construct (self, properties = [], targets = []): + """ Constructs the dependency graph. + properties: the build properties. + targets: the targets to consider. If none is specified, uses all. + """ + if not targets: + for name, project in self.projects ().projects (): + targets.append (project.target ()) + + property_groups = build_request.expand_no_defaults (properties) + + virtual_targets = [] + build_prop_sets = [] + for p in property_groups: + build_prop_sets.append (property_set.create (feature.split (p))) + + if not build_prop_sets: + build_prop_sets = [property_set.empty ()] + + for build_properties in build_prop_sets: + for target in targets: + result = target.generate (build_properties) + virtual_targets.extend (result.targets ()) + + actual_targets = [] + for virtual_target in virtual_targets: + actual_targets.extend (virtual_target.actualize ()) + |