IHaskell/flake.nix
2024-12-29 02:37:38 +11:00

110 lines
4.3 KiB
Nix

{
description = "A Haskell kernel for IPython.";
inputs.nixpkgs24_11.url = "github:NixOS/nixpkgs/release-24.11";
inputs.nixpkgsMaster.url = "github:NixOS/nixpkgs/master";
inputs.flake-utils.url = "github:numtide/flake-utils";
inputs.hls = {
url = "github:haskell/haskell-language-server";
inputs.flake-utils.follows = "flake-utils";
};
inputs.nix-filter.url = "github:numtide/nix-filter";
nixConfig = {
extra-substituters = [ "https://ihaskell.cachix.org" ];
extra-trusted-public-keys = [ "ihaskell.cachix.org-1:WoIvex/Ft/++sjYW3ntqPUL3jDGXIKDpX60pC8d5VLM="];
};
outputs = { self, nixpkgs24_11, nixpkgsMaster, flake-utils, hls, nix-filter, ... }:
flake-utils.lib.eachDefaultSystem (system: let
baseOverlay = _self: _super: { inherit nix-filter; };
pkgsMaster = import nixpkgsMaster { inherit system; overlays = [baseOverlay]; };
jupyterlab = pkgsMaster.python3.withPackages (ps: [ ps.jupyterlab ps.notebook ]);
# Map from GHC version to release function
versions = let
mkVersion = pkgsSrc: compiler: overlays: extraArgs: {
name = compiler;
value = (import pkgsSrc { inherit system; overlays = [baseOverlay] ++ overlays; }).callPackage ./nix/release.nix ({
inherit compiler;
} // extraArgs);
};
in
pkgsMaster.lib.listToAttrs [
(mkVersion nixpkgs24_11 "ghc96" [(import ./nix/overlay-9.6.nix)] {})
(mkVersion nixpkgs24_11 "ghc98" [(import ./nix/overlay-9.8.nix)] {})
(mkVersion nixpkgsMaster "ghc910" [(import ./nix/overlay-9.10.nix)] {})
];
# Helper function for building environments with a given set of packages
mkEnvs = prefix: packages: pkgsMaster.lib.mapAttrs' (version: releaseFn: {
name = prefix + version;
value = (releaseFn {
# Note: this can be changed to other Jupyter systems like jupyter-console
extraEnvironmentBinaries = [ jupyterlab ];
systemPackages = p: with p; [
gnuplot # for the ihaskell-gnuplot runtime
];
inherit packages;
});
}) versions;
# Basic envs with Jupyterlab and IHaskell
envs = mkEnvs "ihaskell-env-" (_: []);
# Envs with Jupyterlab, IHaskell, and all display packages
displayEnvs = mkEnvs "ihaskell-env-display-" (p: with p; map (n: builtins.getAttr n p) (import ./nix/displays.nix));
# Executables only, pulled from passthru on the envs
exes = pkgsMaster.lib.mapAttrs' (envName: env: {
name = builtins.replaceStrings ["-env"] [""] envName;
value = env.ihaskellExe;
}) envs;
devShells = pkgsMaster.lib.mapAttrs' (version: releaseFn: {
name = "ihaskell-dev-" + version;
value = pkgsMaster.callPackage ./nix/mkDevShell.nix {
inherit hls system version;
haskellPackages = (releaseFn {}).haskellPackages;
ihaskellOverlay = (releaseFn {}).ihaskellOverlay;
};
}) versions;
in {
packages = envs // displayEnvs // exes // devShells // rec {
# For easily testing that everything builds
allEnvs = pkgsMaster.linkFarm "ihaskell-envs" envs;
allDisplayEnvs = pkgsMaster.linkFarm "ihaskell-display-envs" displayEnvs;
allExes = pkgsMaster.linkFarm "ihaskell-exes" exes;
allDevShells = pkgsMaster.linkFarm "ihaskell-dev-shells" devShells;
# To use in CI
inherit jupyterlab;
print-nixpkgs-master = pkgsMaster.writeShellScriptBin "print-nixpkgs-master.sh" "echo ${pkgsMaster.path}";
};
# Run the acceptance tests on each env
checks = pkgsMaster.lib.mapAttrs (envName: env:
pkgsMaster.stdenv.mkDerivation {
name = envName + "-check";
src = pkgsMaster.callPackage ./nix/ihaskell-src.nix {};
nativeBuildInputs = with pkgsMaster; [jq bash];
doCheck = true;
checkPhase = ''
mkdir -p home
export HOME=$(pwd)/home
bash ./test/acceptance.nbconvert.sh ${env}/bin/jupyter nbconvert
'';
installPhase = ''
touch $out
'';
}
) envs;
defaultPackage = self.packages.${system}.ihaskell-env-ghc96;
devShell = self.packages.${system}.ihaskell-dev-ghc96;
});
}