ctdb-scripts: Support storing statd-callout state in cluster filesystem
[samba4-gss.git] / third_party / waf / waflib / Tools / d.py
blobe4cf73bb4af039c7f7ce48abdd206e0a97a1a72f
1 #!/usr/bin/env python
2 # encoding: utf-8
3 # Carlos Rafael Giani, 2007 (dv)
4 # Thomas Nagy, 2007-2018 (ita)
6 from waflib import Utils, Task, Errors
7 from waflib.TaskGen import taskgen_method, feature, extension
8 from waflib.Tools import d_scan, d_config
9 from waflib.Tools.ccroot import link_task, stlink_task
11 class d(Task.Task):
12 "Compile a d file into an object file"
13 color = 'GREEN'
14 run_str = '${D} ${DFLAGS} ${DINC_ST:INCPATHS} ${D_SRC_F:SRC} ${D_TGT_F:TGT}'
15 scan = d_scan.scan
17 class d_with_header(d):
18 "Compile a d file and generate a header"
19 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()}'
21 class d_header(Task.Task):
22 "Compile d headers"
23 color = 'BLUE'
24 run_str = '${D} ${D_HEADER} ${SRC}'
26 class dprogram(link_task):
27 "Link object files into a d program"
28 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}'
29 inst_to = '${BINDIR}'
31 class dshlib(dprogram):
32 "Link object files into a d shared library"
33 inst_to = '${LIBDIR}'
35 class dstlib(stlink_task):
36 "Link object files into a d static library"
37 pass # do not remove
39 @extension('.d', '.di', '.D')
40 def d_hook(self, node):
41 """
42 Compile *D* files. To get .di files as well as .o files, set the following::
44 def build(bld):
45 bld.program(source='foo.d', target='app', generate_headers=True)
47 """
48 ext = Utils.destos_to_binfmt(self.env.DEST_OS) == 'pe' and 'obj' or 'o'
49 out = '%s.%d.%s' % (node.name, self.idx, ext)
50 def create_compiled_task(self, name, node):
51 task = self.create_task(name, node, node.parent.find_or_declare(out))
52 try:
53 self.compiled_tasks.append(task)
54 except AttributeError:
55 self.compiled_tasks = [task]
56 return task
58 if getattr(self, 'generate_headers', None):
59 tsk = create_compiled_task(self, 'd_with_header', node)
60 tsk.outputs.append(node.change_ext(self.env.DHEADER_ext))
61 else:
62 tsk = create_compiled_task(self, 'd', node)
63 return tsk
65 @taskgen_method
66 def generate_header(self, filename):
67 """
68 See feature request #104::
70 def build(bld):
71 tg = bld.program(source='foo.d', target='app')
72 tg.generate_header('blah.d')
73 # is equivalent to:
74 #tg = bld.program(source='foo.d', target='app', header_lst='blah.d')
76 :param filename: header to create
77 :type filename: string
78 """
79 try:
80 self.header_lst.append([filename, self.install_path])
81 except AttributeError:
82 self.header_lst = [[filename, self.install_path]]
84 @feature('d')
85 def process_header(self):
86 """
87 Process the attribute 'header_lst' to create the d header compilation tasks::
89 def build(bld):
90 bld.program(source='foo.d', target='app', header_lst='blah.d')
91 """
92 for i in getattr(self, 'header_lst', []):
93 node = self.path.find_resource(i[0])
94 if not node:
95 raise Errors.WafError('file %r not found on d obj' % i[0])
96 self.create_task('d_header', node, node.change_ext('.di'))