1require 'minitest/autorun' 2require 'fiddle' 3 4# FIXME: this is stolen from DL and needs to be refactored. 5require_relative '../ruby/envutil' 6 7libc_so = libm_so = nil 8 9case RUBY_PLATFORM 10when /cygwin/ 11 libc_so = "cygwin1.dll" 12 libm_so = "cygwin1.dll" 13when /x86_64-linux/ 14 libc_so = "/lib64/libc.so.6" 15 libm_so = "/lib64/libm.so.6" 16when /linux/ 17 libdir = '/lib' 18 case [0].pack('L!').size 19 when 4 20 # 32-bit ruby 21 libdir = '/lib32' if File.directory? '/lib32' 22 when 8 23 # 64-bit ruby 24 libdir = '/lib64' if File.directory? '/lib64' 25 end 26 libc_so = File.join(libdir, "libc.so.6") 27 libm_so = File.join(libdir, "libm.so.6") 28when /mingw/, /mswin/ 29 require "rbconfig" 30 libc_so = libm_so = RbConfig::CONFIG["RUBY_SO_NAME"].split(/-/).find{|e| /^msvc/ =~ e} + ".dll" 31when /darwin/ 32 libc_so = "/usr/lib/libc.dylib" 33 libm_so = "/usr/lib/libm.dylib" 34when /kfreebsd/ 35 libc_so = "/lib/libc.so.0.1" 36 libm_so = "/lib/libm.so.1" 37when /gnu/ #GNU/Hurd 38 libc_so = "/lib/libc.so.0.3" 39 libm_so = "/lib/libm.so.6" 40when /freebsd/ 41 libc_so = "/lib/libc.so.7" 42 libm_so = "/lib/libm.so.5" 43when /bsd|dragonfly/ 44 libc_so = "/usr/lib/libc.so" 45 libm_so = "/usr/lib/libm.so" 46when /solaris/ 47 libdir = '/lib' 48 case [0].pack('L!').size 49 when 4 50 # 32-bit ruby 51 libdir = '/lib' if File.directory? '/lib' 52 when 8 53 # 64-bit ruby 54 libdir = '/lib/64' if File.directory? '/lib/64' 55 end 56 libc_so = File.join(libdir, "libc.so") 57 libm_so = File.join(libdir, "libm.so") 58when /aix/ 59 pwd=Dir.pwd 60 libc_so = libm_so = "#{pwd}/libaixdltest.so" 61 unless File.exist? libc_so 62 cobjs=%w!strcpy.o! 63 mobjs=%w!floats.o sin.o! 64 funcs=%w!sin sinf strcpy strncpy! 65 expfile='dltest.exp' 66 require 'tmpdir' 67 Dir.mktmpdir do |dir| 68 begin 69 Dir.chdir dir 70 %x!/usr/bin/ar x /usr/lib/libc.a #{cobjs.join(' ')}! 71 %x!/usr/bin/ar x /usr/lib/libm.a #{mobjs.join(' ')}! 72 %x!echo "#{funcs.join("\n")}\n" > #{expfile}! 73 require 'rbconfig' 74 if RbConfig::CONFIG["GCC"] = 'yes' 75 lflag='-Wl,' 76 else 77 lflag='' 78 end 79 flags="#{lflag}-bE:#{expfile} #{lflag}-bnoentry -lm" 80 %x!#{RbConfig::CONFIG["LDSHARED"]} -o #{libc_so} #{(cobjs+mobjs).join(' ')} #{flags}! 81 ensure 82 Dir.chdir pwd 83 end 84 end 85 end 86else 87 libc_so = ARGV[0] if ARGV[0] && ARGV[0][0] == ?/ 88 libm_so = ARGV[1] if ARGV[1] && ARGV[1][0] == ?/ 89 if( !(libc_so && libm_so) ) 90 $stderr.puts("libc and libm not found: #{$0} <libc> <libm>") 91 end 92end 93 94libc_so = nil if !libc_so || (libc_so[0] == ?/ && !File.file?(libc_so)) 95libm_so = nil if !libm_so || (libm_so[0] == ?/ && !File.file?(libm_so)) 96 97if !libc_so || !libm_so 98 ruby = EnvUtil.rubybin 99 ldd = `ldd #{ruby}` 100 #puts ldd 101 libc_so = $& if !libc_so && %r{/\S*/libc\.so\S*} =~ ldd 102 libm_so = $& if !libm_so && %r{/\S*/libm\.so\S*} =~ ldd 103 #p [libc_so, libm_so] 104end 105 106Fiddle::LIBC_SO = libc_so 107Fiddle::LIBM_SO = libm_so 108 109module Fiddle 110 class TestCase < MiniTest::Unit::TestCase 111 def setup 112 @libc = Fiddle.dlopen(LIBC_SO) 113 @libm = Fiddle.dlopen(LIBM_SO) 114 end 115 end 116end 117