Skip to content
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ webgen.cache
test/wc
*.orig
doc
coverage
1 change: 1 addition & 0 deletions lib/orogen.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ module Orocos
require 'utilrb/pkgconfig'
require 'metaruby/dsls/doc'
require 'orogen/typenames'
require 'rexml/streamlistener'
require 'rexml/document'

require 'orogen/version'
Expand Down
6 changes: 6 additions & 0 deletions lib/orogen/gen/deployment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,12 @@ def dependencies
in_context('core', 'include').
in_context('core', 'link')
end
if transports.include? 'typelib'
result << BuildDependency.new(
"RTT_TYPELIB", "rtt_typelib-#{Generation.orocos_target}").
in_context('core', 'include').
in_context('core', 'link')
end

used_typekits.each do |tk|
next if tk.virtual?
Expand Down
21 changes: 1 addition & 20 deletions lib/orogen/loaders/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,25 +47,13 @@ class Base
# @return [Array<#call>]
attr_reader :project_load_callbacks

# @api private
#
# Cached parsed XML from the typekits
#
# This is to avoid repeatedly parsing the same XML. It is really
# useful only on test suites which tend to clear and reload loaders
# at each setup/teardown
attr_reader :typekit_xml_cache

TypekitXMLCacheEntry = Struct.new :text, :rexml

def initialize(root_loader = self)
@root_loader = root_loader || self
if root_loader != self
root_loader.added_child(self)
end
@typekit_load_callbacks = Array.new
@project_load_callbacks = Array.new
@typekit_xml_cache = Hash.new
clear
end

Expand Down Expand Up @@ -247,14 +235,7 @@ def typekit_model_from_name(name)
end

registry_xml, typelist_txt = typekit_model_text_from_name(name)
if (cached = typekit_xml_cache[name]) && (registry_xml == cached.text)
parsed_xml = cached.rexml
else
parsed_xml = REXML::Document.new(registry_xml)
typekit_xml_cache[name] = TypekitXMLCacheEntry.new(registry_xml, parsed_xml)
end
typekit = Spec::Typekit.from_raw_data(root_loader, name, registry_xml, typelist_txt,
parsed_xml: parsed_xml)
typekit = Spec::Typekit.from_raw_data(root_loader, name, registry_xml, typelist_txt)
if typekit.name != name
raise InternalError, "inconsistency: got typekit #{typekit.name} while loading #{name}"
end
Expand Down
276 changes: 184 additions & 92 deletions lib/orogen/loaders/pkg_config.rb

Large diffs are not rendered by default.

47 changes: 30 additions & 17 deletions lib/orogen/spec/typekit.rb
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,32 @@ def self.parse_typelist(typelist_txt)
return typekit_typelist, typekit_interface_typelist
end

def self.from_raw_data(loader, name, registry_xml, typelist_txt, parsed_xml: nil)
class OpaqueInfoListener
include REXML::StreamListener
attr_reader :registry, :typekit_registry, :opaques

def initialize(typekit_registry)
@registry = Typelib::Registry.new
@typekit_registry = typekit_registry
@opaques = Array.new
end

def tag_start(name, attributes)
return if name != 'opaque'
base_type_name = attributes['name']
inter_type_name = attributes['marshal_as']
includes = attributes['includes']
needs_copy = attributes['needs_copy']
opaques << OpaqueDefinition.new(
typekit_registry.get(base_type_name),
inter_type_name,
Hash[include: includes.split(':'), needs_copy: (needs_copy == '1')],
nil)
registry.merge(typekit_registry.minimal(base_type_name))
end
end

def self.from_raw_data(loader, name, registry_xml, typelist_txt)
typekit_registry = Typelib::Registry.new
Typelib::Registry.add_standard_cxx_types(typekit_registry)
typekit_registry.merge_xml(registry_xml)
Expand All @@ -54,22 +79,10 @@ def self.from_raw_data(loader, name, registry_xml, typelist_txt, parsed_xml: nil
typekit_typelist,
typekit_interface_typelist)

# Now initialize the opaque definitions
parsed_xml ||= REXML::Document.new(registry_xml)
parsed_xml.each_element('//opaque') do |opaque_entry|
base_type_name = opaque_entry.attributes['name']
inter_type_name = opaque_entry.attributes['marshal_as']
includes = opaque_entry.attributes['includes']
needs_copy = opaque_entry.attributes['needs_copy']
spec = OpaqueDefinition.new(
typekit_registry.get(base_type_name),
inter_type_name,
{ :include => includes.split(':'), :needs_copy => (needs_copy == '1') },
nil)

typekit.opaque_registry.merge(typekit_registry.minimal(base_type_name))
typekit.opaques << spec
end
listener = OpaqueInfoListener.new(typekit_registry)
REXML::Document.parse_stream(registry_xml, listener)
typekit.opaques.concat(listener.opaques)
typekit.opaque_registry.merge(listener.registry)

typekit
end
Expand Down
4 changes: 1 addition & 3 deletions lib/orogen/templates/typekit/typelib/transport-typelib.pc
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ type_registry=@TYPEKIT_REGISTRY@

Name: <%= typekit.name %>TypelibTransport
Version: <%= typekit.version %>
<% unless typekit.internal_dependencies.empty? %>
Requires: <%= typekit.internal_dependencies.map { |n, v| v ? "#{n} >= #{v}" : n.to_s }.join(", ") %>
<% end %>
Requires: rtt_typelib-@OROCOS_TARGET@ <%= typekit.internal_dependencies.map { |n, v| v ? "#{n} >= #{v}" : n.to_s }.join(", ") %>
Description: <%= typekit.name %> types support for the Orocos type system
Libs: -L${libdir} -l@libname_typelib@
Cflags: -I${includedir}
Expand Down
8 changes: 4 additions & 4 deletions lib/orogen/test.rb
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
require 'minitest/autorun'
require 'flexmock/test_unit'
require 'minitest/spec'

# simplecov must be loaded FIRST. Only the files required after it gets loaded
# will be profiled !!!
if ENV['TEST_ENABLE_COVERAGE'] == '1'
begin
require 'simplecov'
SimpleCov.start
rescue LoadError
require 'orogen'
OroGen.warn "coverage is disabled because the 'simplecov' gem cannot be loaded"
Expand All @@ -16,6 +13,9 @@
end
end

require 'minitest/autorun'
require 'flexmock/test_unit'
require 'minitest/spec'
require 'orogen'

if ENV['TEST_ENABLE_PRY'] != '0'
Expand Down
Loading