From: nobu.nakada@... Date: 1999-09-28T21:45:04+09:00 Subject: [ruby-dev:7944] rbconfig.rb なかだです。 いくつか拡張ライブラリとかツールを RPM 化してみて疑問に思ったの ですが、rbconfig.rb の Config::CONFIG の値は Makefile 用なのでしょ うか、Ruby 用なのでしょうか。mkconfig.rb の中でわざわざ ${var} を 展開しているところを見ると Ruby 用にも思えますが、いくつかは $(var) 形式のまま残っている部分があります。できれば、Makefile 用 にマクロ形式のままのものが欲しいのですが。 なんで RPM と Makefile が関連するのか、RPM を使っていない方は分 からないでしょうからちょっと説明しますと、RPM はコンパイル後、テ ンポラリディレクトリを作ってそこに一度仮想的にインストールします。 で、そのためにディレクトリ関連のマクロはある程度抽象化している必要が あります。つまり、現状 exec_prefix = /usr libdir = /usr/lib とか直接指定された形になっているものが、できれば exec_prefix = $(prefix) libdir = $(exec_prefix)/lib のようにマクロになっていた方が望ましいわけです。 とりあえず以下のようなパッチを作ってみました。Makefile の生成に 使われることが多いと思うのですがどうでしょうか。 * Config::CONFIG はマクロをそのまま残す * Config::RBCONFIG は CONFIG の値をマクロはすべて展開した形で返す diff -ru2 dist/Makefile.in build/Makefile.in --- dist/Makefile.in Tue Sep 28 14:04:36 1999 +++ build/Makefile.in Tue Sep 28 14:04:49 1999 @@ -122,5 +122,5 @@ @./miniruby$(EXEEXT) $(srcdir)/rubytest.rb -rbconfig.rb: miniruby$(EXEEXT) +rbconfig.rb: miniruby$(EXEEXT) $(srcdir)/mkconfig.rb config.status @./miniruby$(EXEEXT) $(srcdir)/mkconfig.rb rbconfig.rb diff -ru2 dist/mkconfig.rb build/mkconfig.rb --- dist/mkconfig.rb Fri Aug 13 14:45:06 1999 +++ build/mkconfig.rb Tue Sep 28 21:04:52 1999 @@ -21,5 +21,5 @@ ] -print " CONFIG = {}\n" +print " CONFIG = {\n" v_fast = [] v_others = [] @@ -29,13 +29,11 @@ if /^s%@program_transform_name@%s,(.*)%g$/ ptn = $1.sub(/\$\$/, '$').split(/,/) #' - v_fast << " CONFIG[\"ruby_install_name\"] = \"" + "ruby".sub(ptn[0],ptn[1]) + "\"\n" + v_fast << " \"ruby_install_name\" => \"" + "ruby".sub(ptn[0],ptn[1]) + "\",\n" elsif /^s%@(\w+)@%(.*)%g/ name = $1 val = $2 || "" next if name =~ /^(INSTALL|DEFS|configure_input|srcdir|top_srcdir)$/ - v = " CONFIG[\"" + name + "\"] = " + - val.sub(/^\s*(.*)\s*$/, '"\1"').gsub(/\$\{?([^(){}]+)\}?/) { - "\#{CONFIG[\\\"#{$1}\\\"]}" - } + "\n" + v = " \"" + name + "\" => \"" + + val.strip.gsub(/\$\{?([^(){}]+)\}?/) {"$(#{$1})"} + "\",\n" if fast[name] v_fast << v @@ -53,12 +51,12 @@ val.sub! /^\s*(.*)\s*$/, '"\1"' end - print " CONFIG[\"#{key}\"] = #{val}\n" + print " \"#{key}\" => #{val},\n" end end end elsif /^ac_given_srcdir=(.*)/ - v_fast << " CONFIG[\"srcdir\"] = \"" + File.expand_path($1) + "\"\n" + v_fast << " \"srcdir\" => \"" + File.expand_path($1) + "\",\n" elsif /^ac_given_INSTALL=(.*)/ - v_fast << " CONFIG[\"INSTALL\"] = " + $1 + "\n" + v_fast << " \"INSTALL\" => " + $1 + ",\n" end # break if /^CEOF/ @@ -67,7 +65,7 @@ if not has_version VERSION.scan(/(\d+)\.(\d+)\.(\d+)/) { - print " CONFIG[\"MAJOR\"] = \"" + $1 + "\"\n" - print " CONFIG[\"MINOR\"] = \"" + $2 + "\"\n" - print " CONFIG[\"TEENY\"] = \"" + $3 + "\"\n" + print " \"MAJOR\" => \"" + $1 + "\",\n" + print " \"MINOR\" => \"" + $2 + "\",\n" + print " \"TEENY\" => \"" + $3 + "\",\n" } end @@ -75,13 +73,20 @@ print v_fast, v_others print < "#{Dir.pwd}" + } + + class << RBCONFIG = {} + def [](key) + (val = super).nil? or return val + if val = CONFIG[key] + self[key] = false # to avoid infinite recusion + self[key] = val.gsub(/\\$\\(([^()]+)\\)/) {|var| self[$1] || var} end + end + def keys + super | CONFIG.keys + end + def each + keys.each {|key| yield key, self[key]} and self # completed or breaked end end -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦