summaryrefslogtreecommitdiff
path: root/lib/mkmf.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-27 03:56:46 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-27 03:56:46 +0000
commita8eaf316303bd7660a55d563e24fcbd4c19230a1 (patch)
treeea14d4855483a9b3a917a724a1d436e3da3755ed /lib/mkmf.rb
parent29983664fcaecee6e92b269095398c56899e57ca (diff)
* lib/mkmf.rb (what_type?): checks more restrictively, and
supports universal binary. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@23076 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/mkmf.rb')
-rw-r--r--lib/mkmf.rb46
1 files changed, 31 insertions, 15 deletions
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index f27f286d07..9153a3510d 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -372,6 +372,7 @@ end
def link_command(ldflags, opt="", libpath=$DEFLIBPATH|$LIBPATH)
conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote,
'src' => CONFTEST_C,
+ 'extout' => $extout,
'arch_hdrdir' => "#$arch_hdrdir",
'top_srcdir' => $top_srcdir.quote,
'INCFLAGS' => "#$INCFLAGS",
@@ -387,6 +388,7 @@ end
def cc_command(opt="")
conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote,
+ 'extout' => $extout,
'arch_hdrdir' => "#$arch_hdrdir",
'top_srcdir' => $top_srcdir.quote)
RbConfig::expand("$(CC) #$INCFLAGS #$CPPFLAGS #$CFLAGS #$ARCH_FLAG #{opt} -c #{CONFTEST_C}",
@@ -395,6 +397,7 @@ end
def cpp_command(outfile, opt="")
conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote, 'srcdir' => $srcdir.quote,
+ 'extout' => $extout,
'arch_hdrdir' => "#$arch_hdrdir",
'top_srcdir' => $top_srcdir.quote)
RbConfig::expand("$(CPP) #$INCFLAGS #$CPPFLAGS #$CFLAGS #{opt} #{CONFTEST_C} #{outfile}",
@@ -983,7 +986,7 @@ def check_sizeof(type, headers = nil, &b)
prelude << "typedef #{typename} rbcv_typedef_;\n"
prelude << "static rbcv_typedef_ *rbcv_ptr_;\n"
prelude = [prelude]
- expr = "sizeof((*rbcv_ptr_)#{"."<<member if member})"
+ expr = "sizeof((*rbcv_ptr_)#{"." << member if member})"
fmt = "%s"
def fmt.%(x)
x ? super : "failed"
@@ -1028,10 +1031,20 @@ end
def what_type?(type, member = nil, headers = nil, &b)
m = "#{type}"
- name = type
+ var = "*rbcv_var_"
+ func = "rbcv_func_(void)"
if member
m << "." << member
- name = "(((#{type} *)0)->#{member})"
+ else
+ type, member = type.split('.', 2)
+ end
+ prelude = cpp_include(headers).split(/$/)
+ prelude << "typedef #{type} rbcv_typedef_;\n"
+ prelude << "static rbcv_typedef_ #{var_};\n"
+ prelude << "extern rbcv_typedef_ #{func};\n"
+ headers = [prelude]
+ if member
+ var = "(#{var}).#{member}"
end
fmt = "seems %s"
def fmt.%(x)
@@ -1040,21 +1053,24 @@ def what_type?(type, member = nil, headers = nil, &b)
checking_for checking_message(m, headers), fmt do
if scalar_ptr_type?(type, member, headers, &b)
if try_static_assert("sizeof(*#{name}) == 1", headers)
- "string"
+ return "string"
end
+ ptr = "*"
elsif scalar_type?(type, member, headers, &b)
- if try_static_assert("sizeof(#{name}) > sizeof(long)", headers)
- "long long"
- elsif try_static_assert("sizeof(#{name}) > sizeof(int)", headers)
- "long"
- elsif try_static_assert("sizeof(#{name}) > sizeof(short)", headers)
- "int"
- elsif try_static_assert("sizeof(#{name}) > 1", headers)
- "short"
- else
- "char"
- end
+ ptr = ""
+ else
+ return
end
+ unsigned = try_static_assert("(rbcv_typedef_)-1 < 0", headers) ? "unsigned" : ""
+ [
+ unsigned,
+ (UNIVERSAL_INTS+["short"]).find do |t|
+ prelude = headers + [["static #{unsigned} #{t} #{ptr}#{name};\n",
+ "extern #{unsigned} #{t} #{ptr}#{func};\n"]]
+ try_static_assert("sizeof(#{ptr}#{name}) == sizeof(#{unsigned}#{t})", prelude)
+ end,
+ ptr
+ ].compact.join(" ")
end
end