diff --git a/lib/rscons/basic_environment.rb b/lib/rscons/basic_environment.rb index f3642f4..2e18134 100644 --- a/lib/rscons/basic_environment.rb +++ b/lib/rscons/basic_environment.rb @@ -13,18 +13,42 @@ module Rscons load_configuration_data!(options) end - # Get a construction variable's value. + # Access the value of a construction variable. # - # @see VarSet#[] - def [](*args) - @varset.__send__(:[], *args) + # @param key [String, Symbol] + # The construction variable name. + # + # @return [Object] + # The construction variable's value. + def [](key) + @varset[key] end - # Set a construction variable's value. + # Access the value of a construction variable. # - # @see VarSet#[]= - def []=(*args) - @varset.__send__(:[]=, *args) + # This method is similar to #[] but does not make a copy-on-access copy of + # the variable accessed. This means that the returned value is NOT safe to + # be modified by the caller. Thus the caller must guarantee that it does + # not modify the returned value. + # + # @param key [String, Symbol] + # The construction variable name. + # + # @return [Object] + # The construction variable's value. + def get_var(key) + @varset.get_var(key) + end + + # Assign a value to a construction variable. + # + # @param key [String, Symbol] + # The construction variable name. + # + # @param val [Object] + # The value to set. + def []=(key, val) + @varset[key] = val end # Add a set of construction variables to the BasicEnvironment. @@ -108,7 +132,7 @@ module Rscons append["LDFLAGS", ["-arch", val]] end skip = true - elsif word =~ /^#{self["CPPDEFPREFIX"]}(.*)$/ + elsif word =~ /^#{get_var("CPPDEFPREFIX")}(.*)$/ handle["CPPDEFINES", $1] elsif word == "-include" if val = words[i + 1] @@ -121,11 +145,11 @@ module Rscons append["LDFLAGS", ["-isysroot", val]] end skip = true - elsif word =~ /^#{self["INCPREFIX"]}(.*)$/ + elsif word =~ /^#{get_var("INCPREFIX")}(.*)$/ handle["CPPPATH", $1] - elsif word =~ /^#{self["LIBLINKPREFIX"]}(.*)$/ + elsif word =~ /^#{get_var("LIBLINKPREFIX")}(.*)$/ handle["LIBS", $1] - elsif word =~ /^#{self["LIBDIRPREFIX"]}(.*)$/ + elsif word =~ /^#{get_var("LIBDIRPREFIX")}(.*)$/ handle["LIBPATH", $1] elsif word == "-mno-cygwin" append["CCFLAGS", [word]] @@ -174,7 +198,7 @@ module Rscons # @return [void] def merge_flags(flags) flags.each_pair do |key, val| - if self[key].is_a?(Array) and val.is_a?(Array) + if self.get_var(key).is_a?(Array) and val.is_a?(Array) self[key] += val else self[key] = val diff --git a/lib/rscons/environment.rb b/lib/rscons/environment.rb index 9124653..49fc1bb 100644 --- a/lib/rscons/environment.rb +++ b/lib/rscons/environment.rb @@ -507,9 +507,9 @@ module Rscons # @return [String] The command's standard output. def shell(command) shell_cmd = - if self["SHELL"] - flag = self["SHELLFLAG"] || (self["SHELL"] == "cmd" ? "/c" : "-c") - [self["SHELL"], flag] + if shell = get_var("SHELL") + flag = get_var("SHELLFLAG") || (shell == "cmd" ? "/c" : "-c") + [shell, flag] else Rscons.get_system_shell end diff --git a/lib/rscons/varset.rb b/lib/rscons/varset.rb index 2199d9f..f6b6161 100644 --- a/lib/rscons/varset.rb +++ b/lib/rscons/varset.rb @@ -11,11 +11,13 @@ module Rscons append(vars) end - # Access the value of variable. + # Access the value of a variable. # - # @param key [String, Symbol] The variable name. + # @param key [String, Symbol] + # The variable name. # - # @return [Object] The variable's value. + # @return [Object] + # The variable's value. def [](key) if @my_vars.include?(key) @my_vars[key] @@ -30,11 +32,38 @@ module Rscons end end + # Access the value of a variable. + # + # This method is similar to #[] but does not make a copy-on-access copy of + # the variable accessed. This means that the returned value is NOT safe to + # be modified by the caller. Thus the caller must guarantee that it does + # not modify the returned value. + # + # @param key [String, Symbol] + # The variable name. + # + # @return [Object] + # The variable's value. + def get_var(key) + if @my_vars.include?(key) + @my_vars[key] + else + @coa_vars.each do |coa_vars| + if coa_vars.include?(key) + return coa_vars[key] + end + end + nil + end + end + # Assign a value to a variable. # - # @param key [String, Symbol] The variable name. + # @param key [String, Symbol] + # The variable name. # - # @param val [Object] The value to set. + # @param val [Object] + # The value to set. def []=(key, val) @my_vars[key] = val end @@ -99,7 +128,7 @@ module Rscons if varref =~ /^(.*)\$\{([^}]+)\}(.*)$/ prefix, varname, suffix = $1, $2, $3 prefix = expand_varref(prefix, lambda_args) unless prefix.empty? - varval = expand_varref(self[varname], lambda_args) + varval = expand_varref(get_var(varname), lambda_args) # suffix needs no expansion since the regex matches the last occurence case varval when Array @@ -115,7 +144,7 @@ module Rscons "#{prefix}#{varval}#{suffix}" end else - raise "Unknown construction variable type: #{varval.class} (from #{varname.inspect} => #{self[varname].inspect})" + raise "Unknown construction variable type: #{varval.class} (from #{varname.inspect} => #{get_var(varname).inspect})" end else varref diff --git a/spec/rscons/varset_spec.rb b/spec/rscons/varset_spec.rb index ba920ef..14ffc5d 100644 --- a/spec/rscons/varset_spec.rb +++ b/spec/rscons/varset_spec.rb @@ -169,7 +169,7 @@ module Rscons expect { v.expand_varref({a: :b}, :lambda_args) }.to raise_error /Unknown construction variable type: Hash/ end it "raises an error when an expanded variable is an unexpected type" do - expect(v).to receive(:[]).at_least(1).times.with("bad").and_return("bad_val") + expect(v).to receive(:get_var).at_least(1).times.with("bad").and_return("bad_val") expect(v).to receive(:expand_varref).with("bad_val", :lambda_args).and_return({a: :b}) expect(v).to receive(:expand_varref).and_call_original expect { v.expand_varref("${bad}", :lambda_args) }.to raise_error /Unknown construction variable type: Hash/