move expanding variable expansions from Environment.execute() to VarSet.expand_varref()

This commit is contained in:
Josh Holtrop 2013-07-11 17:37:02 -04:00
parent ff822155ea
commit cecb43a61c
2 changed files with 36 additions and 30 deletions

View File

@ -76,33 +76,7 @@ module Rscons
end
def execute(short_desc, command, extra_vars)
merged_variables = @variables.merge(extra_vars)
expand_varref = proc do |varref|
if varref.is_a?(Array)
varref.map do |ent|
expand_varref.call(ent)
end
else
if varref =~ /^(.*)\$\[(\w+)\](.*)$/
# expand array with given prefix, suffix
prefix, varname, suffix = $1, $2, $3
varval = merged_variables[varname]
unless varval.is_a?(Array)
raise "Array expected for $#{varname}"
end
varval.map {|e| "#{prefix}#{e}#{suffix}"}
elsif varref =~ /^\$(.*)$/
# expand a single variable reference
varname = $1
varval = merged_variables[varname]
varval or raise "Could not find variable #{varname.inspect}"
expand_varref.call(varval)
else
varref
end
end
end
command = expand_varref.call(command.flatten).flatten
command = @variables.merge(extra_vars).expand_varref(command)
if @variables[:echo] == :command
puts command.map { |c| c =~ /\s/ ? "'#{c}'" : c }.join(' ')
elsif @variables[:echo] == :short

View File

@ -21,9 +21,41 @@ module Rscons
@vars[key] = val
end
def merge(other)
other = other.vars if other.is_a?(VarSet)
VarSet.new(@vars.merge(other))
def append(values)
values = values.vars if values.is_a?(VarSet)
@vars.merge!(values)
self
end
def merge(other = {})
VarSet.new(Marshal.load(Marshal.dump(@vars))).append(other)
end
alias_method :clone, :merge
def expand_varref(varref)
if varref.is_a?(Array)
varref.map do |ent|
expand_varref(ent)
end.flatten
else
if varref =~ /^(.*)\$\[(\w+)\](.*)$/
# expand array with given prefix, suffix
prefix, varname, suffix = $1, $2, $3
varval = @vars[varname]
unless varval.is_a?(Array)
raise "Array expected for $#{varname}"
end
varval.map {|e| "#{prefix}#{e}#{suffix}"}
elsif varref =~ /^\$(.*)$/
# expand a single variable reference
varname = $1
varval = @vars[varname]
varval or raise "Could not find variable #{varname.inspect}"
expand_varref(varval)
else
varref
end
end
end
end
end