{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs"; opam-nix.url = "github:tweag/opam-nix"; flake-utils.url = "github:numtide/flake-utils"; nixpkgs.follows = "opam-nix/nixpkgs"; }; outputs = { self, flake-utils, opam-nix, nixpkgs }: let package = "stitch"; in flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; on = opam-nix.lib.${system}; devPackagesQuery = { # You can add "development" packages here. They will get added to the devShell automatically. ocaml-lsp-server = "*"; ocamlformat = "*"; ocamlfind = "*"; utop = "*"; odoc = "*"; }; query = devPackagesQuery // { ## You can force versions of certain packages here, e.g: ## - force the ocaml compiler to be taken from opam-repository: ocaml-base-compiler = "*"; ## - or force the compiler to be taken from nixpkgs and be a certain version: # ocaml-system = "4.14.0"; ## - or force ocamlfind to be a certain version: }; scope = on.buildOpamProject' { } ./. query; overlay = final: prev: { # You can add overrides here ${package} = prev.${package}.overrideAttrs (_: { # Prevent the ocaml dependencies from leaking into dependent environments doNixSupport = false; buildInputs = [ pkgs."gmp" pkgs."libev" pkgs."openssl" pkgs."libargon2" ]; DUNE_PROFILE = "release"; }); }; scope' = scope.overrideScope' overlay; # The main package containing the executable main = scope'.${package}; # Packages from devPackagesQuery devPackages = builtins.attrValues (pkgs.lib.getAttrs (builtins.attrNames devPackagesQuery) scope'); in { legacyPackages = scope'; packages.default = main; apps.stitch.default = { type = "app"; program = "${main}/bin/stitch"; }; devShells.default = pkgs.mkShell { inputsFrom = [ main ]; buildInputs = devPackages; }; }); }