as F19 is slowly approaching, I thought it'd be great to finalize the stuff about
JRuby/Ruby integration with Fedora. Here are the changes and additions around JRuby, that
* Global changes
- As already mentioned in , change the default operating_system.rb, the current version
is at . The question here is, whether to use versioned directories for extensions. In
my opinion we should do that, as users installing Gems under /usr/local may want to
install them for different version of JRuby (Rubinius in the future). This change will
cost us nothing and will make sure that we can utilize this in the future.
- Add additional macros to macros.rubygems, see  (if the macros names seem confusing,
see the section about packaging gems for JRuby below).
- Two connected problems: 1) RPM generates auto provides from shebangs, e.g.
#!/usr/bin/ruby will automatically require ruby package; 2) How to run programs with
#!/usr/bin/ruby shebangs under JRuby?
-- We've discussed this situation with Vit and we came up with an interesting proposal
for solution. There will be a package (probably with just one file) /usr/bin/ruby. This
will be a bash script, that will take all given parameters and pass them to the proper
interpreter (/usr/bin/ruby-mri or /usr/bin/jruby). There will be a default choice (MRI, I
guess) and the switching will be done by passing _jruby_ (possibly also containing
version) or _mri_ as the first parameter. If e.g. /usr/bin/ruby-mri is not found, the
script will automatically try /usr/bin/jruby and if that is not present either, it will
print out that user needs to install a Ruby runtime.
-- This way, the automatically generated requires will point to the package containing
/usr/bin/ruby and not the actual ruby package, therefore leaving it up to user which Ruby
runtime he wants to install.
-- Also, every executable file with this shebang can be run with _mri_ or _jruby_
parameter: "rspec _mri_" vs. "rspec _jruby_", the same for gem, irb
and anything that has the proper shebang.
* Changes to packaging
- Platform independent packages mustn't R: ruby, unless there is a specific reason to
- Packages with MRI binary extensions will have to R: and BR: ruby explictly, not just
ruby(abi), as that will also be provided by JRuby.
- Packages meant only for JRuby will have to R: and BR: jruby explictly (same reason).
These will use the %gem_extdir_jruby macro.
- Packages with extensions for both Ruby and JRuby (let's consider rubygem-json,
example of converted specfile is at ):
-- MRI extension will probably stay in the core package (rubygem-json).
-- There will be a subpackage with -java suffix (because the naming scheme on rubygems.org
gives e.g. json-1.7.5-java). The subpackage will contain it's own .gemspec and because
all the directory/file names contain the "-java" string, it will use the
-- The -java subpackage will contain the JRuby extension under %gem_extdir_java and
it's platform independent part will be a symlink to platform independent part of its
MRI counterpart (e.g. /usr/share/gems/gems/json-1.7.5-java ->
-- The disadvantage of this approach is, that the core package (rubygem-json) will be a
dependency of rubygem-json-java, therefore forcing MRI to be installed.
-- The rubygem-json-java package could be independent of rubygem-json (e.g. everything
same as above, except it will actually contain the platform independent part). This would
in fact not require MRI ruby to be installed, but I'm not sure of the consequences of
-- A big question is, how to handle provides (applies to both cases). RPM cannot say
"I'm fine with rubygem-json or rubygem-json-java", so the -json package will
probably have to Provides: rubygem(json-java) and users will have to install these
manually, if they want to use JRuby.
- There is also a general problem with Provides/Requires of the interpreters themselves. I
think that JRuby should provide both ruby(abi) = 1.9.1 and ruby(abi) = 1.8. I'm
however not sure whether to provide e.g. rubygem(io-console), which is required by
rubygems package. The problem with this provide is this:
1) user installs JRuby (that provides rubygem(io-console)) and rubygems.
2) user installs MRI, rubygem-io-console doesn't get installed, as the dependency is
3) "gem" command (specifically its part that depends on io-console) run under
As I see it, we probably won't get rid of having MRI ruby installed with JRuby, at
least not for the near future (but at least the auto-requires of /usr/bin/ruby can be
handled, which is a step in the right direction).
I hope I made my points clear, please share your thoughts/comments/critisism.
BTW, I'll be updating my testing repo with JRuby as soon as JRuby 1.7.1 are out. When
we agree on how the stuff mentioned above should work and have it approved by FESCo/FPC,
I'll start pushing JRuby into F19, but that seems to be far away for now...
Thumbs up if you read the whole mail :)
Bohuslav "Slavek" Kabrda.