about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2019-05-06 00:38:52 +0200
committerAlyssa Ross <hi@alyssa.is>2019-06-18 16:09:28 +0000
commitb81026455e228038631eeaf4e9c1ecc792f54c5c (patch)
treed0fc6982279fb62b06c97143ba87daa22254646b
parentee0c3e4f167715c3d3a5073523711252a6f1426f (diff)
downloadnixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.tar
nixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.tar.gz
nixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.tar.bz2
nixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.tar.lz
nixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.tar.xz
nixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.tar.zst
nixlib-b81026455e228038631eeaf4e9c1ecc792f54c5c.zip
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.
-rw-r--r--nixpkgs/pkgs/development/interpreters/ruby/default.nix22
-rw-r--r--nixpkgs/pkgs/development/interpreters/ruby/rbconfig.rb25
2 files changed, 46 insertions, 1 deletions
diff --git a/nixpkgs/pkgs/development/interpreters/ruby/default.nix b/nixpkgs/pkgs/development/interpreters/ruby/default.nix
index ad117054632a..10b7ea7d8a90 100644
--- a/nixpkgs/pkgs/development/interpreters/ruby/default.nix
+++ b/nixpkgs/pkgs/development/interpreters/ruby/default.nix
@@ -63,6 +63,8 @@ let
         # Have `configure' avoid `/usr/bin/nroff' in non-chroot builds.
         NROFF = if docSupport then "${groff}/bin/nroff" else null;
 
+        outputs = [ "out" ] ++ lib.optional docSupport "devdoc";
+
         nativeBuildInputs = [ autoreconfHook bison ]
           ++ (op docSupport groff)
           ++ op (stdenv.buildPlatform != stdenv.hostPlatform) buildPackages.ruby;
@@ -126,6 +128,10 @@ let
           ++ op (stdenv.hostPlatform != stdenv.buildPlatform)
              "--with-baseruby=${buildRuby}";
 
+        preConfigure = opString docSupport ''
+          configureFlagsArray+=("--with-ridir=$devdoc/share/ri")
+        '';
+
         # fails with "16993 tests, 2229489 assertions, 105 failures, 14 errors, 89 skips"
         # mostly TZ- and patch-related tests
         # TZ- failures are caused by nix sandboxing, I didn't investigate others
@@ -155,12 +161,26 @@ let
           addGemPath() {
             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" addRubyLibPath
           EOF
-        '' + opString useRailsExpress ''
+
           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.
           sed -i '/^  CONFIG\["BASERUBY"\]/d' $rbConfig
           sed -i "s|'--with-baseruby=${baseruby}/bin/ruby'||" $rbConfig
diff --git a/nixpkgs/pkgs/development/interpreters/ruby/rbconfig.rb b/nixpkgs/pkgs/development/interpreters/ruby/rbconfig.rb
new file mode 100644
index 000000000000..eeba930b54b7
--- /dev/null
+++ b/nixpkgs/pkgs/development/interpreters/ruby/rbconfig.rb
@@ -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__)