2436e9b769b84c605857cc6be704440fa79683b9
[bbaumbach/samba-autobuild/.git] / buildtools / wafsamba / samba_optimisation.py
1 # This file contains waf optimisations for Samba
2
3 # most of these optimisations are possible because of the restricted build environment
4 # that Samba has. For example, Samba doesn't attempt to cope with Win32 paths during the
5 # build, and Samba doesn't need build varients
6
7 # overall this makes some build tasks quite a bit faster
8
9 from TaskGen import feature, after
10 import preproc, Task
11
12 @feature('cc', 'cxx')
13 @after('apply_type_vars', 'apply_lib_vars', 'apply_core')
14 def apply_incpaths(self):
15     lst = []
16
17     try:
18         kak = self.bld.kak
19     except AttributeError:
20         kak = self.bld.kak = {}
21
22     # TODO move the uselib processing out of here
23     for lib in self.to_list(self.uselib):
24         for path in self.env['CPPPATH_' + lib]:
25             if not path in lst:
26                 lst.append(path)
27     if preproc.go_absolute:
28         for path in preproc.standard_includes:
29             if not path in lst:
30                 lst.append(path)
31
32     for path in self.to_list(self.includes):
33         if not path in lst:
34             if preproc.go_absolute or path[0] != '/': #os.path.isabs(path):
35                 lst.append(path)
36             else:
37                 self.env.prepend_value('CPPPATH', path)
38
39     for path in lst:
40         node = None
41         if path[0] == '/': # os.path.isabs(path):
42             if preproc.go_absolute:
43                 node = self.bld.root.find_dir(path)
44         elif path[0] == '#':
45             node = self.bld.srcnode
46             if len(path) > 1:
47                 try:
48                     node = kak[path]
49                 except KeyError:
50                     kak[path] = node = node.find_dir(path[1:])
51         else:
52             try:
53                 node = kak[(self.path.id, path)]
54             except KeyError:
55                 kak[(self.path.id, path)] = node = self.path.find_dir(path)
56
57         if node:
58             self.env.append_value('INC_PATHS', node)
59
60 @feature('cc')
61 @after('apply_incpaths')
62 def apply_obj_vars_cc(self):
63     """after apply_incpaths for INC_PATHS"""
64     env = self.env
65     app = env.append_unique
66     cpppath_st = env['CPPPATH_ST']
67
68     lss = env['_CCINCFLAGS']
69
70     try:
71          cac = self.bld.cac
72     except AttributeError:
73          cac = self.bld.cac = {}
74
75     # local flags come first
76     # set the user-defined includes paths
77     for i in env['INC_PATHS']:
78
79         try:
80             lss.extend(cac[i.id])
81         except KeyError:
82
83             cac[i.id] = [cpppath_st % i.bldpath(env), cpppath_st % i.srcpath(env)]
84             lss.extend(cac[i.id])
85
86     env['_CCINCFLAGS'] = lss
87     # set the library include paths
88     for i in env['CPPPATH']:
89         app('_CCINCFLAGS', cpppath_st % i)
90
91 import Node, Environment
92
93 def vari(self):
94     return "default"
95 Environment.Environment.variant = vari
96
97 def variant(self, env):
98     if not env: return 0
99     elif self.id & 3 == Node.FILE: return 0
100     else: return "default"
101 Node.Node.variant = variant
102
103
104 import TaskGen, Task
105
106 def create_task(self, name, src=None, tgt=None):
107     task = Task.TaskBase.classes[name](self.env, generator=self)
108     if src:
109         task.set_inputs(src)
110     if tgt:
111         task.set_outputs(tgt)
112     return task
113 TaskGen.task_gen.create_task = create_task
114
115 def hash_constraints(self):
116     a = self.attr
117     sum = hash((str(a('before', '')),
118             str(a('after', '')),
119             str(a('ext_in', '')),
120             str(a('ext_out', '')),
121             self.__class__.maxjobs))
122     return sum
123 Task.TaskBase.hash_constraints = hash_constraints
124
125
126 # import cc
127 # from TaskGen import extension
128 # import Utils
129
130 # @extension(cc.EXT_CC)
131 # def c_hook(self, node):
132 #     task = self.create_task('cc', node, node.change_ext('.o'))
133 #     try:
134 #         self.compiled_tasks.append(task)
135 #     except AttributeError:
136 #         raise Utils.WafError('Have you forgotten to set the feature "cc" on %s?' % str(self))
137
138 #     bld = self.bld
139 #     try:
140 #         dc = bld.dc
141 #     except AttributeError:
142 #         dc = bld.dc = {}
143
144 #     if task.outputs[0].id in dc:
145 #         raise Utils.WafError('Samba, you are doing it wrong %r %s %s' % (task.outputs, task.generator, dc[task.outputs[0].id].generator))
146 #     else:
147 #         dc[task.outputs[0].id] = task
148
149 #     return task
150
151
152 def suncc_wrap(cls):
153     '''work around a problem with cc on solaris not handling module aliases
154     which have empty libs'''
155     if getattr(cls, 'solaris_wrap', False):
156         return
157     cls.solaris_wrap = True
158     oldrun = cls.run
159     def run(self):
160         if self.env.CC_NAME == "sun" and not self.inputs:
161             self.env = self.env.copy()
162             self.env.append_value('LINKFLAGS', '-')
163         return oldrun(self)
164     cls.run = run
165 suncc_wrap(Task.TaskBase.classes['cc_link'])