2011年11月12日8:14 Tanaka Akira <akr / fsij.org>:

> ここの部分ですが、have_type("dbm", ["db.h", h], hsearch)} を
> 加えているのはなんででしょう?

探したところ、pkgsrc の

  Both db.h and ndbm.1 must be included to use DBM.  Use both headers
  in extconf.rb to check the availability of DBM.  This makes the package
  build on Darwin.

  http://pkgsrc.se/files.php?messageId=20070119195046.48E15211CA / cvs.netbsd.org

というのが元のようで、Darwin では db.h と ndbm.h の両方を include しないと
DBM が使えないという話のようです。

しかし、どうもこれは信じ難いです。
このパッチは extconf.rb で db.h を使って DBM という型を確認するものですが、
dbm.c では db.h を include するようにはなっていません。
そして、それでも dbm がコンパイルできる以上 DBM という型は使えているはずです。

この部分を外して現在の Darwin でも問題ないようなら、
外してしまいたいんですが、どうですかね。
どなたか試していただけないでしょうか。

1.9.3 なら以下のパッチで外れます。

% svn diff --diff-cmd diff -x '-u -p'
Index: ext/dbm/extconf.rb
===================================================================
--- ext/dbm/extconf.rb	(revision 33774)
+++ ext/dbm/extconf.rb	(working copy)
@@ -39,8 +39,7 @@ def headers.db_check(db)
   db_prefix ||= ""

   if (have_library(db, db_prefix+"dbm_open") ||
have_func(db_prefix+"dbm_open")) and
-      hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h,
hsearch)} or
-      hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM",
["db.h", h], hsearch)}
+      hdr = self.fetch(db, ["ndbm.h"]).find {|h| have_type("DBM", h, hsearch)}
     have_func(db_prefix+"dbm_clearerr") unless have_gdbm
     $defs << hsearch if hsearch
     $defs << '-DDBM_HDR="<'+hdr+'>"'

trunk はいろいろと変わっていますが、以下のパッチで相当する部分を外せます。

% svn diff --diff-cmd diff -x '-u -p'
Index: ext/dbm/extconf.rb
===================================================================
--- ext/dbm/extconf.rb	(revision 33774)
+++ ext/dbm/extconf.rb	(working copy)
@@ -50,7 +50,7 @@ def headers.db_check2(db, hdr)
     have_library("gdbm") or return false
   end

-  if (have_type("DBM", hdr, hsearch) || have_type("DBM", ["db.h",
hdr], hsearch)) and
+  if have_type("DBM", hdr, hsearch) and
      (db == 'libc' ? have_func('dbm_open("", 0, 0)', hdr, hsearch) :
                      have_library(db, 'dbm_open("", 0, 0)', hdr, hsearch)) and
      have_func('dbm_clearerr((DBM *)0)', hdr, hsearch)
-- 
[田中 哲][たなか あきら][Tanaka Akira]