Hello,
I’m a happy user of Libtool and Ruby, and I’m using them both in
several projects, together with the Simplified Wrapper and Interface
Generator (SWIG). Everything works well under GNU/Linux, but things
get a little bit harder on Mac OS X, and I’m posting this message on
the Libtool and Ruby mailing lists to try and get some help from both
communities. I apologize for the long message, but I prefer to give a
clear explanation.
The situation is as follows: I’m working on a C++ library[1]
(actually, this library is only composed of C++ headers, since it is a
generic library using template classes and functions); this library
dispose of bindings for the its data structures and algorithms for
Python and Ruby, thanks to SWIG.
SWIG creates C++ wrapper code to be compiled as dynamic module(s),
loaded by the target language runtime, either directly (Ruby) or via a
small glue code (Python). For the sake of portability, I recently
started to use Libtool for the creation of these dynamic modules. As
neither Python nor Ruby understands Libtool (.la') libraries, loading hooks are used[2]. It works perfectly on GNU/Linux: the interpreter looks for the Libtool library, extract the real name (``dlname'') of the dynamic module from the
.la’ file, and loads it.
Things don’t work as easily on Mac OS X, as far as Ruby is concerned.
Under Mac OS X, dynamic modules produced by libtool (using the options
-avoid-version -module -shared') end with a
.so’ extension (as in
GNU/Linux); hence, Libtool libraries have a dlname ending in .so'. But on Mac OS X the original
Kernel.require’ method of ruby (used to
load dynamic modules into the interpreter) looks for a file ending in
`.bundle’[3] !
My current workaround is to produce a symbolic link .libs/mod.bundle' to
.libs/mod.so’ for each Libtool module named `mod.la’ in the
project.
What do you people from Libtool and Ruby think about the behaviors of
Libtool and Ruby? Should libtool create .bundle' files on Mac OS X/Darwin? Or should ruby accept to load
.so’ files as valid
dynamic modules on this OS?
Thanks in advance for your answers and advice!
P.S. : We created a small project that summarizes this usage of C++,
Libtool, SWIG and Python/Ruby, named after these languages/tools[4].
This experiment was successfully transposed into two project[1][5] to
create Python/Ruby wrappers over C++ code.
Notes:
[1] The Olena project, http://olena.lrde.epita.fr
[2] System hooks for loading Libtool libraries
- in Python: http://svn.gnome.org/viewsvn/checkout/gnome-python/trunk/pygobject/ltihooks.py?content-type=text%2Fplain
- in Ruby: http://www.lrde.epita.fr/~levill_r/olena/ltrequire.rb
[3] Or `.rb’, but they don’t relate to dynamic modules.
[4] http://www.lrde.epita.fr/~levill_r/c++-libtool-swig-python/c++-libtool-swig-python-0.01a.tar.gz
[5] The Tiger project, http://tiger.lrde.epita.fr