{ inputs = { opam-repository = { url = "github:ocaml/opam-repository"; flake = false; }; opam-nix.url = "github:tweag/opam-nix"; opam-nix.inputs.opam-repository.follows = "opam-repository"; flake-utils.url = "github:numtide/flake-utils"; nixpkgs.follows = "opam-nix/nixpkgs"; }; outputs = { flake-utils, opam-nix, nixpkgs, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; on = opam-nix.lib.${system}; localPackagesQuery = builtins.mapAttrs (_: pkgs.lib.last) (on.listRepo (on.makeOpamRepo ./.)); devPackagesQuery = { ocaml-lsp-server = "*"; ocamlformat = "*"; }; query = devPackagesQuery // { ocaml-base-compiler = "*"; }; scope = on.buildDuneProject { } "toytt" ./. query; devPackages = builtins.attrValues (pkgs.lib.getAttrs (builtins.attrNames devPackagesQuery) scope); packages = pkgs.lib.getAttrs (builtins.attrNames localPackagesQuery) scope; in { legacyPackages = scope; packages = packages // { default = packages.toytt; }; devShells.default = pkgs.mkShell { inputsFrom = builtins.attrValues packages; buildInputs = devPackages ++ [ # Add additional packages from nixpkgs here ]; }; }); }