From: Luis Lavena Date: 2010-08-02T05:36:36+09:00 Subject: [ruby-core:31585] Cross compilation, understanding fake.rb and mimic it 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/extensiontask.rb#L365-372 class Object remove_const :RUBY_PLATFORM remove_const :RUBY_VERSION RUBY_PLATFORM = "i386-mingw32" RUBY_VERSION = "#{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 = RUBY_PLATFORM remove_const :RUBY_PLATFORM remove_const :RUBY_VERSION remove_const :RUBY_DESCRIPTION if defined?(RUBY_DESCRIPTION) RUBY_PLATFORM = "i386-mingw32" RUBY_VERSION = "1.9.2" RUBY_DESCRIPTION = "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-linux -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=64 -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 === 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. -- 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�ry