third_party/waf: upgrade to waf 2.0.8
[samba.git] / third_party / waf / waflib / extras / boo.py
1 #! /usr/bin/env python
2 # encoding: utf-8
3 # Yannick LM 2011
4
5 """
6 Support for the boo programming language, for example::
7
8         bld(features = "boo",       # necessary feature
9                 source   = "src.boo",   # list of boo files
10                 gen      = "world.dll", # target
11                 type     = "library",   # library/exe ("-target:xyz" flag)
12                 name     = "world"      # necessary if the target is referenced by 'use'
13         )
14 """
15
16 from waflib import Task
17 from waflib.Configure import conf
18 from waflib.TaskGen import feature, after_method, before_method, extension
19
20 @extension('.boo')
21 def boo_hook(self, node):
22         # Nothing here yet ...
23         # TODO filter the non-boo source files in 'apply_booc' and remove this method
24         pass
25
26 @feature('boo')
27 @before_method('process_source')
28 def apply_booc(self):
29         """Create a booc task """
30         src_nodes = self.to_nodes(self.source)
31         out_node = self.path.find_or_declare(self.gen)
32
33         self.boo_task = self.create_task('booc', src_nodes, [out_node])
34
35         # Set variables used by the 'booc' task
36         self.boo_task.env.OUT = '-o:%s' % out_node.abspath()
37
38         # type is "exe" by default
39         type = getattr(self, "type", "exe")
40         self.boo_task.env.BOO_TARGET_TYPE = "-target:%s" % type
41
42 @feature('boo')
43 @after_method('apply_boo')
44 def use_boo(self):
45         """"
46         boo applications honor the **use** keyword::
47         """
48         dep_names = self.to_list(getattr(self, 'use', []))
49         for dep_name in dep_names:
50                 dep_task_gen = self.bld.get_tgen_by_name(dep_name)
51                 if not dep_task_gen:
52                         continue
53                 dep_task_gen.post()
54                 dep_task = getattr(dep_task_gen, 'boo_task', None)
55                 if not dep_task:
56                         # Try a cs task:
57                         dep_task = getattr(dep_task_gen, 'cs_task', None)
58                         if not dep_task:
59                                 # Try a link task:
60                                 dep_task = getattr(dep_task, 'link_task', None)
61                                 if not dep_task:
62                                         # Abort ...
63                                         continue
64                 self.boo_task.set_run_after(dep_task) # order
65                 self.boo_task.dep_nodes.extend(dep_task.outputs) # dependency
66                 self.boo_task.env.append_value('BOO_FLAGS', '-reference:%s' % dep_task.outputs[0].abspath())
67
68 class booc(Task.Task):
69         """Compiles .boo files """
70         color   = 'YELLOW'
71         run_str = '${BOOC} ${BOO_FLAGS} ${BOO_TARGET_TYPE} ${OUT} ${SRC}'
72
73 @conf
74 def check_booc(self):
75         self.find_program('booc', 'BOOC')
76         self.env.BOO_FLAGS = ['-nologo']
77
78 def configure(self):
79         """Check that booc is available """
80         self.check_booc()
81