Compile architecture-specific, portable ruby

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

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

···

On Sat, Oct 31, 2009 at 10:00:05PM +0900, Sean O'Donnell wrote:

--

Jeremy Hinegardner jeremy@hinegardner.org

Sean O'Donnell wrote:

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,

···

--
Marnen Laibow-Koser
http://www.marnen.org
marnen@marnen.org

--
Posted via http://www.ruby-forum.com/\.

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

···

On Oct 31, 2:55 pm, Jeremy Hinegardner <jer...@hinegardner.org> wrote:

On Sat, Oct 31, 2009 at 10:00:05PM +0900, Sean O'Donnell wrote:
> 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 &amp;&amp; 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

--

Jeremy Hinegardner jer...@hinegardner.org

> > 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.

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

···

On Sun, Nov 01, 2009 at 07:40:13AM +0900, Sean O'Donnell wrote:

--

Jeremy Hinegardner jeremy@hinegardner.org