[#7785] rb2c — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

28 messages 1999/09/02

[#7845] [Q] irb and SizedQueue — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

14 messages 1999/09/15

[ruby-dev:7944] rbconfig.rb

From: nobu.nakada@...
Date: 1999-09-28 12:45:04 UTC
List: ruby-dev #7944
なかだです。

  いくつか拡張ライブラリとかツールを 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 <<EOS
-  CONFIG["compile_dir"] = "#{Dir.pwd}"
-  CONFIG.each_value do |val|
-    val.gsub!(/\\$\\(([^()]+)\\)/) do |var|
-      key = $1
-      if CONFIG.key? key
-        "\#{CONFIG[\\\"\#{key}\\\"]}"
-      else
-	var
+    "compile_dir" => "#{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るくらいがちょうどいいかも;-)" 伸悦

In This Thread

Prev Next