waf

FORK: waf with some random patches
git clone https://git.neptards.moe/neptards/waf.git
Log | Files | Refs | README

d.py (3014B)


      1 #!/usr/bin/env python
      2 # encoding: utf-8
      3 # Carlos Rafael Giani, 2007 (dv)
      4 # Thomas Nagy, 2007-2018 (ita)
      5 
      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
     10 
     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
     16 
     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()}'
     20 
     21 class d_header(Task.Task):
     22 	"Compile d headers"
     23 	color   = 'BLUE'
     24 	run_str = '${D} ${D_HEADER} ${SRC}'
     25 
     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}'
     30 
     31 class dshlib(dprogram):
     32 	"Link object files into a d shared library"
     33 	inst_to = '${LIBDIR}'
     34 
     35 class dstlib(stlink_task):
     36 	"Link object files into a d static library"
     37 	pass # do not remove
     38 
     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::
     43 
     44 		def build(bld):
     45 			bld.program(source='foo.d', target='app', generate_headers=True)
     46 
     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
     57 
     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
     64 
     65 @taskgen_method
     66 def generate_header(self, filename):
     67 	"""
     68 	See feature request #104::
     69 
     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')
     75 
     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]]
     83 
     84 @feature('d')
     85 def process_header(self):
     86 	"""
     87 	Process the attribute 'header_lst' to create the d header compilation tasks::
     88 
     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'))
     97