plugins.py
Go to the documentation of this file.
1 import collections
2 import os
3 import re
4 
5 from ros_introspection.plugin_xml import PluginXML
6 
7 from .manifest import enforce_tabbing_helper
8 from .util import roscompile
9 
10 PLUGIN_PATTERN = r'PLUGINLIB_EXPORT_CLASS\(([^:]+)::([^,]+),\s*([^:]+)::([^,]+)\)'
11 PLUGIN_RE = re.compile(PLUGIN_PATTERN)
12 
13 
14 def plugin_xml_by_package(package):
15  xmls = collections.defaultdict(list)
16  for xml in package.plugin_configs:
17  for parent_pkg in xml.parent_pkgs:
18  xmls[parent_pkg].append(xml)
19  return xmls
20 
21 
22 def contains_library(xmls, library, pkg, name):
23  for xml in xmls:
24  if xml.contains_library(library, pkg, name):
25  return True
26  return False
27 
28 
29 def lookup_library(build_rules, rel_fn):
30  for library, deps in build_rules.items():
31  if rel_fn in deps:
32  return library
33 
34 
35 @roscompile
36 def check_plugins(package):
37  """Check that all the plugins are properly defined.
38 
39  We have three dictionaries
40  * The plugins that are defined by macros (defined_macros)
41  * The plugins that have associated configuration files (existing_plugins)
42  * The plugins that are linked by the manifest. (plugin_xml_by_package)
43  First, we reconcile the macros with the files.
44  Then we handle the manifest.
45  Then we make sure that the specific classes are in the configurations
46  """
47  if not package.cmake:
48  return
49  defined_macros = package.source_code.search_for_pattern(PLUGIN_RE)
50  existing_plugins = plugin_xml_by_package(package)
51  defined_plugins = package.manifest.get_plugin_xmls()
52  build_rules = package.cmake.get_source_build_rules('add_library', resolve_target_name=True)
53 
54  for rel_fn, plugin_info in defined_macros.items():
55  library = lookup_library(build_rules, rel_fn)
56  # pkg2/name2 is the parent class
57  for pkg1, name1, pkg2, name2 in plugin_info:
58  # Create file if needed
59  if pkg2 not in existing_plugins:
60  xml_filename = '%s_plugins.xml' % pkg2
61  print('\tCreating %s' % xml_filename)
62  p_xml = PluginXML(xml_filename, os.path.join(package.root, xml_filename))
63  package.plugin_configs.append(p_xml)
64  existing_plugins[pkg2] = [p_xml]
65 
66  # Make sure plugins are properly exported
67  for plugin_xml in existing_plugins[pkg2]:
68  if plugin_xml.rel_fn not in defined_plugins[pkg2]:
69  ex_el = package.manifest.add_plugin_export(pkg2, plugin_xml.rel_fn)
70  enforce_tabbing_helper(package.manifest, ex_el, 2)
71 
72  # Make sure the class is in the files
73  if not contains_library(existing_plugins[pkg2], library, pkg1, name1):
74  # insert into first
75  xml = existing_plugins[pkg2][0]
76  xml.insert_new_class(library, pkg1, name1, pkg2, name2)
ros_introspection::plugin_xml
ros_introspection::plugin_xml::PluginXML
roscompile.plugins.contains_library
def contains_library(xmls, library, pkg, name)
Definition: plugins.py:22
roscompile.manifest.enforce_tabbing_helper
def enforce_tabbing_helper(manifest, node, tabs=1)
Definition: manifest.py:62
roscompile.plugins.lookup_library
def lookup_library(build_rules, rel_fn)
Definition: plugins.py:29
roscompile.plugins.check_plugins
def check_plugins(package)
Definition: plugins.py:36
roscompile.plugins.plugin_xml_by_package
def plugin_xml_by_package(package)
Definition: plugins.py:14


roscompile
Author(s):
autogenerated on Tue Jun 21 2022 03:01:39