From: Tanaka Akira Date: 2011-11-12T08:14:20+09:00 Subject: [ruby-dev:44861] Re: [Bug #3385] ext/dbm: accept various version of db 2010年6月3日23:38 Takahiro Kambe : > 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 4: #include 5: 6: /*top*/ 7: typedef DBM conftest_type; 8: int conftestval[sizeof(conftest_type)?1:-1]; とか、 /* begin */ 1: #include "ruby.h" 2: 3: #include 4: #include 5: 6: /*top*/ 7: typedef DBM conftest_type; 8: int conftestval[sizeof(conftest_type)?1:-1]; /* end */ といった記録が ext/dbm/mkmf.log に残っています。 どうも奇妙に思えるんですが、どういう意図なんでしょう? -- [田中 哲][たなか あきら][Tanaka Akira]