ruby: install ri docs to devdoc output
This allows getting access to Ruby documentation through ri by doing nix-shell -p ruby ruby.devdoc or by installing the ruby.devdoc package. A setup hook will add a shim to LOAD_PATH to point ri to the devdoc output instead of out.
This commit is contained in:
parent
9b39be3376
commit
6ffb5079b2
2 changed files with 47 additions and 2 deletions
|
@ -61,6 +61,8 @@ let
|
||||||
# Have `configure' avoid `/usr/bin/nroff' in non-chroot builds.
|
# Have `configure' avoid `/usr/bin/nroff' in non-chroot builds.
|
||||||
NROFF = if docSupport then "${groff}/bin/nroff" else null;
|
NROFF = if docSupport then "${groff}/bin/nroff" else null;
|
||||||
|
|
||||||
|
outputs = [ "out" ] ++ lib.optional docSupport "devdoc";
|
||||||
|
|
||||||
nativeBuildInputs = [ autoreconfHook bison ]
|
nativeBuildInputs = [ autoreconfHook bison ]
|
||||||
++ (op docSupport groff)
|
++ (op docSupport groff)
|
||||||
++ op (stdenv.buildPlatform != stdenv.hostPlatform) buildPackages.ruby;
|
++ op (stdenv.buildPlatform != stdenv.hostPlatform) buildPackages.ruby;
|
||||||
|
@ -115,6 +117,10 @@ let
|
||||||
++ op (stdenv.hostPlatform != stdenv.buildPlatform)
|
++ op (stdenv.hostPlatform != stdenv.buildPlatform)
|
||||||
"--with-baseruby=${buildRuby}";
|
"--with-baseruby=${buildRuby}";
|
||||||
|
|
||||||
|
preConfigure = opString docSupport ''
|
||||||
|
configureFlagsArray+=("--with-ridir=$devdoc/share/ri")
|
||||||
|
'';
|
||||||
|
|
||||||
# fails with "16993 tests, 2229489 assertions, 105 failures, 14 errors, 89 skips"
|
# fails with "16993 tests, 2229489 assertions, 105 failures, 14 errors, 89 skips"
|
||||||
# mostly TZ- and patch-related tests
|
# mostly TZ- and patch-related tests
|
||||||
# TZ- failures are caused by nix sandboxing, I didn't investigate others
|
# TZ- failures are caused by nix sandboxing, I didn't investigate others
|
||||||
|
@ -144,12 +150,26 @@ let
|
||||||
addGemPath() {
|
addGemPath() {
|
||||||
addToSearchPath GEM_PATH \$1/${passthru.gemPath}
|
addToSearchPath GEM_PATH \$1/${passthru.gemPath}
|
||||||
}
|
}
|
||||||
|
addRubyLibPath() {
|
||||||
|
addToSearchPath RUBYLIB \$1/lib/ruby/site_ruby
|
||||||
|
addToSearchPath RUBYLIB \$1/lib/ruby/site_ruby/${ver.libDir}
|
||||||
|
addToSearchPath RUBYLIB \$1/lib/ruby/site_ruby/${ver.libDir}/${stdenv.targetPlatform.system}
|
||||||
|
}
|
||||||
|
|
||||||
addEnvHooks "$hostOffset" addGemPath
|
addEnvHooks "$hostOffset" addGemPath
|
||||||
|
addEnvHooks "$hostOffset" addRubyLibPath
|
||||||
EOF
|
EOF
|
||||||
'' + opString useRailsExpress ''
|
|
||||||
rbConfig=$(find $out/lib/ruby -name rbconfig.rb)
|
|
||||||
|
|
||||||
|
rbConfig=$(find $out/lib/ruby -name rbconfig.rb)
|
||||||
|
'' + opString docSupport ''
|
||||||
|
# Prevent the docs from being included in the closure
|
||||||
|
sed -i "s|\$(DESTDIR)$devdoc|\$(datarootdir)/\$(RI_BASE_NAME)|" $rbConfig
|
||||||
|
sed -i "s|'--with-ridir=$devdoc/share/ri'||" $rbConfig
|
||||||
|
|
||||||
|
# Add rbconfig shim so ri can find docs
|
||||||
|
mkdir -p $devdoc/lib/ruby/site_ruby
|
||||||
|
cp ${./rbconfig.rb} $devdoc/lib/ruby/site_ruby/rbconfig.rb
|
||||||
|
'' + opString useRailsExpress ''
|
||||||
# Prevent the baseruby from being included in the closure.
|
# Prevent the baseruby from being included in the closure.
|
||||||
sed -i '/^ CONFIG\["BASERUBY"\]/d' $rbConfig
|
sed -i '/^ CONFIG\["BASERUBY"\]/d' $rbConfig
|
||||||
sed -i "s|'--with-baseruby=${baseruby}/bin/ruby'||" $rbConfig
|
sed -i "s|'--with-baseruby=${baseruby}/bin/ruby'||" $rbConfig
|
||||||
|
|
25
pkgs/development/interpreters/ruby/rbconfig.rb
Normal file
25
pkgs/development/interpreters/ruby/rbconfig.rb
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
# This is a shim around whatever real rbconfig.rb is in the LOAD_PATH,
|
||||||
|
# so that RbConfig::CONFIG["ridir"] can be overridden to point to the
|
||||||
|
# custom location of the ri docs, without the main derivation having
|
||||||
|
# those docs in its closure.
|
||||||
|
|
||||||
|
MY_PATH = File.realpath(__FILE__)
|
||||||
|
|
||||||
|
candidates = $LOAD_PATH.map { |dir| File.join(dir, "rbconfig.rb") }
|
||||||
|
|
||||||
|
# First, drop everything _before_ this file in the LOAD_PATH, just on
|
||||||
|
# the off-chance somebody is composing shims like this for some reason.
|
||||||
|
candidates.drop_while { |c| !File.exist?(c) || File.realpath(c) != MY_PATH }
|
||||||
|
|
||||||
|
# Now, the wrapped rbconfig.rb is the next rbconfig.rb in the LOAD_PATH
|
||||||
|
# that isn't this same file. (Yes, duplicate LOAD_PATH entries are a
|
||||||
|
# thing we have to deal with.)
|
||||||
|
next_rbconfig = candidates.find { |c|
|
||||||
|
File.exist?(c) && File.realpath(c) != MY_PATH
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load the wrapped rbconfig.rb
|
||||||
|
require next_rbconfig
|
||||||
|
|
||||||
|
# Now we have RbConfig, and can modify it for our own ends.
|
||||||
|
RbConfig::CONFIG["ridir"] = File.expand_path("../../../share/ri", __dir__)
|
Loading…
Reference in a new issue