compile architecture-specific, portable ruby

S

Sean O'Donnell

Hello,

I am trying to put together a compiled, standalone version of ruby
that I can drop into a user directory from a portable drive. Think:
classroom setting with twenty, un-networked OSX 10.4/PPC machines. I
want to compile once on one of these machines, then tarball it up and
copy it out to the user's home directory on each of the other
computers. I then update the user's PATH (e.g., /Users/student/local/
ruby) to find this version of ruby.

Here's how I build it now, which isn't quite working:

ruby-1.87-src> ./configure --prefix=/Users/teacher/local
ruby-1.87-src> make && make install

It's built in my local directory, which I tarball and then copy out
to /Users/student/local on the other PPCs. But, when I try to run it
from the other computer, I get this error:

==start

dyld: lazy symbol binding failed: Symbol not found: _ruby_init_stack
Referenced from: /Applications/MKSAP15/RoR/Ruby/bin/ruby
Expected in: /usr/lib/libruby.dylib

dyld: Symbol not found: _ruby_init_stack
Referenced from: /Applications/MKSAP15/RoR/Ruby/bin/ruby
Expected in: /usr/lib/libruby.dylib

Trace/BPT trap

=end

Thoughts? I guess the high-level question is this: Are there
additional flags that I need to pass to `configure` to build a self-
contained, architecture-specific version?

Thanks,

Sean
 
J

Jeremy Hinegardner

Hello,

I am trying to put together a compiled, standalone version of ruby
that I can drop into a user directory from a portable drive. Think:
classroom setting with twenty, un-networked OSX 10.4/PPC machines. I
want to compile once on one of these machines, then tarball it up and
copy it out to the user's home directory on each of the other
computers. I then update the user's PATH (e.g., /Users/student/local/
ruby) to find this version of ruby.

Here's how I build it now, which isn't quite working:

ruby-1.87-src> ./configure --prefix=/Users/teacher/local
ruby-1.87-src> make && make install

It's built in my local directory, which I tarball and then copy out
to /Users/student/local on the other PPCs. But, when I try to run it
from the other computer, I get this error:

==start

dyld: lazy symbol binding failed: Symbol not found: _ruby_init_stack
Referenced from: /Applications/MKSAP15/RoR/Ruby/bin/ruby
Expected in: /usr/lib/libruby.dylib

dyld: Symbol not found: _ruby_init_stack
Referenced from: /Applications/MKSAP15/RoR/Ruby/bin/ruby
Expected in: /usr/lib/libruby.dylib

Trace/BPT trap

=end

These are errors from the linker on the other PPC. When you built ruby
it put the path to the shared library in the executable, and the file
/usr/lib/libruby.dylib does not exist on the student's machine.
Thoughts? I guess the high-level question is this: Are there
additional flags that I need to pass to `configure` to build a self-
contained, architecture-specific version?

Built a fully staticly linked ruby instead. If you plan on using zlib or
openssl in your teaching you'll need to build them and put them in the
tarball too.

Edit the ext/Setup file in the ruby distribution tarball to turn on the
'nodynamic' option and uncomment each extension you would like compiled
statically.

Then run :

./configure --disable-shared --prefix=/Users/student/local/ruby
make && make install

Then I believe you'll be a step closer. Doing this will disable the
dynamic loading of extensions, so I'm assuming that you will not later
deploy gems with extensions on top of this.

enjoy,

-jeremy
 
M

Marnen Laibow-Koser

Sean said:
Hello,

I am trying to put together a compiled, standalone version of ruby
that I can drop into a user directory from a portable drive.
[...]

Why not use JRuby?

Best,
 
S

Sean O'Donnell

These are errors from the linker on the other PPC. When you built ruby
it put the path to the shared library in the executable, and the file
/usr/lib/libruby.dylib does not exist on the student's machine.


Built a fully staticly linked ruby instead.  If you plan on using zlib or
openssl in your teaching you'll need to build them and put them in the
tarball too.

Edit the ext/Setup file in the ruby distribution tarball to turn on the
'nodynamic' option and uncomment each extension you would like compiled
statically.

Then run :

    ./configure --disable-shared --prefix=/Users/student/local/ruby
    make && make install

Then I believe you'll be a step closer.  Doing this will disable the
dynamic loading of extensions, so I'm assuming that you will not later
deploy gems with extensions on top of this.

enjoy,

-jeremy

Thanks - I may go this way. However, if I were to continue with a non-
static version, how would I force the path to point to the desired
shared library? Like this?

../configure --prefix=/Users/student/local --libdir=/Users/student/
local

In the version I've built, I can see libruby.dylib in the /Users/
student/local/lib directory. It was my intention to keep these shared
libraries contained within the build. I guess the executable just
wasn't pointing to it.

I'm glad you mentioned that I cannot deploy w/extensions on top of the
statically built ruby. I need to use sqlite3-ruby, which may fall into
this category. Sounds like I've got some experimenting to do.

Thanks,
Sean
 
J

Jeremy Hinegardner

Thanks - I may go this way. However, if I were to continue with a non-
static version, how would I force the path to point to the desired
shared library? Like this?

./configure --prefix=/Users/student/local --libdir=/Users/student/
local

I think just doing:

./configure --prefix=/Users/student/local

will do the trick.
In the version I've built, I can see libruby.dylib in the /Users/
student/local/lib directory. It was my intention to keep these shared
libraries contained within the build. I guess the executable just
wasn't pointing to it.

Yup, that would be the case.
I'm glad you mentioned that I cannot deploy w/extensions on top of the
statically built ruby. I need to use sqlite3-ruby, which may fall into
this category. Sounds like I've got some experimenting to do.

I think running this configure you'll probably be okay. And you can prepare
all the items you need for you students this way too. Go ahead and install
the gems you need by executing the /Users/student/local/bin/gem command
and they should all be installed relative to the /Users/student/local
on you instructors machine, then you can tar up the /Users/studient/local
dir for your students and distribute it.

And the other email in this thread mentions jruby, which is also an option,
depending on the other gems you are planning on using.

enjoy,

-jeremy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,226
Members
46,815
Latest member
treekmostly22

Latest Threads

Top