1{ pkgs, lib, config, ... }: 2 3with lib; 4 5let 6 7 cfg = config.services.ihaskell; 8 ihaskell = pkgs.ihaskell.override { 9 packages = self: cfg.extraPackages self; 10 }; 11 12in 13 14{ 15 options = { 16 services.ihaskell = { 17 enable = mkOption { 18 default = false; 19 example = true; 20 description = "Autostart an IHaskell notebook service."; 21 }; 22 23 haskellPackages = mkOption { 24 default = pkgs.haskellPackages; 25 defaultText = "pkgs.haskellPackages"; 26 example = literalExample "pkgs.haskell.packages.ghc784"; 27 description = '' 28 haskellPackages used to build IHaskell and other packages. 29 This can be used to change the GHC version used to build 30 IHaskell and the packages listed in 31 <varname>extraPackages</varname>. 32 ''; 33 }; 34 35 extraPackages = mkOption { 36 default = self: []; 37 example = literalExample '' 38 haskellPackages: [ 39 haskellPackages.wreq 40 haskellPackages.lens 41 ] 42 ''; 43 description = '' 44 Extra packages available to ghc when running ihaskell. The 45 value must be a function which receives the attrset defined 46 in <varname>haskellPackages</varname> as the sole argument. 47 ''; 48 }; 49 }; 50 }; 51 52 config = mkIf cfg.enable { 53 54 users.extraUsers.ihaskell = { 55 group = config.users.extraGroups.ihaskell.name; 56 description = "IHaskell user"; 57 home = "/var/lib/ihaskell"; 58 createHome = true; 59 uid = config.ids.uids.ihaskell; 60 }; 61 62 users.extraGroups.ihaskell.gid = config.ids.gids.ihaskell; 63 64 systemd.services.ihaskell = { 65 description = "IHaskell notebook instance"; 66 wantedBy = [ "multi-user.target" ]; 67 after = [ "network.target" ]; 68 serviceConfig = { 69 User = config.users.extraUsers.ihaskell.name; 70 Group = config.users.extraGroups.ihaskell.name; 71 ExecStart = "${pkgs.stdenv.shell} -c \"cd $HOME;${ihaskell}/bin/ihaskell-notebook\""; 72 }; 73 }; 74 }; 75}