diff --git a/lib/orogen/gen/typekit.rb b/lib/orogen/gen/typekit.rb index 89dee5fa..9e3c496a 100644 --- a/lib/orogen/gen/typekit.rb +++ b/lib/orogen/gen/typekit.rb @@ -629,6 +629,8 @@ def includes_dir attr_accessor :include_dirs # The array of includes that have been loaded attr_reader :included_files + # The hash containing the defines for this typekit + attr_reader :defines # The three possible type export policies. See #type_export_policy # and #export_types @@ -840,6 +842,7 @@ def initialize(project = nil) @include_dirs = Set.new @included_files = Array.new + @defines = Hash.new @plugins = [] plugins << (TypekitMarshallers::TypeInfo::Plugin.new(self)) @@ -2254,6 +2257,28 @@ def cxx_gen_includes(*includes) "#include <#{inc}>" end.sort.join("\n") + "\n" end + + # Adds a define to the typekit that permits to + # add conditionals in user code sections + # @param [String] key Name of the define + # @param [Object] value Value of the define + # @param [Bool] override True when existing values should + # be overriden false otherwise + def define(key,value, override: false) + if @defines.has_key?(key) + existing_value = @defines[key] + if existing_value != value + if override + @defines[key] = value + else + raise "cannot redefine #{key} to #{value} - existing + value is: '#{existing_value}'" + end + end + else + @defines[key] = value + end + end end end end diff --git a/lib/orogen/templates/typekit/CMakeLists.txt b/lib/orogen/templates/typekit/CMakeLists.txt index 81499d60..ba2a9fa0 100644 --- a/lib/orogen/templates/typekit/CMakeLists.txt +++ b/lib/orogen/templates/typekit/CMakeLists.txt @@ -80,7 +80,14 @@ include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/typekit) # Now set up the dependencies <%= typekit_deps = typekit.dependencies Generation.cmake_pkgconfig_require(typekit_deps) %> -set(PKG_CFLAGS ${OrocosRTT_CFLAGS}) + +<% typekit.defines.each do |key, value| %> +set(PKG_CFLAGS ${PKG_CFLAGS} <%= "\"-D#{key}=#{value}\"" %>) +<% end %> +if(PKG_CFLAGS) + add_definitions(${PKG_CFLAGS}) +endif(PKG_CFLAGS) +set(PKG_CFLAGS ${PKG_CFLAGS} ${OrocosRTT_CFLAGS}) <% typekit_deps.each do |dep_def| if dep_def.in_context?('core', 'include') %> set(PKG_CFLAGS ${PKG_CFLAGS} ${<%= dep_def.var_name %>_CFLAGS}) diff --git a/test/gen/test_typekit.rb b/test/gen/test_typekit.rb index 60e43767..27460c48 100644 --- a/test/gen/test_typekit.rb +++ b/test/gen/test_typekit.rb @@ -222,6 +222,18 @@ def test_parse_typelist_type_with_spaces_in_name_not_exported assert_equal ['/unsigned int'], typelist assert_equal [], interface_typelist end + def test_defines + typekit = OroGen::Gen::RTT_CPP::Typekit.new + assert_equal typekit.defines, Hash.new + typekit.define("TEST",2) + assert_equal typekit.defines, {"TEST"=>2} + + assert_raises(Exception) do + typekit.define("TEST",3) + end + typekit.define("TEST","new_value", override: true) + assert_equal typekit.defines, {"TEST"=>"new_value"} + end end