Hello,

In [ruby-core:31352] Roger Pack tried to understand why under certain
conditions extensions failed to export symbols properly.

After looking to Mr. Nobuyoshi Nakada example in that thread, the
usage of i386-mingw32-fake made it clear that the contents of that
file play an important role in the cross-compilation and the correct
generation of makefiles and extensions.

This affects rake-compiler projects, which strives to simplify OSX and
Linux gem developers providing binaries for Windows users.

http://github.com/luislavena/rake-compiler

After solving my cross-compilation issues with latest trunk and
ruby_1_9_2 branch, decided to investigate further how to solve the
issue and integrate in rake-compiler a solution that works once Ruby
1.9.2 gets out.

When created rake-compiler, I used to generate a simple fake script:

http://github.com/luislavena/rake-compiler/blob/master/lib/rake/extensionta=
sk.rb#L365-372

class Object
  remove_const :RUBY_PLATFORM
  remove_const :RUBY_VERSION
  RUBY_PLATFORM =3D "i386-mingw32"
  RUBY_VERSION =3D "#{version}"
end

Which has proven to work perfectly with mkmf and Ruby 1.8 series.

Now with newer 1.9.x and the .def file, it seems this simple example
do not generate what is need:

$ cat fake.rb
class Object
  CROSS_COMPILING =3D RUBY_PLATFORM
  remove_const :RUBY_PLATFORM
  remove_const :RUBY_VERSION
  remove_const :RUBY_DESCRIPTION if defined?(RUBY_DESCRIPTION)
  RUBY_PLATFORM =3D "i386-mingw32"
  RUBY_VERSION =3D "1.9.2"
  RUBY_DESCRIPTION =3D "ruby #{RUBY_VERSION} (2010-08-02) [#{RUBY_PLATFORM}=
]"
end

$ cat extconf.rb
require 'mkmf'
create_makefile('testext')

$ ruby -r ./fake.rb extconf.rb

$ make
gcc -I. -I/home/luis/.rvm/rubies/ruby-1.9.2-head/include/ruby-1.9.1/i686-li=
nux
-I/home/luis/.rvm/rubies/ruby-1.9.2-head/include/ruby-1.9.1/ruby/backward
-I/home/luis/.rvm/rubies/ruby-1.9.2-head/include/ruby-1.9.1 -I.
-D_FILE_OFFSET_BITS=3D64  -fPIC -O3 -ggdb -Wextra -Wno-unused-parameter
-Wno-parentheses -Wpointer-arith -Wwrite-strings
-Wno-missing-field-initializers -Wno-long-long  -fPIC  -o testext.o -c
testext.c
gcc -shared -o testext.so testext.o -L.
-L/home/luis/.rvm/rubies/ruby-1.9.2-head/lib
-Wl,-R/home/luis/.rvm/rubies/ruby-1.9.2-head/lib -L.  -rdynamic
-Wl,-export-dynamic   -Wl,-R
-Wl,/home/luis/.rvm/rubies/ruby-1.9.2-head/lib
-L/home/luis/.rvm/rubies/ruby-1.9.2-head/lib -lruby  -lpthread -lrt
-ldl -lcrypt -lm   -lc

$ file testext.so
testext.so: ELF 32-bit LSB shared object, Intel 80386, version 1
(SYSV), dynamically linked, not stripped

=3D=3D=3D

Comparing my naive implementation of fake with the real one:

http://gist.github.com/503737

It is clear that my previous trick will not work with newer versions
of Ruby (specifically mkmf), including the upcoming 1.9.2

With the goal of providing a working environment for all the extension
authors out there, I was wondering if there is any documentation I
should read to better understand the needed changes.

Thank you for your time.
--=20
Luis Lavena
AREA 17
-
Perfection in design is achieved not when there is nothing more to add,
but rather when there is nothing more to take away.
Antoine de Saint-Exup=E9ry