2010年6月3日23:38 Takahiro Kambe <redmine / ruby-lang.org>:
> Bug #3385: ext/dbm: accept various version of db
> http://redmine.ruby-lang.org/issues/show/3385
>
> 起票者: Takahiro Kambe
> ステータス: Open, 優先度: Normal
> ruby -v: ruby 1.9.2dev (2010-05-31 revision 28117) [i486-netbsdelf]
>
> ext/dbのextconf.rbに、様々なバージョンのBerkley DBを認識させるためのパッチです。

かなり前の話ですが、疑問がわいたので教えてください。

> --- ext/dbm/extconf.rb.orig     2009-10-02 10:45:39.000000000 +0000
> +++ ext/dbm/extconf.rb

> @@ -36,7 +39,8 @@ 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)}
> +      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)}
>     have_func(db_prefix+"dbm_clearerr") unless have_gdbm
>     $defs << hsearch if hsearch
>     $defs << '-DDBM_HDR="<'+hdr+'>"'

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

ここで h は "db2/db.h", "db2.h", "db.h" といったヘッダフィルの名前が
入っているので、それに "db.h" を合わせると

"db.h" と "db2/db.h" を両方 include するとか、
"db.h" と 2回 include するとかいうことをテストすることになります。

実際、Berkeley DB が入っていない環境で (Ruby 1.9.3 を) を試すと、

1: #include "ruby.h"
2:
3: #include <db.h>
4: #include <db.h>
5:
6: /*top*/
7: typedef DBM conftest_type;
8: int conftestval[sizeof(conftest_type)?1:-1];

とか、

/* begin */
1: #include "ruby.h"
2:
3: #include <db.h>
4: #include <db2/db.h>
5:
6: /*top*/
7: typedef DBM conftest_type;
8: int conftestval[sizeof(conftest_type)?1:-1];
/* end */

といった記録が ext/dbm/mkmf.log に残っています。

どうも奇妙に思えるんですが、どういう意図なんでしょう?
-- 
[田中 哲][たなか あきら][Tanaka Akira]