ruby-changes:22636
From: akr <ko1@a...>
Date: Sun, 19 Feb 2012 01:07:02 +0900 (JST)
Subject: [ruby-changes:22636] akr:r34685 (trunk): * ext/dbm/extconf.rb: detect GDBM's ndbm.h by testing dbm_clearerr is
akr 2012-02-19 01:06:52 +0900 (Sun, 19 Feb 2012) New Revision: 34685 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=34685 Log: * ext/dbm/extconf.rb: detect GDBM's ndbm.h by testing dbm_clearerr is an empty macro. Modified files: trunk/ChangeLog trunk/ext/dbm/dbm.c trunk/ext/dbm/extconf.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 34684) +++ ChangeLog (revision 34685) @@ -1,3 +1,8 @@ +Sun Feb 19 01:05:41 2012 Tanaka Akira <akr@f...> + + * ext/dbm/extconf.rb: detect GDBM's ndbm.h by testing dbm_clearerr is + an empty macro. + Sun Feb 19 00:25:55 2012 Tanaka Akira <akr@f...> * ext/dbm/extconf.rb: don't choose 'dbm' if _GDB_H_ is defined which Index: ext/dbm/dbm.c =================================================================== --- ext/dbm/dbm.c (revision 34684) +++ ext/dbm/dbm.c (revision 34685) @@ -1096,7 +1096,7 @@ rb_define_const(rb_cDBM, "VERSION", rb_sprintf("QDBM %s", dpversion)); #elif defined(_DB_H_) rb_define_const(rb_cDBM, "VERSION", rb_str_new2("Berkeley DB (unknown)")); -#elif defined(_GDBM_H_) +#elif defined(_GDBM_H_) || defined(HAVE_EMPTY_MACRO_DBM_CLEARERR) rb_define_const(rb_cDBM, "VERSION", rb_str_new2("GDBM (unknown)")); #elif defined(_DBM_IOERR) rb_define_const(rb_cDBM, "VERSION", rb_str_new2("NDBM (4.3BSD)")); Index: ext/dbm/extconf.rb =================================================================== --- ext/dbm/extconf.rb (revision 34684) +++ ext/dbm/extconf.rb (revision 34685) @@ -86,7 +86,27 @@ end end +def have_empty_macro_dbm_clearerr(headers = nil, opt = "", &b) + checking_for checking_message('empty macro of dbm_clearerr(foobarbaz)', + headers, opt) do + try_toplevel('dbm_clearerr(foobarbaz)', headers, opt, &b) + end +end +def try_toplevel(src, headers = nil, opt = "", &b) + if try_compile(<<"SRC", opt, &b) +#{cpp_include(headers)} +/*top*/ +#{src} +SRC + $defs.push("-DHAVE_EMPTY_MACRO_DBM_CLEARERR") + true + else + false + end +end + + def headers.db_check2(db, hdr) $defs.push(%{-DRUBYDBM_DBM_HEADER='"#{hdr}"'}) $defs.push(%{-DRUBYDBM_DBM_TYPE='"#{db}"'}) @@ -132,10 +152,14 @@ # it defines _DB_H_. have_db_header_macro = have_macro('_DB_H_', hdr, hsearch) + # Old GDBM's ndbm.h, until 1.8.3, defines dbm_clearerr as a macro which + # expands to no tokens. + have_gdbm_header_macro1 = have_empty_macro_dbm_clearerr(hdr, hsearch) + # Recent GDBM's ndbm.h, since 1.9, includes gdbm.h and it defines _GDBM_H_. # ndbm compatibility layer of GDBM is provided by libgdbm (until 1.8.0) # and libgdbm_compat (since 1.8.1). - have_gdbm_header_macro = have_macro('_GDBM_H_', hdr, hsearch) + have_gdbm_header_macro2 = have_macro('_GDBM_H_', hdr, hsearch) # 4.3BSD's ndbm.h defines _DBM_IOERR. # The original ndbm is provided by libc in 4.3BSD. @@ -144,10 +168,12 @@ # GDBM provides NDBM functions in libgdbm_compat since GDBM 1.8.1. # GDBM's ndbm.h defines _GDBM_H_ since GDBM 1.9. # So, reject 'gdbm'. 'gdbm_compat' is required. - if have_gdbm_header_macro && db == 'gdbm' + if have_gdbm_header_macro2 && db == 'gdbm' return false end + have_gdbm_header_macro = have_gdbm_header_macro1 | have_gdbm_header_macro2 + # ndbm.h is provided by the original (4.3BSD) dbm, # Berkeley DB 1 in libc of 4.4BSD and # ndbm compatibility layer of gdbm. -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/