diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..9ef2c5d --- /dev/null +++ b/default.nix @@ -0,0 +1,22 @@ +{ mkDerivation, base, containers, mtl, multiset, process +, lib, tasty, tasty-hunit +# python package needed at test and run time, undeclared in .cabal file +, paganini-hs, paganini +}: +mkDerivation { + pname = "generic-boltzmann-brain"; + version = "0.1.0.0"; + src = ./.; + libraryHaskellDepends = [ + base containers mtl multiset process tasty tasty-hunit + ]; + testHaskellDepends = [ + base + tasty + tasty-hunit + paganini-hs + paganini + ]; + homepage = "https://github.com/maciej-bendkowski/generic-boltzmann-brain#readme"; + license = lib.licenses.bsd3; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..1a7760b --- /dev/null +++ b/flake.lock @@ -0,0 +1,95 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1605370193, + "narHash": "sha256-YyMTf3URDL/otKdKgtoMChu4vfVL3vCMkRqpGifhUn0=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5021eac20303a61fafe17224c087f5519baed54d", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1676150441, + "narHash": "sha256-Nfeua9Ua/dGHOQpzOjLtkyMyW/ysQCvZJ9Dd74QQSNk=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "6d87734c880d704f6ee13e5c0fe835b98918c34e", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1676060830, + "narHash": "sha256-OZJKL08qbLW2xMPNPTgidbC25MrkllUonoFs/JOX4y8=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "9943fcc75d4e43c3116b408b0f93e682927ffbb4", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "paganini-hs": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1676297967, + "narHash": "sha256-uN0uDqErRwPkmSQd2Guu6b01HldI8n5KAhdjR0ETEew=", + "owner": "maciej-bendkowski", + "repo": "paganini-hs", + "rev": "214013fdc8aa274d2e92d50484bc0f840bf77f18", + "type": "github" + }, + "original": { + "owner": "maciej-bendkowski", + "repo": "paganini-hs", + "rev": "214013fdc8aa274d2e92d50484bc0f840bf77f18", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "paganini-hs": "paganini-hs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..79fd3b1 --- /dev/null +++ b/flake.nix @@ -0,0 +1,108 @@ +{ + description = "Generic Boltzmann Brain"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + paganini-hs.url = "github:maciej-bendkowski/paganini-hs/214013fdc8aa274d2e92d50484bc0f840bf77f18"; + }; + + outputs = + { + self + , nixpkgs + , flake-utils + , paganini-hs + , ... + }@inputs: + flake-utils.lib.eachSystem [ "x86_64-linux" ] (system: + let + + name = "generic-boltzmann-brain"; + compiler = "ghc925"; + + pkgs = import nixpkgs { + inherit system; + config = { + allowUnfree = true; + allowBroken = true; + allowUnsupportedSystem = true; + }; + }; + + optas = p: with p; + ( + buildPythonPackage rec { + pname = "optas"; + version = "1.0.3"; + src = fetchPypi { + inherit pname version; + sha256 = "sha256-92aaW9ZxvRy/dfYhw7IS+lfDAP2UuBuJhNDNTW7Xkzc="; + }; + doCheck = false; + } + ); + + paganini = p: with p; + ( + buildPythonPackage rec { + pname = "paganini"; + version = "1.5.0"; + src = fetchPypi { + inherit pname version; + sha256 = "sha256-hsDqONhBPQlgQHKBh5tdp/pzoXynUz7ztXXILrGgslo="; + }; + doCheck = false; + propagatedBuildInputs = [ + pkgs.python3Packages.numpy + pkgs.python3Packages.sympy + pkgs.python3Packages.scipy + pkgs.python3Packages.networkx + pkgs.python3Packages.cvxpy + (optas p) + ]; + } + ); + + pythonPackages = p: with p; [ + (optas p) + (paganini p) + ]; + + haskellPackages = pkgs.haskell.packages.${compiler}.override { + overrides = self: super: { + "${name}" = (self.callCabal2nix "generic-boltzmann-brain" ./. {}).overrideAttrs( + old: { + nativeBuildInputs = old.nativeBuildInputs ++ [ + (pkgs.python3.withPackages pythonPackages) + ]; + } + ); + + paganini-hs = pkgs.haskell.lib.dontCheck ( + super.callCabal2nix "paganini-hs" paganini-hs {}); + }; + }; + + devShell = haskellPackages.shellFor { + withHoogle = true; # Provides docs, optional. + packages = p: [ + p.generic-boltzmann-brain + ]; + buildInputs = [ + haskellPackages.stack + haskellPackages.haskell-language-server + haskellPackages.hlint + haskellPackages.fourmolu + (pkgs.python3.withPackages pythonPackages) + ]; + }; + + defaultPackage = haskellPackages."${name}"; + derive = import ./.; + + in + { + inherit derive defaultPackage devShell; + }); +}