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

ruby-changes:21688

From: nobu <ko1@a...>
Date: Sun, 13 Nov 2011 23:46:14 +0900 (JST)
Subject: [ruby-changes:21688] nobu:r33737 (trunk): * lib/mkmf.rb (checking_for): should not modify the result.

nobu	2011-11-13 23:46:01 +0900 (Sun, 13 Nov 2011)

  New Revision: 33737

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=33737

  Log:
    * lib/mkmf.rb (checking_for): should not modify the result.
    * lib/mkmf.rb (have_struct_member): accept compiler opttions.
    * lib/mkmf.rb (convertible_int): add restricted support of struct
      member, and TYPEOF_ macro.

  Modified files:
    trunk/ChangeLog
    trunk/README.EXT
    trunk/lib/mkmf.rb

Index: README.EXT
===================================================================
--- README.EXT	(revision 33736)
+++ README.EXT	(revision 33737)
@@ -750,9 +750,23 @@
 at the top of the file.  You can use the functions below to check
 various conditions.
 
-  have_library(lib, func): check whether library containing function exists.
-  have_func(func, header): check whether function exists
-  have_header(header): check whether header file exists
+  have_macro(macro[, headers[, opt]]): check whether macro is defined
+  have_library(lib[, func[, headers[, opt]]]): check whether library containing function exists
+  find_library(lib[, func, *paths]): find library from paths
+  have_func(func[, headers[, opt]): check whether function exists
+  have_var(var[, headers[, opt]]): check whether variable exists
+  have_header(header[, preheaders[, opt]]): check whether header file exists
+  find_header(header, *paths): find header from paths
+  have_framework(fw): check whether framework exists (for MacOS X)
+  have_struct_member(type, member[, headers]): check whether struct has member
+  have_type(type[, headers[, opt]]): check whether type exists
+  find_type(type, opt, *headers): check whether type exists in headers
+  have_const(const[, headers[, opt]]): check whether constant is defined
+  check_sizeof(type[, headers[, opts]]): check size of type
+  check_signedness(type[, headers[, opts]]): check signedness of type
+  convertible_int(type[, headers[, opts]]): find convertible integer type
+  find_executable(bin[, path]): find excutable file path
+  create_header(header): generate configured header
   create_makefile(target): generate Makefile
 
 The value of the variables below will affect the Makefile.
@@ -1379,12 +1393,12 @@
 
 These functions are available in extconf.rb:
 
- have_macro(macro, headers)
+ have_macro(macro, headers, opt)
 
 Checks whether macro is defined with header.  Returns true if the macro
 is defined.
 
- have_library(lib, func)
+ have_library(lib, func, opt)
 
 Checks whether the library exists, containing the specified function.
 Returns true if the library exists.
@@ -1394,19 +1408,23 @@
 Checks whether a library which contains the specified function exists in
 path.  Returns true if the library exists.
 
- have_func(func, header)
+ have_func(func, headers, opt)
 
 Checks whether func exists with header.  Returns true if the function
 exists.  To check functions in an additional library, you need to
 check that library first using have_library().
+The func shall be either mere function name or function name with
+arguments.
+Example:
+    have_func("LONG2NUM(0)")
 
- have_var(var, header)
+ have_var(var, header, opt)
 
 Checks whether var exists with header.  Returns true if the variable
 exists.  To check variables in an additional library, you need to
 check that library first using have_library().
 
- have_header(header)
+ have_header(header, preheaders, opt)
 
 Checks whether header exists.  Returns true if the header file exists.
 
@@ -1415,12 +1433,12 @@
 Checks whether header exists in path.  Returns true if the header file
 exists.
 
- have_struct_member(type, member, header)
+ have_struct_member(type, member, headers, opt)
 
 Checks whether type has member with header.  Returns true if the type
 is defined and has the member.
 
- have_type(type, header, opt)
+ have_type(type, headers, opt)
 
 Checks whether type is defined with header.  Returns true if the type
 is defined.
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33736)
+++ ChangeLog	(revision 33737)
@@ -1,3 +1,12 @@
+Sun Nov 13 23:45:57 2011  Nobuyoshi Nakada  <nobu@r...>
+
+	* lib/mkmf.rb (checking_for): should not modify the result.
+
+	* lib/mkmf.rb (have_struct_member): accept compiler opttions.
+
+	* lib/mkmf.rb (convertible_int): add restricted support of struct
+	  member, and TYPEOF_ macro.
+
 Sun Nov 13 23:21:24 2011  Tanaka Akira  <akr@f...>
 
 	* ext/gdbm/gdbm.c (fgdbm_reorganize): set close-on-exec flag after
Index: lib/mkmf.rb
===================================================================
--- lib/mkmf.rb	(revision 33736)
+++ lib/mkmf.rb	(revision 33737)
@@ -811,7 +811,7 @@
   a = r = nil
   Logging::postpone do
     r = yield
-    a = (fmt ? fmt % r : r ? "yes" : "no") << "\n"
+    a = (fmt ? "#{fmt % r}" : r ? "yes" : "no") << "\n"
     "#{f}#{m}-------------------- #{a}\n"
   end
   message(a)
@@ -1020,9 +1020,9 @@
 #
 # HAVE_ST_BAR is also defined for backward compatibility.
 #
-def have_struct_member(type, member, headers = nil, &b)
+def have_struct_member(type, member, headers = nil, opt = "", &b)
   checking_for checking_message("#{type}.#{member}", headers) do
-    if try_compile(<<"SRC", &b)
+    if try_compile(<<"SRC", opt, &b)
 #{cpp_include(headers)}
 /*top*/
 #{MAIN_DOES_NOTHING}
@@ -1237,17 +1237,26 @@
       type
     else
       typedef, member, prelude = typedef_expr(type, headers, &b)
-      next unless signed = try_signedness(typedef, member, [prelude])
-      u = "unsigned " if signed > 0
-      prelude << "extern rbcv_typedef_ foo();"
-      compat = UNIVERSAL_INTS.find {|t|
-        try_compile([prelude, "extern #{u}#{t} foo();"].join("\n"), opts, :werror=>true, &b)
-      }
+      if member
+	prelude << "static rbcv_typedef_ rbcv_var;"
+	compat = UNIVERSAL_INTS.find {|t|
+	  try_static_assert("sizeof(rbcv_var.#{member}) == sizeof(#{t})", [prelude], opts, &b)
+	}
+      else
+	next unless signed = try_signedness(typedef, member, [prelude])
+	u = "unsigned " if signed > 0
+	prelude << "extern rbcv_typedef_ foo();"
+	compat = UNIVERSAL_INTS.find {|t|
+	  try_compile([prelude, "extern #{u}#{t} foo();"].join("\n"), opts, :werror=>true, &b)
+	}
+      end
       if compat
         macname ||= type.sub(/_(?=t\z)/, '').tr_cpp
         conv = (compat == "long long" ? "LL" : compat.upcase)
         compat = "#{u}#{compat}"
-        $defs.push(format("-DTYPEOF_%s=%s", type.tr_cpp, compat.quote))
+        typename = type.tr_cpp
+        $defs.push(format("-DSIZEOF_%s=SIZEOF_%s", typename, compat.tr_cpp))
+        $defs.push(format("-DTYPEOF_%s=%s", typename, compat.quote))
         $defs.push(format("-DPRI_%s_PREFIX=PRI_%s_PREFIX", macname, conv))
         conv = (u ? "U" : "") + conv
         $defs.push(format("-D%s2NUM=%s2NUM", macname, conv))

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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