# 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} ''; }