[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]