[#36686] 1.1 < 61.1 - 60.0 — Shin-ichiro HARA <sinara@...>

原です。

19 messages 2002/12/06

[#36770] www.ruby-lang.orgリニューアル準備のお知らせ — TADA Tadashi <sho@...>

ruby-lang.orgのwebmasterチームでは、タイムリーな情報提供と使いやすい

11 messages 2002/12/16

[ruby-list:36743] Re: DBM

From: WATANABE Hirofumi <eban@...>
Date: 2002-12-12 09:44:34 UTC
List: ruby-list #36743
わたなべです。

OHARA Shigeki <os@iij.ad.jp> writes:

> DBM ですが、ruby の make 時に gdbm がインストールされていると、
> gdbm の方の NDBM 互換インターフェイスの方を優先して
> 利用するようになっていると思います。

ということはRuby 1.6ですよね?
1.7だとgdbmは一番最後に試すし、--wtih-dbm-typeも使えるし。

> なので、私はとりあえず ext/dbm/extconf.rb を手で書き換えて
> gdbm の方を探さないようにしてリンクしないようにしているのですが、
> できれば configure のオプションなどで指定できればと思うのですが、
> 何か良い方法はあるでしょうか?

1.7のextconf.rbをそのまま1.6にもってきて
dbm.cの#include <ndbm.h>を#include DBM_HDRに変更すれば
--with-dbm-type-gdbmのように指定できます。

参考パッチ。

Index: ext/dbm/extconf.rb
===================================================================
RCS file: /src/ruby/ext/dbm/extconf.rb,v
retrieving revision 1.4
diff -u -1 -p -r1.4 extconf.rb
--- ext/dbm/extconf.rb	12 Sep 2000 05:37:33 -0000	1.4
+++ ext/dbm/extconf.rb	12 Dec 2002 09:38:10 -0000
@@ -3,10 +3,53 @@ require 'mkmf'
 dir_config("dbm")
-if have_library("gdbm", "dbm_open")
-  gdbm = true
+
+dblib = with_config("dbm-type", nil)
+
+$dbm_conf_headers = {
+  "db" => ["db.h"],
+  "db1" => ["db1/ndbm.h", "db1.h", "ndbm.h"],
+  "db2" => ["db2/db.h", "db2.h", "db.h"],
+  "dbm" => ["ndbm.h"],
+  "gdbm" => ["gdbm-ndbm.h", "ndbm.h"],
+}
+
+def db_check(db)
+  $dbm_conf_db_prefix = ""
+  $dbm_conf_have_gdbm = false
+  hsearch = ""
+
+  case db
+  when /^db2?$/
+    $dbm_conf_db_prefix = "__db_n"
+    hsearch = "-DDB_DBM_HSEARCH "
+  when "gdbm"
+    $dbm_conf_have_gdbm = true
+  end
+
+  if have_func(db_prefix("dbm_open")) || have_library(db, db_prefix("dbm_open"))
+    for hdr in $dbm_conf_headers.fetch(db, ["ndbm.h"])
+      if have_header(hdr.dup)
+	$CFLAGS += " " + hsearch + "-DDBM_HDR='<"+hdr+">'"
+	return true
+      end
+    end
+  end
+  return false
 end
-gdbm or have_library("db", "dbm_open") or have_library("dbm", "dbm_open")
+
+def db_prefix(func)
+  $dbm_conf_db_prefix+func
+end
+
+if dblib
+  db_check(dblib)
+else
+  for dblib in %w(db db2 db1 dbm gdbm)
+    db_check(dblib) and break
+  end
+end
+
 have_header("cdefs.h") 
 have_header("sys/cdefs.h") 
-if have_header("ndbm.h") and have_func("dbm_open")
-  have_func("dbm_clearerr") unless gdbm
+if /DBM_HDR/ =~ $CFLAGS and have_func(db_prefix("dbm_open"))
+  have_func(db_prefix("dbm_clearerr")) unless $dbm_conf_have_gdbm
   create_makefile("dbm")
Index: ext/dbm/dbm.c
===================================================================
RCS file: /src/ruby/ext/dbm/dbm.c,v
retrieving revision 1.13.2.3
diff -u -1 -p -r1.13.2.3 dbm.c
--- ext/dbm/dbm.c	25 Oct 2002 19:39:22 -0000	1.13.2.3
+++ ext/dbm/dbm.c	12 Dec 2002 09:38:10 -0000
@@ -20,3 +20,3 @@
 #endif
-#include <ndbm.h>
+#include DBM_HDR
 #include <fcntl.h>

In This Thread