class RakeOE::PrjFileCache

Finds all project files and reads them into memory Maps found entries to the following hash format:

{"PRJ_TYPE1" => [{"NAME1"=>{"SETTING1" => "VALUE1", "SETTING2" => "VALUE2", ... },
                 {"NAME2"=>{"SETTING1" => "VALUE1", "SETTING2" => "VALUE2", ... },
                  ... ,
                ]
{"PRJ_TYPE2" => [{"NAME100"=>{"SETTING1" => "VALUE1", "SETTING2" => "VALUE2", ... },
                 {"NAME101"=>{"SETTING1" => "VALUE1", "SETTING2" => "VALUE2", ... },
                 ... ,
                ]
}

XXX DS: IDEA: generate all runtime dependencies at the beginning for each prj, XXX DS: e.g. lib includes, source files, dependency files etc. and cache those as own variable in @prj_list

Attributes

prj_list[RW]

Public Class Methods

contain?(prj_type, prj_name) click to toggle source

Do we know anything about prj_name ?

# File lib/rakeoe/prj_file_cache.rb, line 114
def self.contain?(prj_type, prj_name)
  return false unless @prj_list.has_key?(prj_type)
  @prj_list[prj_type].has_key?(prj_name)
end
deps_recursive(values, setting, visited=Set.new) click to toggle source

Recursive function that uses each value of the array given via parameter ‘values’ and uses parameter ‘setting’ for accessing the values for next recursion step until all values have been traversed in all projects

# File lib/rakeoe/prj_file_cache.rb, line 145
def self.deps_recursive(values, setting, visited=Set.new)
  return visited if values.nil?
  values.each do |val|
    next if (visited.include?(val))
    visited << val
    next_values = PrjFileCache.get_with_name(val, setting)
    deps_recursive(next_values, setting, visited)
  end
  visited
end
directory(prj_type, prj_name) click to toggle source

Returns the directory in which the prj is

# File lib/rakeoe/prj_file_cache.rb, line 128
def self.directory(prj_type, prj_name)
  return nil unless self.contain?(prj_type, prj_name)
  @prj_list[prj_type][prj_name]['PRJ_HOME']
end
entries_reversed(prj_types) click to toggle source

Returns all entries for given project types as an array of reversed prj_name => prj_type mappings

@param prj_types [Array] project types as defined by the PRJ_TYPE property

@return [Array] Array of hashes prj_name => prj_type

# File lib/rakeoe/prj_file_cache.rb, line 190
def self.entries_reversed(prj_types)
  prj_types.each_with_object(Hash.new) do |prj_type, h|
    h.merge!(@prj_list[prj_type].invert) if @prj_list.has_key?(prj_type)
  end
end
exported_lib_incs(name) click to toggle source

Returns exported include directories of a library project. If given name does not exist in local library projects, an empty array is returned.

@param name name of library

@return exported library includes

# File lib/rakeoe/prj_file_cache.rb, line 277
def self.exported_lib_incs(name)
  rv = []
  # try LIB
  exported_inc_dirs = self.get('LIB', name, 'EXPORTED_INC_DIRS')
  if exported_inc_dirs.to_s.empty?
    # try SOLIB
    exported_inc_dirs = self.get('SOLIB', name, 'EXPORTED_INC_DIRS')
    unless exported_inc_dirs.to_s.empty?
      exported_inc_dirs.split.each do |dir|
        rv << self.get('SOLIB', name, 'PRJ_HOME') + '/' + dir
      end
    end
  else
    exported_inc_dirs.split.each do |dir|
      rv << self.get('LIB', name, 'PRJ_HOME') + '/' + dir
    end
  end
  rv
end
for_each(prj_type, &block) click to toggle source

iterate over each project with given project type

# File lib/rakeoe/prj_file_cache.rb, line 134
def self.for_each(prj_type, &block)
  return unless @prj_list.has_key?(prj_type)
  @prj_list[prj_type].each_pair &block
end
get(prj_type, prj_name, setting) click to toggle source

Returns specific value of a setting of the specified project

# File lib/rakeoe/prj_file_cache.rb, line 89
def self.get(prj_type, prj_name, setting)
  return nil unless self.contain?(prj_type, prj_name)
  @prj_list[prj_type][prj_name][setting] || nil
end
get_lib_entries(libs) click to toggle source

Returns specific project library settings with given library names

@param libs Name of libraries

# File lib/rakeoe/prj_file_cache.rb, line 76
def self.get_lib_entries(libs)
  rv = {}
  self.entries_reversed(['ALIB', 'SOLIB']).each_pair do |entries, prj_name|
    if libs.include?(prj_name)
      rv[prj_name] = entries
    end
  end
  rv
end
get_with_name(prj_name, setting) click to toggle source

Returns specific value of a setting of the specified project

# File lib/rakeoe/prj_file_cache.rb, line 97
def self.get_with_name(prj_name, setting)
  projects = @prj_list.values.flatten
  projects.each do |project|
    values = project[prj_name]
    if values
      value = values[setting].split
      if value
        return value
      else
        return []
      end
    end
  end
  []
end
join_regex_keys_for!(a_string) click to toggle source

Joins all entries with keys that are appended with a regular expression that match the given match_string. Make them available via the base key name without the regular expression.

@param a_string String to be matched against key in all kvr with appended regular expression

# File lib/rakeoe/prj_file_cache.rb, line 244
def self.join_regex_keys_for!(a_string)
  @prj_list.each_pair do |prj_type, prj_names|
    prj_names.each_pair do |prj_name, defs|
      defs.each_pair do |property, value|
        # split properties containing /../
        base, key_regex = property.split(/\//)
        if (key_regex)
          if a_string.match(Regexp.new(key_regex))
            if base.end_with?('_')
              base_key = base.chop
            else
              base_key = base
            end

            # if base_key does not yet exist, create an empty string
            @prj_list[prj_type][prj_name][base_key] ||= ''
            @prj_list[prj_type][prj_name][base_key] += " #{@prj_list[prj_type][prj_name][property]}"
          end
        end
      end
    end
  end
end
project_entry_buildable?(entry, platform) click to toggle source

Checks if the project entries build prerequisites are met.

If at least one of the following criteria are met, the method returns false:

* project variable PRJ_TYPE == "DISABLED"
* project variable IGNORED_PLATFORMS contains build platform

@param entry The project name @param platform Current platform

@return true if project can be built on current platform @return false if project settings prohibit building

# File lib/rakeoe/prj_file_cache.rb, line 214
def self.project_entry_buildable?(entry, platform)
  (entry['IGNORED_PLATFORMS'].include?(platform)) &&
      (entry['PRJ_TYPE'] != 'DISABLED')
end
project_names(prj_type) click to toggle source

Returns all found project names

# File lib/rakeoe/prj_file_cache.rb, line 121
def self.project_names(prj_type)
  return [] unless @prj_list.has_key?(prj_type)
  @prj_list[prj_type].keys
end
search_recursive(params={}) click to toggle source

Searches recursively for all projects with name and associate Dependency with given attribute

Returns a hash of the following form: { ‘name1’ => [‘name2’, ‘name3’, …],

'name2' => ['name1', 'name3', ...],
'name3' => ['name1', 'name5', ...],

}

# File lib/rakeoe/prj_file_cache.rb, line 166
def self.search_recursive(params={})
  attribute = params[:attribute]
  names = params[:names]
  rv = {}
  @prj_list.values.flatten.each do |projects|
    projects.each_pair do |prj_name, prj_attributes|
      if (names.include?(prj_name))
        attr_values = prj_attributes[attribute].split
        dependencies = deps_recursive(attr_values, attribute)
        rv[prj_name] = dependencies.to_a
      end
    end
  end
  rv
end
set_defaults(properties) click to toggle source

Sets default properties that should be included for every found project file

# File lib/rakeoe/prj_file_cache.rb, line 34
def self.set_defaults(properties)
  @defaults = properties
end
sweep_recursive(dirs=[]) click to toggle source

Search, read and parse all project files in given directories and add them to prj_list according to their PRJ_TYPE setting. @param dirs List of directories to search recursively for prj.rake files

# File lib/rakeoe/prj_file_cache.rb, line 42
def self.sweep_recursive(dirs=[])
  globs = dirs.map{|dir| dir+'/**/prj.rake'}
  all_prj_files = FileList[globs]
  raise "No projects inside #{dirs}?!" if all_prj_files.empty?

  all_prj_files.uniq.each do |file|
    # extract last path from prj.rake as project name
    dir = File.dirname(file)
    name = File.basename(dir)
    kvr = KeyValueReader.new(file)
    kvr.merge(@defaults)

    prj_type = kvr.get('PRJ_TYPE')

    raise "Attribute PRJ_TYPE not set in #{dir}/prj.rake" if prj_type.empty?

    # add attribute PRJ_HOME
    kvr.set('PRJ_HOME', dir)
    kvr.set('PRJ_FILE', file)
    @prj_list[prj_type] ||= {}
    if @prj_list[prj_type].member?(name)
      raise "#{dir}/prj.rake: project \"#{name}\" for PRJ_TYPE \'#{prj_type}\' already defined in #{@prj_list[prj_type][name]['PRJ_HOME']}"
      # XXX we should use a new attribute PRJ_NAME for conflicting project names ...
    end

    @prj_list[prj_type].merge!({name => kvr.env})
  end
end