haccfiles/pkgs/wink/default.nix

97 lines
2.6 KiB
Nix
Raw Normal View History

# high-level notes:
# - wink uses the execjs gem, which needs some javascript runtime
# to be available. Wink usually uses the mini_racer gem for this,
# which unfortunately refuses to work on nix, so instead we have
# to patch it out of wink's dependencies and replace it with
# something else
# - execjs actually just takes any compatible js runtime it can find;
# this packages uses v8 by default, but you can easily override it
# with e.g. nodejs and wink should still work.
{ stdenv
, bundlerEnv
, fetchFromGitHub
, zlib
, sqlite
, ruby
, makeWrapper
# v8 may be replaced with e.g. nodejs — see docs for execjs for a list
# of accaptable backends, all of which should all work out of the box
, v8
, ... }:
let
sources-patched = stdenv.mkDerivation {
name = "wink-sources-patched";
# wink sources from the c3VOC
src = fetchFromGitHub {
owner = "voc";
repo = "wink";
rev = "9f1d312b7bf6457fc23aaa9348a43c3900046a6c";
sha256 = "1xyb4n4ys93mzyj779mdd6ngiials38xfql3ivddxc1l5rk11hbi";
};
phases = [ "patchPhase" "installPhase" ];
# remove mini_racer and libv8 (its sole dependency) from wink's deps
patchPhase = ''
cp -r $src/* .
sed -i "s/gem 'mini_racer', platforms: :ruby/#removed mini_racer/g" Gemfile
sed -i "s/mini_racer (0.2.0)/ /g" Gemfile.lock
sed -i "s/libv8 (>= 6.3)/ /g" Gemfile.lock
'';
installPhase = ''
mkdir -p $out
cp -r * $out/
'';
};
# use the patched dependencies to generate derivations for all the
# ruby dependencies (using a `gemset.nix` generated with bundix)
gems = bundlerEnv {
name = "wink-gems";
inherit ruby;
gemConfig = {
nokogiri = attrs: {
buildInputs = [ zlib ];
};
sqlite3 = attr: {
buildInputs = [ sqlite ];
};
};
gemfile = sources-patched.outPath + "/Gemfile";
lockfile = sources-patched.outPath + "/Gemfile.lock";
# Open question: we could generate this dynamically, would that be
# a good idea?
gemset = ./gemset.nix;
};
in
stdenv.mkDerivation {
name = "wink-without-wrapping";
src = sources-patched.outPath;
buildInputs = [
gems
ruby
makeWrapper
v8
];
# need to wrap the executables so ruby can find its gems
installPhase =
let gempath = "${gems.outPath}/lib/ruby/gems/2.6.0";
in ''
mkdir -p $out
cp -r * $out
makeWrapper $out/bin/rails $out/bin/rails-wrapped --set GEM_PATH ${gempath}
makeWrapper $out/bin/rake $out/bin/rake-wrapped --set GEM_PATH ${gempath}
'';
}