c493b820d1dd3871ac73f42a9df08918f54a9d90
[amitay/samba.git] / third_party / waf / waflib / Tools / d.py
1 #! /usr/bin/env python
2 # encoding: utf-8
3 # WARNING! Do not edit! https://waf.io/book/index.html#_obtaining_the_waf_file
4
5 #!/usr/bin/env python
6 # encoding: utf-8
7 # Carlos Rafael Giani, 2007 (dv)
8 # Thomas Nagy, 2007-2016 (ita)
9
10 from waflib import Utils, Task, Errors
11 from waflib.TaskGen import taskgen_method, feature, extension
12 from waflib.Tools import d_scan, d_config
13 from waflib.Tools.ccroot import link_task, stlink_task
14
15 class d(Task.Task):
16         "Compile a d file into an object file"
17         color   = 'GREEN'
18         run_str = '${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_SRC_F:SRC} ${D_TGT_F:TGT}'
19         scan    = d_scan.scan
20
21 class d_with_header(d):
22         "Compile a d file and generate a header"
23         run_str = '${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_HDR_F:tgt.outputs[1].bldpath()} ${D_SRC_F:SRC} ${D_TGT_F:tgt.outputs[0].bldpath()}'
24
25 class d_header(Task.Task):
26         "Compile d headers"
27         color   = 'BLUE'
28         run_str = '${D} ${D_HEADER} ${SRC}'
29
30 class dprogram(link_task):
31         "Link object files into a d program"
32         run_str = '${D_LINKER} ${LINKFLAGS} ${DLNK_SRC_F}${SRC} ${DLNK_TGT_F:TGT} ${RPATH_ST:RPATH} ${DSTLIB_MARKER} ${DSTLIBPATH_ST:STLIBPATH} ${DSTLIB_ST:STLIB} ${DSHLIB_MARKER} ${DLIBPATH_ST:LIBPATH} ${DSHLIB_ST:LIB}'
33         inst_to = '${BINDIR}'
34
35 class dshlib(dprogram):
36         "Link object files into a d shared library"
37         inst_to = '${LIBDIR}'
38
39 class dstlib(stlink_task):
40         "Link object files into a d static library"
41         pass # do not remove
42
43 @extension('.d', '.di', '.D')
44 def d_hook(self, node):
45         """
46         Compile *D* files. To get .di files as well as .o files, set the following::
47
48                 def build(bld):
49                         bld.program(source='foo.d', target='app', generate_headers=True)
50
51         """
52         ext = Utils.destos_to_binfmt(self.env.DEST_OS) == 'pe' and 'obj' or 'o'
53         out = '%s.%d.%s' % (node.name, self.idx, ext)
54         def create_compiled_task(self, name, node):
55                 task = self.create_task(name, node, node.parent.find_or_declare(out))
56                 try:
57                         self.compiled_tasks.append(task)
58                 except AttributeError:
59                         self.compiled_tasks = [task]
60                 return task
61
62         if getattr(self, 'generate_headers', None):
63                 tsk = create_compiled_task(self, 'd_with_header', node)
64                 tsk.outputs.append(node.change_ext(self.env.DHEADER_ext))
65         else:
66                 tsk = create_compiled_task(self, 'd', node)
67         return tsk
68
69 @taskgen_method
70 def generate_header(self, filename):
71         """
72         See feature request #104::
73
74                 def build(bld):
75                         tg = bld.program(source='foo.d', target='app')
76                         tg.generate_header('blah.d')
77                         # is equivalent to:
78                         #tg = bld.program(source='foo.d', target='app', header_lst='blah.d')
79
80         :param filename: header to create
81         :type filename: string
82         """
83         try:
84                 self.header_lst.append([filename, self.install_path])
85         except AttributeError:
86                 self.header_lst = [[filename, self.install_path]]
87
88 @feature('d')
89 def process_header(self):
90         """
91         Process the attribute 'header_lst' to create the d header compilation tasks::
92
93                 def build(bld):
94                         bld.program(source='foo.d', target='app', header_lst='blah.d')
95         """
96         for i in getattr(self, 'header_lst', []):
97                 node = self.path.find_resource(i[0])
98                 if not node:
99                         raise Errors.WafError('file %r not found on d obj' % i[0])
100                 self.create_task('d_header', node, node.change_ext('.di'))