about summary refs log tree commit diff
path: root/pkgs/development/interpreters/ruby/libs.nix
blob: 29b15d2222cbb7eb73687eedd51d1dba285727d1 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
{stdenv, fetchurl, writeScript, makeWrapper, rubygems, ruby,
ncurses, xapianBindings, sqlite, libxml2, libxslt, libffi, zlib, libuuid}:

let
  gemsGenerated = (import ./gems-generated.nix) gemsWithVersions;
  patchUsrBinEnv = writeScript "path-usr-bin-env" ''
    #!/bin/sh
    set -x
    echo "==================="
    find "$1" -type f -name "*.rb" | xargs sed -i "s@/usr/bin/env@$(type -p env)@g"
    find "$1" -type f -name "*.mk" | xargs sed -i "s@/usr/bin/env@$(type -p env)@g"
  '';
  patches = {
    sup = {
      buildInputs = [ ncurses xapianBindings gems.ncursesw ];
    };
    sqlite3_ruby = { propagatedBuildInputs = [ sqlite ]; };
    rails = {
      gemFlags = "--no-ri --no-rdoc";
      propagatedBuildInputs = [ gems.mime_types gems.rake ];
    };
    ncurses = { buildInputs = [ ncurses ]; };
    ncursesw = { buildInputs = [ ncurses ]; };
    nokogiri = {
      buildFlags=["--with-xml2-dir=${libxml2} --with-xml2-include=${libxml2}/include/libxml2"
                  "--with-xslt-dir=${libxslt}" ];
    };

    ffi = {
      postUnpack = "onetuh";
      propagatedBuildInputs = [ gems.rake ];
      buildFlags=["--with-ffi-dir=${libffi}"];
      NIX_POST_EXTRACT_FILES_HOOK = patchUsrBinEnv;
    };

    xrefresh_server =
    let patch = fetchurl {
        url = "http://mawercer.de/~nix/xrefresh.diff.gz";
        sha256 = "1f7bnmn1pgkmkml0ms15m5lx880hq2sxy7vsddb3sbzm7n1yyicq";
      };
    in {
      propagatedBuildInputs = [ gems.rb_inotify ];

      # monitor implementation for Linux
      postInstall = ''
        cd $out/${ruby.gemPath}/gems/*
        zcat ${patch} | patch -p 1
      '';
    };

    xapian_full = {
      buildInputs = [ gems.rake zlib libuuid ];
      gemFlags = "--no-rdoc --no-ri";
    };
  };
  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'
        done

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

        runHook postInstall
      '';
    };
  gem = aName: a@{ name, basename, requiredGems, sha256, meta }:
    stdenv.mkDerivation (removeAttrs (stdenv.lib.mergeAttrsByFuncDefaults
      [
        (gemDefaults a)
        (stdenv.lib.maybeAttr name {} patches)
        (stdenv.lib.maybeAttr basename {} patches)
      ]
    ) ["mergeAttrBy"]);
  gemsWithVersions = stdenv.lib.mapAttrs gem gemsGenerated.gems;
  gems = gemsWithVersions // gemsGenerated.aliases;
in
gems