mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-03 06:28:27 -04:00
4b1857b3aa
use pymavlink from modules, not from install. This allows building without pymavlink installs, and ensures we use the current version
103 lines
2.8 KiB
Python
103 lines
2.8 KiB
Python
#!/usr/bin/env 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.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()
|