class Rmk::ClikeProcessor
Processors similar to C-compilers
Constants
- DEFAULT_CXX_MAIN_PATTERN
pattern to look for +main()+ function
Attributes
auto_detect_main[RW]
enable automatic detection of #main_sources
definitions[R]
#definitions that will be added to #flags (e.g., +-Dkey=value+)
include_paths[R]
list of include paths
Public Class Methods
new()
click to toggle source
Calls superclass method
Rmk::Processor.new
# File lib/processors.rb, line 72 def initialize super @definitions = [] @include_paths = [generator.proj_root] @auto_detect_main = true @slot = SLOTS[:compiler] @requires = [LD] end
Public Instance Methods
add_main_pattern(regex)
click to toggle source
# File lib/processors.rb, line 140 def add_main_pattern(regex) begin @main_pattern = Regexp.union(main_pattern, *regex) rescue StandardError => e warn "ERROR: #{e}" exit(-1) end end
add_project(proj, options = {})
click to toggle source
(should be implemented by subclass)
Calls superclass method
Rmk::Processor#add_project
# File lib/processors.rb, line 127 def add_project(proj, options = {}) super(proj, options) include_path options[:proj_root] if options[:proj_root] end
define(key,value)
click to toggle source
define key1 => value1, key2 → value2
Add a compiler definition. For instance, this refers to adding a preprocessor definition for the CC compiler.
# File lib/processors.rb, line 89 def define(key, value = nil) if key.is_a?(Hash) || key.is_a?(Array) raise "invalid 'value' argument" if value key.each { |k, v| define(k, v) } else d = @definitions.assoc(key) if d d[1] = value else @definitions << [key, value] end end end
definitions_text()
click to toggle source
get #definitions as in command line
# File lib/processors.rb, line 109 def definitions_text @definitions.map { |k, v| "-D#{k}" + (v.nil? ? '' : "=#{v}") }.join(' ') end
descriptive_name()
click to toggle source
# File lib/processors.rb, line 172 def descriptive_name klass = self.class.to_s klass[5, klass.length] # strip module prefix 'Rmk::' end
include_path(*path)
click to toggle source
Add include path(s).
# File lib/processors.rb, line 114 def include_path(*path) path.each do |p| pchecked = Pathname.new(p).to_s @include_paths << pchecked unless @include_paths.include?(pchecked) end end
include_paths_text()
click to toggle source
get include paths as in command line
# File lib/processors.rb, line 122 def include_paths_text @include_paths.map { |p| "-I#{p}" }.join(' ') end
main(*files)
click to toggle source
Manually add program file. For instance, manually add a file that contains a +main()+ function for the CC compiler.
See also #auto_detect_main.
# File lib/processors.rb, line 164 def main(*files) files.each { |f| main_sources[f] = true } end
main_pattern()
click to toggle source
# File lib/processors.rb, line 136 def main_pattern @main_pattern ||= DEFAULT_CXX_MAIN_PATTERN end
ninja_build(writer = generator.ninja)
click to toggle source
# File lib/processors.rb, line 190 def ninja_build(writer = generator.ninja) find_sources(source_pattern) find_main_sources @@log.debug "#{descriptive_name} sources = #{sources.join(' ')}" @@log.debug "#{descriptive_name} programs = #{main_sources.keys.join(' ')}" sources.each do |src| if src =~ /^\$builddir/ obj = generator.object(src) source = src else obj = "$builddir/#{generator.object(src)}" source = generator.expand_source(src) end writer.build(generator.add_object(obj, main_sources[src]), rule_name, source) end end
ninja_rules(writer = generator.ninja)
click to toggle source
# File lib/processors.rb, line 185 def ninja_rules(writer = generator.ninja) writer.rule(rule_name, command, description: "#{descriptive_name} $out", depfile: '$out.dep') end
rule_name()
click to toggle source
# File lib/processors.rb, line 168 def rule_name descriptive_name.downcase end
source_file?(filename)
click to toggle source
# File lib/processors.rb, line 181 def source_file?(filename) filename =~ source_pattern end
source_pattern()
click to toggle source
# File lib/processors.rb, line 177 def source_pattern raise 'not implemented' end
undefine(key)
click to toggle source
Remove a compiler definition.
# File lib/processors.rb, line 104 def undefine(key) @definitions.delete(key) end
Protected Instance Methods
find_main_sources()
click to toggle source
# File lib/processors.rb, line 149 def find_main_sources return unless auto_detect_main # no generated files in src_files src_files = @sources.find_all { |name| name !~ /^\$builddir/ } grep(main_pattern, src_files).each { |src| @main_sources[src] = :main } end