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