From: Jeremy Hinegardner Date: 2009-11-01T03:55:21+09:00 Subject: Re: compile architecture-specific, portable ruby 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 && 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 jeremy@hinegardner.org