1#!/usr/bin/python
2# Grygoriy Fuchedzhy 2010
3
4"""
5Support for converting linked targets to ihex, srec or binary files using
6objcopy. Use the 'objcopy' feature in conjunction with the 'cc' or 'cxx'
7feature. The 'objcopy' feature uses the following attributes:
8
9objcopy_bfdname		Target object format name (eg. ihex, srec, binary).
10					   Defaults to ihex.
11objcopy_target		 File name used for objcopy output. This defaults to the
12					   target name with objcopy_bfdname as extension.
13objcopy_install_path   Install path for objcopy_target file. Defaults to ${PREFIX}/fw.
14objcopy_flags		  Additional flags passed to objcopy.
15"""
16
17from waflib.Utils import def_attrs
18from waflib import Task, Options
19from waflib.TaskGen import feature, after_method
20
21class objcopy(Task.Task):
22	run_str = '${OBJCOPY} -O ${TARGET_BFDNAME} ${OBJCOPYFLAGS} ${SRC} ${TGT}'
23	color   = 'CYAN'
24
25@feature('objcopy')
26@after_method('apply_link')
27def map_objcopy(self):
28	def_attrs(self,
29	   objcopy_bfdname = 'ihex',
30	   objcopy_target = None,
31	   objcopy_install_path = "${PREFIX}/firmware",
32	   objcopy_flags = '')
33
34	link_output = self.link_task.outputs[0]
35	if not self.objcopy_target:
36		self.objcopy_target = link_output.change_ext('.' + self.objcopy_bfdname).name
37	task = self.create_task('objcopy', src=link_output, tgt=self.path.find_or_declare(self.objcopy_target))
38
39	task.env.append_unique('TARGET_BFDNAME', self.objcopy_bfdname)
40	try:
41		task.env.append_unique('OBJCOPYFLAGS', getattr(self, 'objcopy_flags'))
42	except AttributeError:
43		pass
44
45	if self.objcopy_install_path:
46		self.add_install_files(install_to=self.objcopy_install_path, install_from=task.outputs[0])
47
48def configure(ctx):
49	program_name = 'objcopy'
50	prefix = getattr(Options.options, 'cross_prefix', None)
51	if prefix:
52		program_name = '{}-{}'.format(prefix, program_name)
53	ctx.find_program(program_name, var='OBJCOPY', mandatory=True)
54