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