summary refs log tree commit diff
path: root/pkgs/development/interpreters/ruby/gem.nix
blob: b4ddd26bb46bcd06ae8a9c35de6952fedaf4d546 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{stdenv, fetchurl, ruby, rubygems, makeWrapper, patches, overrides}:

let
  gemDefaults = { name, basename, requiredGems, sha256, meta }:
  {
    buildInputs = [rubygems ruby makeWrapper];
    unpackPhase = ":";
    configurePhase=":";
    bulidPhase=":";

    src = fetchurl {
      url = "http://rubygems.org/downloads/${name}.gem";
      inherit sha256;
    };

    name = "ruby-${name}";

    propagatedBuildInputs = requiredGems;
    inherit meta;

    installPhase = ''
      export HOME=$TMP/home; mkdir -pv "$HOME"

      gem install -V --ignore-dependencies \
      -i "$out/${ruby.gemPath}" -n "$out/bin" "$src" $gemFlags -- $buildFlags
      rm -frv $out/${ruby.gemPath}/cache # don't keep the .gem file here

      addToSearchPath GEM_PATH $out/${ruby.gemPath}

      for prog in $out/bin/*; do
        wrapProgram "$prog" \
          --prefix GEM_PATH : "$GEM_PATH" \
          --prefix RUBYLIB : "${rubygems}/lib" \
          --set RUBYOPT rubygems \
          $extraWrapperFlags ''${extraWrapperFlagsArray[@]}
      done

      for prog in $out/gems/*/bin/*; do
        [[ -e "$out/bin/$(basename $prog)" ]]
      done

      runHook postInstall
    '';

    propagatedUserEnvPkgs = requiredGems;

    passthru.isRubyGem = true;

  };
  mb = stdenv.lib.maybeAttr;
  patchedGem = a: stdenv.mkDerivation (removeAttrs (stdenv.lib.mergeAttrsByFuncDefaults
      ([ (gemDefaults a) ]
      ++ (stdenv.lib.concatMap (p: [(mb a.basename {} p) (mb a.name {} p)] )
      patches)))
    [ "mergeAttrBy" ]);
in
aName: a@{ name, basename, requiredGems, sha256, meta }:
  stdenv.lib.foldl (d: o: mb name (mb basename d o) o) (patchedGem a) overrides