summaryrefslogtreecommitdiff
path: root/tool
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-14 04:42:14 (GMT)
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-11-14 04:42:14 (GMT)
commitf34e8ff67234db9d49831b1073139602d01e4d6a (patch)
treebb3311484891e4d63e68d9c0e30b89d1b330af4d /tool
parent7a823be8d04813ab174a51c220d73d4ca3ab8a1c (diff)
Add RbConfig.fire_update!
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65720 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'tool')
-rw-r--r--tool/fake.rb35
-rwxr-xr-xtool/mkconfig.rb32
2 files changed, 43 insertions, 24 deletions
diff --git a/tool/fake.rb b/tool/fake.rb
index dc8cf83..4217405 100644
--- a/tool/fake.rb
+++ b/tool/fake.rb
@@ -12,20 +12,9 @@ end
static = !!(defined?($static) && $static)
$:.unshift(builddir)
posthook = proc do
- config = RbConfig::CONFIG
- mkconfig = RbConfig::MAKEFILE_CONFIG
- [
- ["top_srcdir", $top_srcdir],
- ["topdir", $topdir],
- ].each do |var, val|
- next unless val
- mkconfig[var] = config[var] = val
- t = /\A#{Regexp.quote(val)}(?=\/)/
- $hdrdir.sub!(t) {"$(#{var})"}
- mkconfig.keys.grep(/dir\z/) do |k|
- mkconfig[k] = "$(#{var})#$'" if t =~ mkconfig[k]
- end
- end
+ RbConfig.fire_update!("top_srcdir", $top_srcdir)
+ RbConfig.fire_update!("topdir", $topdir)
+ $hdrdir.sub!(/\A#{Regexp.quote($top_srcdir)}(?=\/)/, "$(top_srcdir)")
if $extmk
$ruby = "$(topdir)/miniruby -I'$(topdir)' -I'$(top_srcdir)/lib' -I'$(extout)/$(arch)' -I'$(extout)/common'"
else
@@ -54,16 +43,14 @@ prehook = proc do |extmk|
$extout_prefix = '$(extout)$(target_prefix)/'
config = RbConfig::CONFIG
mkconfig = RbConfig::MAKEFILE_CONFIG
- mkconfig["builddir"] = config["builddir"] = builddir
- mkconfig["buildlibdir"] = config["buildlibdir"] = builddir
- mkconfig["libdir"] = config["libdir"] = builddir
- mkconfig["top_srcdir"] = $top_srcdir if $top_srcdir
- mkconfig["extout"] ||= $extout
- config["top_srcdir"] = File.expand_path($top_srcdir ||= top_srcdir)
- config["rubyhdrdir"] = join[$top_srcdir, "include"]
- config["rubyarchhdrdir"] = join[builddir, config["EXTOUT"], "include", config["arch"]]
- config["extout"] ||= join[$topdir, ".ext"]
- mkconfig["libdirname"] = "buildlibdir"
+ RbConfig.fire_update!("builddir", builddir)
+ RbConfig.fire_update!("buildlibdir", builddir)
+ RbConfig.fire_update!("libdir", builddir)
+ RbConfig.fire_update!("top_srcdir", $top_srcdir ||= top_srcdir)
+ RbConfig.fire_update!("extout", $extout)
+ RbConfig.fire_update!("rubyhdrdir", "$(top_srcdir)/include")
+ RbConfig.fire_update!("rubyarchhdrdir", "$(extout)/include/$(arch)")
+ RbConfig.fire_update!("libdirname", "buildlibdir")
trace_var(:$ruby, posthook)
untrace_var(:$extmk, prehook)
end
diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb
index c3d3230..ec39e5f 100755
--- a/tool/mkconfig.rb
+++ b/tool/mkconfig.rb
@@ -310,6 +310,38 @@ print <<EOS
RbConfig::expand(val)
end
+ # :nodoc:
+ # call-seq:
+ #
+ # RbConfig.fire_update!(key, val) -> string
+ # RbConfig.fire_update!(key, val, mkconf, conf) -> string
+ #
+ # updates +key+ in +mkconf+ with +val+, and all values depending on
+ # the +key+ in +mkconf+.
+ #
+ # RbConfig::MAKEFILE_CONFIG.values_at("CC", "LDSHARED") # => ["gcc", "$(CC) -shared"]
+ # RbConfig::CONFIG.values_at("CC", "LDSHARED") # => ["gcc", "gcc -shared"]
+ # RbConfig.fire_update!("CC", "gcc-8") # => ["CC", "LDSHARED"]
+ # RbConfig::MAKEFILE_CONFIG.values_at("CC", "LDSHARED") # => ["gcc-8", "$(CC) -shared"]
+ # RbConfig::CONFIG.values_at("CC", "LDSHARED") # => ["gcc-8", "gcc-8 -shared"]
+ #
+ # returns updated keys list, or +nil+ if nothing changed.
+ def RbConfig.fire_update!(key, val, mkconf = MAKEFILE_CONFIG, conf = CONFIG)
+ return if (old = mkconf[key]) == val
+ mkconf[key] = val
+ keys = [key]
+ deps = []
+ begin
+ re = Regexp.new("\\\\$\\\\((?:%1$s)\\\\)|\\\\$\\\\{(?:%1$s)\\\\}" % keys.join('|'))
+ deps |= keys
+ keys.clear
+ mkconf.each {|k,v| keys << k if re =~ v}
+ end until keys.empty?
+ deps.each {|k| conf[k] = mkconf[k].dup}
+ deps.each {|k| expand(conf[k])}
+ deps
+ end
+
# call-seq:
#
# RbConfig.ruby -> path