{ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; nh.url = "github:viperML/nh"; lix = { url = "https://git.lix.systems/lix-project/lix/archive/main.tar.gz"; flake = false; }; lix-module = { url = "https://git.lix.systems/lix-project/nixos-module/archive/main.tar.gz"; inputs.nixpkgs.follows = "nixpkgs"; inputs.lix.follows = "lix"; }; }; outputs = inputs@{ self, nixpkgs, flake-utils, ... }: let lix-overlay = inputs.lix-module.overlays.default; lix-module = inputs.lix-module.nixosModules.default; nh-overlay = inputs.nh.overlays.default; version = builtins.toString self.lastModified; in flake-utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; overlays = [ lix-overlay nh-overlay ]; modules = [ lix-module ]; }; minimal = let inherit (pkgs.ocamlPackages) dune_3 ocaml ; in [ dune_3 ocaml ]; dev = let inherit (pkgs.ocamlPackages) utop ocaml-lsp ocamlformat ocamlformat-rpc-lib ; in [ utop ocaml-lsp ocamlformat ocamlformat-rpc-lib ]; inherit (pkgs) lix nh; in { devShells.default = let inherit (pkgs) mkShell; in mkShell { buildInputs = minimal ++ dev ++ [ lix nh ]; shellHook = let justFile = '' default: @just --list @build: nix build .#debug --offline @release: nix build --offline @test: printf "\\n\\n\\t************ running nix+dune tests ************\\n\\n\\n" nix flake check --offline @push: git commit -a git push ''; in '' printf '${justFile}' > justfile ''; }; packages.default = pkgs.callPackage ./nix/default.nix { ocaml-deps = minimal; inherit version; }; defaultPackage = self.packages.${system}.default; } ) // { nixosModules.meat = import ./nix/module.nix { meatOverlays = [ nh-overlay self.overlays.meat ]; lixModule = lix-module; }; overlays.meat = final: prev: let ocaml-deps = let inherit (final.ocamlPackages) dune_3 ocaml ; in [ dune_3 ocaml ]; in { meat = final.callPackage ./nix/default.nix { inherit ocaml-deps version; }; }; }; }