class EasySwig::GenerateTask

Public Class Methods

new(config) click to toggle source
# File lib/tasks/generate_task.rb, line 7
def initialize(config)
  @config = config
  @gen_dir = @config.generate_dir+'/'+@config.lang
  @generators = {}

  FileUtils.rm_r @gen_dir if Dir.exists?(@gen_dir)
  FileUtils.mkdir_p @gen_dir
  FileUtils.cp "#{home_dir}/resources/#{@config.lang}/standard_header.i", "#{@gen_dir}/standard_header.i"
  FileUtils.cp @config.custom_file, "#{@gen_dir}/custom_config.i" if @config.custom_file
                    FileUtils.cp "#{home_dir}/resources/swig-patches/attribute.i", "#{@gen_dir}/attribute.i"

  @log=EasySwig::Logger.gen_log(@gen_dir)
  @log.info { "Created Generator directory for #{@native_name} in #{@node_gen_dir}" }
end

Public Instance Methods

dispose() click to toggle source
# File lib/tasks/generate_task.rb, line 81
def dispose
  @log.close
end
generate() click to toggle source
# File lib/tasks/generate_task.rb, line 22
    def generate
      module_file = <<-IFILE.escape_heredoc
              %module #{@config.module_name}

              %include "standard_header.i"
              %include "#{@config.custom_file}"
              %include "attribute.i"

      IFILE

      @log.info { "Parsing CSV file #{@csv_file} ..." }
      csv_parser = EasySwig::Readers::CsvParser.new(@config.csv_file, @config.lang)
      
      @log.info { "Parsed CSV file. Number of entries: #{csv_parser.table.size}" }

      @log.info { "Generating Namespaces from CSV file #{@csv_file}..." }
      api_namespaces = csv_parser.namespaces_from_csv
      @log.info { "Namespaces generated in memory: \n\t\tNamespaces: " + (api_namespaces.map{|n| n.basename}.join(', ')) }
      @log.debug { "Namespace contents:\n\t\t\t\t" + print_api_namespaces(api_namespaces) }

      api_namespaces.each do |api_namespace|

        @log.info { "Parsing namespace from C++ files..." }
        namespace = Doxyparser::parse_namespace(api_namespace.basename, @config.doxy_dir+'/xml')
        @log.info { "C++ Namespace parsed" }

        @log.info { "Associating namespace tree (classes, structs, enums...) with the corresponding Doxygen tree..." }
        api_namespace.assoc_with_node(namespace)
        @log.info { "Namespace Tree associated" }
        @log.debug { print_api_namespace(api_namespace) }
        
        # If there are no classes in this namespace things get a bit tricky
        conf_doxy_dir = @config.doxy_dir
                                if api_namespace.api_classes.empty?
                                        api_namespace.define_singleton_method(:file) { 
                                                Doxyparser::parse_file(api_namespace.basename + '.h', conf_doxy_dir+"/xml")
                                        }
                                end

        @log.info { "Associating and sorting header files for all sub-nodes of: #{api_namespace.node_type} #{api_namespace.name}..." }
        hfiles = EasySwig::HFilesManager.assoc_headers(api_namespace)
        @log.info { "Header files associated" }
        hfiles = EasySwig::HFilesManager.sort_headers(hfiles)
        @log.info { "Header files sorted" }
        @log.debug { print_incl_files(hfiles) }

        native_name = api_namespace.basename # Name of module (C++ namespace)
        target_name = api_namespace.target_name # Name of target namespace

        @generators[api_namespace] = Generator.create_instance(hfiles, api_namespace, @config, @log)

        @log.info { "Generating SWIG configuration files..." }
        gen_node_name = @generators[api_namespace].generate
        @log.info { "SWIG configuration files generated" }
        module_file << %Q{%include "#{gen_node_name}.i"\n}
      end
      write_file(%Q{#{@gen_dir}/#{@config.module_name}.i}, module_file)
    end