Path: blob/master/Tools/ardupilotwaf/dronecangen.py
9843 views
# encoding: utf-812# flake8: noqa34"""5generate DSDLC headers for uavcan6"""78from waflib import Logs, Task, Utils, Node9from waflib.TaskGen import feature, before_method, extension10import os11import os.path12from xml.etree import ElementTree as et13import subprocess1415class dronecangen(Task.Task):16"""generate uavcan header files"""17color = 'BLUE'18before = 'cxx c'1920def run(self):21python = self.env.get_flat('PYTHON')22out = self.env.get_flat('OUTPUT_DIR')23src = self.env.get_flat('SRC')24dsdlc = self.env.get_flat("DC_DSDL_COMPILER_DIR")2526cmd = ['{}'.format(python),27'{}/dronecan_dsdlc.py'.format(dsdlc),28'-O{}'.format(out)] + [x.abspath() for x in self.inputs]29ret = self.exec_command(cmd)30if ret != 0:31# ignore if there was a signal to the interpreter rather32# than a real error in the script. Some environments use a33# signed and some an unsigned return for this34if ret > 128 or ret < 0:35Logs.warn('dronecangen crashed with code: {}'.format(ret))36ret = 037else:38Logs.warn('dronecangen: cmd=%s ' % str(cmd))39# re-run command with stdout visible to see errors40subprocess.call(cmd)41Logs.error('dronecangen returned {} error code'.format(ret))42return ret4344def post_run(self):45super(dronecangen, self).post_run()46for header in self.generator.output_dir.ant_glob("*.h **/*.h", remove=False):47header.sig = header.cache_sig = self.cache_sig4849def options(opt):50opt.load('python')5152@feature('dronecangen')53@before_method('process_rule')54def process_dronecangen(self):55if not hasattr(self, 'output_dir'):56self.bld.fatal('dronecangen: missing option output_dir')5758inputs = self.to_nodes(self.source)59# depend on each message file in the source so rebuilds will occur properly60deps = []61for inp in inputs:62deps.extend(inp.ant_glob("**/*.uavcan"))63# also depend on the generator source itself64dsdlc_dir = self.env.get_flat("DC_DSDL_COMPILER_DIR")65dsdlc = self.bld.root.find_node(dsdlc_dir) # expected to be absolute66if dsdlc is None:67self.bld.fatal("dronecangen: waf couldn't find dsdlc at abspath {}".format(dsdlc_dir))68deps.extend(dsdlc.ant_glob("**/*.py **/*.em"))69outputs = []7071self.source = []7273if not isinstance(self.output_dir, Node.Node):74self.output_dir = self.bld.bldnode.find_or_declare(self.output_dir)7576task = self.create_task('dronecangen', inputs, outputs)77task.dep_nodes = deps78task.env['OUTPUT_DIR'] = self.output_dir.abspath()7980task.env.env = dict(os.environ)8182def configure(cfg):83"""84setup environment for uavcan header generator85"""86env = cfg.env87env.DC_DSDL_COMPILER_DIR = cfg.srcnode.make_node('modules/DroneCAN/dronecan_dsdlc/').abspath()88cfg.msg('DC_DSDL compiler in', env.DC_DSDL_COMPILER_DIR)899091