diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index d4a0d3f..4384168 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -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 diff --git a/lib/rscons/varset.rb b/lib/rscons/varset.rb index 8ce60a1..74fdbce 100644 --- a/lib/rscons/varset.rb +++ b/lib/rscons/varset.rb @@ -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