ardupilot/Tools/ardupilotwaf/mavgen.py

102 lines
2.8 KiB
Python

# encoding: utf-8
# (c) Siddharth Bharat Purohit, 3DRobotics Inc.
"""
The **mavgen.py** program is a code generator which creates mavlink header files.
"""
from waflib import Logs, Task, Utils, Node
from waflib.TaskGen import feature, before_method, extension
import os, sys
import os.path
from xml.etree import ElementTree as et
class mavgen(Task.Task):
"""generate mavlink header files"""
color = 'BLUE'
before = 'cxx c'
def scan(self):
nodes = []
names = []
entry_point = self.inputs[0]
queue = [entry_point]
head = 0
while head < len(queue):
node = queue[head]
head += 1
tree = et.parse(node.abspath())
root = tree.getroot()
includes = root.findall('include')
for i in includes:
path = i.text.strip()
n = node.parent.find_node(path)
if n:
nodes.append(n)
if n not in queue:
queue.append(n)
continue
path = os.path.join(
node.parent.path_from(entry_point.parent),
path
)
if not path in names:
names.append(path)
return nodes, names
def run(self):
sys.path.insert(0,self.env.get_flat('MAVLINK_DIR'))
from pymavlink.generator import mavgen
class mavgen_options:
language = 'C'
wire_protocol = '2.0'
validate = False
output = self.env.get_flat('OUTPUT_DIR')
xml = self.inputs[0].abspath()
if mavgen.mavgen(mavgen_options(), [xml]):
return 0
return 1
def post_run(self):
super(mavgen, self).post_run()
for header in self.generator.output_dir.ant_glob("*.h **/*.h", remove=False):
header.sig = header.cache_sig = self.cache_sig
def options(opt):
opt.load('python')
@feature('mavgen')
@before_method('process_source')
def process_mavgen(self):
if not hasattr(self, 'output_dir'):
self.bld.fatal('mavgen: missing option output_dir')
inputs = self.to_nodes(self.bld.srcnode.find_node(self.source))
outputs = []
self.source = []
if not isinstance(self.output_dir, Node.Node):
self.output_dir = self.bld.bldnode.find_or_declare(self.output_dir)
task = self.create_task('mavgen', inputs, outputs)
task.env['OUTPUT_DIR'] = self.output_dir.abspath()
task.env.env = dict(os.environ)
task.env.env['PYTHONPATH'] = task.env.MAVLINK_DIR
def configure(cfg):
"""
setup environment for mavlink header generator
"""
cfg.load('python')
cfg.check_python_version(minver=(2,7,0))
env = cfg.env
env.MAVLINK_DIR = cfg.srcnode.make_node('modules/mavlink/').abspath()