def generate_package_file(pkg, s=None): "Generate the top level file for the given package with forward declarations for individual messages" if s is None: s = IndentedWriter() # Header s.write("#include <boost/python.hpp>\n") s.write("namespace {0}".format(pkg)) s.write("{\n") # Forward declarations messages = msgs.list_msg_types(pkg, False) for m in messages: s.write("void export{0}();".format(m)); # Boost python wrappers s.write("\n") s.write("BOOST_PYTHON_MODULE({0}_cpp)".format(pkg)) s.write("{") with Indent(s, 2): for m in messages: s.write("export{0}();".format(m)) s.write("}\n") s.write("} // namespace") return s.getvalue()
def write_bindings(pkg, target_dir): "Generate and write all bindings" top_level_file = os.path.join(target_dir, pkg+'.cpp') with open(top_level_file, 'w') as f: f.write(generate_package_file(pkg)) for m in msgs.list_msg_types(pkg, False): outfile = os.path.join(target_dir, "{0}_{1}.cpp".format(pkg, m)) with open(outfile, 'w') as f: f.write(generate_file(pkg, m))
def generate_python_imports(pkg): pkgs = set() for m in msgs.list_msg_types(pkg, False): spec = get_msg_spec(pkg, m) for f in spec.parsed_fields(): if f.is_header: pkgs.add('std_msgs') else: match = re.match('(\w+)/', f.base_type) if match and match.group(1)!=pkg: pkgs.add(match.group(1)) return '\n'.join("import {0}_boost".format(p) for p in pkgs)
def write_rospy_conversions(pkg, target_dir, current_pkg): """ Generate all rospy conversions. @param pkg: We'll generate conversion functions for all messages defined in this ros package. @param current_pkg: The generated functions are being put into this ros package. """ outfile = os.path.join(target_dir, pkg+'_boost.py') with open(outfile, 'w') as f: f.write("import roslib; roslib.load_manifest('{0}')\n".format(current_pkg)) f.write("import rostime_boost_python\n") f.write(generate_python_imports(pkg)) f.write("\nimport {0}.msg\n".format(pkg)) f.write("import {0}_cpp as cpp\n".format(pkg)) for m in msgs.list_msg_types(pkg, False): f.write(generate_rospy_conversion(pkg, m))
def write_rospy_conversions(pkg, target_dir): "Generate all rospy conversions" outfile = os.path.join(target_dir, pkg+'_boost_conversions.py') with open(outfile, 'w') as f: for m in msgs.list_msg_types(pkg, False): f.write(generate_rospy_conversion(pkg, m))