IHaskell/release.nix

102 lines
3.7 KiB
Nix
Raw Normal View History

{ 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)}"
${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";
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
'';
}