class Shog::Context
An instance of this class is visible to our build scripts with name @shog
Attributes
config[RW]
default_target[RW]
rule[RW]
Public Class Methods
new(backend, emitter)
click to toggle source
# File lib/context.rb, line 9 def initialize(backend, emitter) @backend = backend @emitter = emitter @rule = {} @default_target = PathSet.new @config = {} end
Public Instance Methods
bind()
click to toggle source
# File lib/context.rb, line 24 def bind binding end
cwd(src)
click to toggle source
# File lib/context.rb, line 52 def cwd(src) Path.make(src) end
deep_clone()
click to toggle source
# File lib/context.rb, line 78 def deep_clone ctx = Context.new(@backend, @emitter) ctx.rule = @rule.deep_clone ctx.rule[:generate_build].deps = @rule[:generate_build].deps # deps are global across the build ctx.default_target = @default_target.deep_clone ctx.config = @config ctx end
emit(rule_id, src, params = {})
click to toggle source
# File lib/context.rb, line 56 def emit(rule_id, src, params = {}) r = @rule[rule_id] raise "Rule #{rule_id} is not registered" unless r params[:input] = PathSet.make(src) target = r.target(params) # fix path to inputs, outputs, includes @emitter.emit(target) return target[:output] end
emit_each(rule_id, srcs, params = {})
click to toggle source
# File lib/context.rb, line 68 def emit_each(rule_id, srcs, params = {}) out = [] for s in srcs p = params.dup p[:input] = s out += emit(rule_id, s, p) end return out end
register_rule(type)
click to toggle source
# File lib/context.rb, line 18 def register_rule(type) r = type.new @emitter.rule(r) @rule[r.id] = r end
visit(dirs)
click to toggle source
# File lib/context.rb, line 44 def visit(dirs) case dirs when String then visit_dir(dirs) when Array then dirs.map { |d| visit_dir(d) }.flatten else raise "Unknown object type for dirs: #{dirs.class.name}" end end
visit_dir(dir, new_ctx = true)
click to toggle source
# File lib/context.rb, line 28 def visit_dir(dir, new_ctx = true) old_pwd = Path.pwd ctx = new_ctx ? deep_clone() : self Path.pwd = File.join(Path.pwd, dir) script = cwd("shog.build") @rule[:generate_build].deps << script script_name = script.path build_script = File.read(script_name) out = ctx.bind.eval(build_script, script_name) Path.pwd = old_pwd return out end