2017-09-24 17:11:54 +08:00
|
|
|
{ packages ? (_: []), systemPackages ? (_: []), pkgs ? import <nixpkgs> {}, rtsopts ? "-M3g -N2" }:
|
2017-07-10 00:19:17 +08:00
|
|
|
|
|
|
|
let
|
2017-10-02 00:02:16 +08:00
|
|
|
cleanSource = name: type: let
|
|
|
|
baseName = baseNameOf (toString name);
|
|
|
|
lib = pkgs.lib;
|
|
|
|
in !(
|
|
|
|
(type == "directory" &&
|
|
|
|
( baseName == ".git"
|
|
|
|
|| baseName == "dist"
|
|
|
|
|| baseName == ".stack-work"
|
|
|
|
)) ||
|
|
|
|
(type == "symlink" && (lib.hasPrefix "result" baseName)) ||
|
|
|
|
lib.hasSuffix ".hi" baseName ||
|
|
|
|
lib.hasSuffix ".ipynb" baseName ||
|
|
|
|
lib.hasSuffix ".nix" baseName ||
|
|
|
|
lib.hasSuffix ".o" baseName ||
|
|
|
|
lib.hasSuffix ".sock" baseName ||
|
|
|
|
lib.hasSuffix ".yaml" baseName
|
|
|
|
);
|
|
|
|
src = builtins.filterSource cleanSource ./.;
|
2017-07-10 00:19:17 +08:00
|
|
|
displays = self: builtins.listToAttrs (
|
|
|
|
map
|
|
|
|
(display: { name = display; value = self.callCabal2nix display "${src}/ihaskell-display/${display}" {}; })
|
|
|
|
[
|
|
|
|
"ihaskell-aeson"
|
|
|
|
"ihaskell-blaze"
|
|
|
|
"ihaskell-charts"
|
|
|
|
"ihaskell-diagrams"
|
|
|
|
"ihaskell-gnuplot"
|
|
|
|
"ihaskell-hatex"
|
|
|
|
"ihaskell-juicypixels"
|
|
|
|
"ihaskell-magic"
|
|
|
|
"ihaskell-plot"
|
|
|
|
"ihaskell-rlangqq"
|
|
|
|
"ihaskell-static-canvas"
|
|
|
|
"ihaskell-widgets"
|
|
|
|
]);
|
|
|
|
dontCheck = pkgs.haskell.lib.dontCheck;
|
|
|
|
haskellPackages = pkgs.haskellPackages.override {
|
|
|
|
overrides = self: super: {
|
2017-09-04 23:07:18 +08:00
|
|
|
ihaskell = pkgs.haskell.lib.overrideCabal (
|
|
|
|
self.callCabal2nix "ihaskell" src {}) (_drv: {
|
|
|
|
doCheck = false;
|
2017-10-08 00:10:56 +08:00
|
|
|
# Nix-built IHaskell expects to load a *.dyn_o file instead of *.o,
|
|
|
|
# see https://github.com/gibiansky/IHaskell/issues/728
|
|
|
|
postPatch = let
|
|
|
|
original = ''
|
|
|
|
setSessionDynFlags
|
|
|
|
flags'';
|
|
|
|
replacement = ''
|
|
|
|
setSessionDynFlags $ flip gopt_set Opt_BuildDynamicToo
|
|
|
|
flags'';
|
|
|
|
in ''
|
2017-09-04 23:07:18 +08:00
|
|
|
substituteInPlace ./src/IHaskell/Eval/Evaluate.hs --replace \
|
2017-10-08 00:10:56 +08:00
|
|
|
'${original}' '${replacement}'
|
2017-09-04 23:07:18 +08:00
|
|
|
'';
|
|
|
|
});
|
2017-08-18 21:25:51 +08:00
|
|
|
ghc-parser = self.callCabal2nix "ghc-parser" "${src}/ghc-parser" {};
|
|
|
|
ipython-kernel = self.callCabal2nix "ipython-kernel" "${src}/ipython-kernel" {};
|
2017-07-10 00:19:17 +08:00
|
|
|
} // displays self;
|
|
|
|
};
|
|
|
|
ihaskell = haskellPackages.ihaskell;
|
|
|
|
ihaskellEnv = haskellPackages.ghcWithPackages (self: with self; [
|
|
|
|
ihaskell
|
|
|
|
ihaskell-aeson
|
|
|
|
ihaskell-blaze
|
|
|
|
ihaskell-charts
|
|
|
|
ihaskell-diagrams
|
|
|
|
ihaskell-gnuplot
|
|
|
|
ihaskell-hatex
|
|
|
|
ihaskell-juicypixels
|
|
|
|
ihaskell-magic
|
|
|
|
ihaskell-plot
|
|
|
|
# ihaskell-rlangqq
|
|
|
|
ihaskell-static-canvas
|
|
|
|
# ihaskell-widgets
|
|
|
|
] ++ packages self);
|
|
|
|
jupyter = pkgs.python3.buildEnv.override {
|
2017-09-04 21:40:10 +08:00
|
|
|
extraLibs = let ps = pkgs.python3Packages; in [ ps.jupyter ps.notebook ];
|
2017-07-10 00:19:17 +08:00
|
|
|
};
|
|
|
|
ihaskellSh = pkgs.writeScriptBin "ihaskell-notebook" ''
|
|
|
|
#! ${pkgs.stdenv.shell}
|
|
|
|
export GHC_PACKAGE_PATH="$(echo ${ihaskellEnv}/lib/*/package.conf.d| tr ' ' ':'):$GHC_PACKAGE_PATH"
|
|
|
|
export PATH="${pkgs.stdenv.lib.makeBinPath ([ ihaskell ihaskellEnv jupyter ] ++ systemPackages pkgs)}"
|
2017-09-24 17:11:54 +08:00
|
|
|
${ihaskell}/bin/ihaskell install -l $(${ihaskellEnv}/bin/ghc --print-libdir) --use-rtsopts="${rtsopts}" && ${jupyter}/bin/jupyter notebook
|
2017-07-10 00:19:17 +08:00
|
|
|
'';
|
|
|
|
in
|
|
|
|
pkgs.buildEnv {
|
|
|
|
name = "ihaskell-with-packages";
|
2017-10-02 00:45:37 +08:00
|
|
|
buildInputs = [ pkgs.makeWrapper ];
|
2017-07-10 00:19:17 +08:00
|
|
|
paths = [ ihaskellEnv jupyter ];
|
|
|
|
postBuild = ''
|
|
|
|
ln -s ${ihaskellSh}/bin/ihaskell-notebook $out/bin/
|
|
|
|
for prg in $out/bin"/"*;do
|
2017-10-02 00:01:37 +08:00
|
|
|
if [[ -f $prg && -x $prg ]]; then
|
|
|
|
wrapProgram $prg --set PYTHONPATH "$(echo ${jupyter}/lib/*/site-packages)"
|
|
|
|
fi
|
2017-07-10 00:19:17 +08:00
|
|
|
done
|
|
|
|
'';
|
|
|
|
}
|