939c2c1291be9e92f891e2e819b5adcd1f7e7c4f
[bbaumbach/samba.git] / third_party / waf / waflib / extras / objcopy.py
1 #!/usr/bin/python
2 # Grygoriy Fuchedzhy 2010
3
4 """
5 Support for converting linked targets to ihex, srec or binary files using
6 objcopy. Use the 'objcopy' feature in conjuction with the 'cc' or 'cxx'
7 feature. The 'objcopy' feature uses the following attributes:
8
9 objcopy_bfdname         Target object format name (eg. ihex, srec, binary).
10                                            Defaults to ihex.
11 objcopy_target           File name used for objcopy output. This defaults to the
12                                            target name with objcopy_bfdname as extension.
13 objcopy_install_path   Install path for objcopy_target file. Defaults to ${PREFIX}/fw.
14 objcopy_flags             Additional flags passed to objcopy.
15 """
16
17 from waflib.Utils import def_attrs
18 from waflib import Task
19 from waflib.TaskGen import feature, after_method
20
21 class 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')
27 def 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.bld.install_files(self.objcopy_install_path,
47                                                            task.outputs[0],
48                                                            env=task.env.derive())
49
50 def configure(ctx):
51         ctx.find_program('objcopy', var='OBJCOPY', mandatory=True)