Imported Upstream version 1.57.0
[platform/upstream/boost.git] / tools / build / src / manager.py
1 # Copyright Pedro Ferreira 2005. Distributed under the Boost
2 # Software License, Version 1.0. (See accompanying
3 # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
5 import bjam
6
7 # To simplify implementation of tools level, we'll
8 # have a global variable keeping the current manager.
9 the_manager = None
10 def get_manager():
11     return the_manager
12
13 class Manager:
14     """ This class is a facade to the Boost.Build system.
15         It serves as the root to access all data structures in use.
16     """
17         
18     def __init__ (self, engine, global_build_dir):
19         """ Constructor.
20             engine: the build engine that will actually construct the targets.
21         """
22         from build.virtual_target import VirtualTargetRegistry
23         from build.targets import TargetRegistry
24         from build.project import ProjectRegistry
25         from build.scanner import ScannerRegistry
26         from build.errors import Errors
27         from b2.util.logger import NullLogger
28         from build import build_request, property_set, feature
29         
30         self.engine_ = engine
31         self.virtual_targets_ = VirtualTargetRegistry (self)
32         self.projects_ = ProjectRegistry (self, global_build_dir)
33         self.targets_ = TargetRegistry ()
34         self.logger_ = NullLogger ()
35         self.scanners_ = ScannerRegistry (self)
36         self.argv_ = bjam.variable("ARGV")
37         self.boost_build_path_ = bjam.variable("BOOST_BUILD_PATH")
38         self.errors_ = Errors()
39         self.command_line_free_features_ = property_set.empty()
40         
41         global the_manager
42         the_manager = self
43         
44     def scanners (self):
45         return self.scanners_
46
47     def engine (self):
48         return self.engine_
49         
50     def virtual_targets (self):
51         return self.virtual_targets_
52
53     def targets (self):
54         return self.targets_
55
56     def projects (self):
57         return self.projects_
58
59     def argv (self):
60         return self.argv_
61     
62     def logger (self):
63         return self.logger_
64
65     def set_logger (self, logger):
66         self.logger_ = logger
67
68     def errors (self):
69         return self.errors_
70
71     def getenv(self, name):
72         return bjam.variable(name)
73
74     def boost_build_path(self):
75         return self.boost_build_path_
76
77     def command_line_free_features(self):
78         return self.command_line_free_features_
79
80     def set_command_line_free_features(self, v):
81         self.command_line_free_features_ = v
82
83     def construct (self, properties = [], targets = []):
84         """ Constructs the dependency graph.
85             properties:  the build properties.
86             targets:     the targets to consider. If none is specified, uses all.
87         """
88         if not targets:
89             for name, project in self.projects ().projects ():
90                 targets.append (project.target ())
91             
92         property_groups = build_request.expand_no_defaults (properties)
93
94         virtual_targets = []
95         build_prop_sets = []
96         for p in property_groups:
97             build_prop_sets.append (property_set.create (feature.split (p)))
98
99         if not build_prop_sets:
100             build_prop_sets = [property_set.empty ()]
101
102         for build_properties in build_prop_sets:
103             for target in targets:
104                 result = target.generate (build_properties)
105                 virtual_targets.extend (result.targets ())
106
107         actual_targets = []
108         for virtual_target in virtual_targets:
109             actual_targets.extend (virtual_target.actualize ())
110