Skip to content
Snippets Groups Projects
flake.nix 3.83 KiB
Newer Older
  • Learn to ignore specific revisions
  • Charles Hall's avatar
    Charles Hall committed
    {
    
        nixpkgs.url = "github:NixOS/nixpkgs?ref=nixos-unstable";
    
        flake-utils.url = "github:numtide/flake-utils";
    
    🥺's avatar
    🥺 committed
        nix-filter.url = "github:numtide/nix-filter";
    
    
        fenix = {
          url = "github:nix-community/fenix";
          inputs.nixpkgs.follows = "nixpkgs";
        };
    
        crane = {
          url = "github:ipetkov/crane";
    
          inputs.nixpkgs.follows = "nixpkgs";
    
      };
    
      outputs =
        { self
        , nixpkgs
        , flake-utils
    
    🥺's avatar
    🥺 committed
        , nix-filter
    
        , crane
    
        }: flake-utils.lib.eachDefaultSystem (system:
        let
    
    Charles Hall's avatar
    Charles Hall committed
          pkgs = import nixpkgs {
            inherit system;
    
            overlays = [
              (final: prev: {
                rocksdb = prev.rocksdb.overrideAttrs (old:
                  let
    
    🥺's avatar
    🥺 committed
                    version = "8.10.0";
    
    Charles Hall's avatar
    Charles Hall committed
                  in
                  {
                    inherit version;
                    src = pkgs.fetchFromGitHub {
                      owner = "facebook";
                      repo = "rocksdb";
                      rev = "v${version}";
    
    🥺's avatar
    🥺 committed
                      hash = "sha256-KGsYDBc1fz/90YYNGwlZ0LUKXYsP1zyhP29TnRQwgjQ=";
    
          # Use mold on Linux
    
    Charles Hall's avatar
    Charles Hall committed
          stdenv = if pkgs.stdenv.isLinux then
            pkgs.stdenvAdapters.useMoldLinker pkgs.stdenv
          else
            pkgs.stdenv;
    
    Charles Hall's avatar
    Charles Hall committed
    
    
          # Nix-accessible `Cargo.toml`
          cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
    
          # The Rust toolchain to use
          toolchain = fenix.packages.${system}.toolchainOf {
            # Use the Rust version defined in `Cargo.toml`
            channel = cargoToml.package.rust-version;
    
            # THE rust-version HASH
    
    🥺's avatar
    🥺 committed
            sha256 = "sha256-SXRtAuO4IqNOQq+nLbrsDFbVk+3aVA8NNpSZsKlVH/8=";
    
    Charles Hall's avatar
    Charles Hall committed
          mkToolchain = fenix.packages.${system}.combine;
    
          buildToolchain = mkToolchain (with toolchain; [
            cargo
            rustc
          ]);
    
          devToolchain = mkToolchain (with toolchain; [
            cargo
            clippy
            rust-src
            rustc
    
            # Always use nightly rustfmt because most of its options are unstable
            fenix.packages.${system}.latest.rustfmt
          ]);
    
          builder =
            ((crane.mkLib pkgs).overrideToolchain buildToolchain).buildPackage;
    
    
          nativeBuildInputs = (with pkgs.rustPlatform; [
            bindgenHook
          ]);
    
    
    Charles Hall's avatar
    Charles Hall committed
          env = {
            ROCKSDB_INCLUDE_DIR = "${pkgs.rocksdb}/include";
            ROCKSDB_LIB_DIR = "${pkgs.rocksdb}/lib";
          };
    
        in
        {
          packages.default = builder {
    
            src = nix-filter {
              root = ./.;
              include = [
                "src"
                "Cargo.toml"
                "Cargo.lock"
              ];
            };
    
            # This is redundant with CI
            doCheck = false;
    
    Charles Hall's avatar
    Charles Hall committed
            inherit
    
    Charles Hall's avatar
    Charles Hall committed
              env
    
              nativeBuildInputs
    
    Charles Hall's avatar
    Charles Hall committed
              stdenv;
    
    
            meta.mainProgram = cargoToml.package.name;
          };
    
          packages.oci-image =
          let
            package = self.packages.${system}.default;
          in
          pkgs.dockerTools.buildImage {
            name = package.pname;
            tag = "latest";
            config = {
              # Use the `tini` init system so that signals (e.g. ctrl+c/SIGINT) are
              # handled as expected
              Entrypoint = [
                "${pkgs.lib.getExe' pkgs.tini "tini"}"
                "--"
              ];
              Cmd = [
                "${pkgs.lib.getExe package}"
              ];
            };
    
    Charles Hall's avatar
    Charles Hall committed
          devShells.default = (pkgs.mkShell.override { inherit stdenv; }) {
    
    Charles Hall's avatar
    Charles Hall committed
            env = env // {
              # Rust Analyzer needs to be able to find the path to default crate
              # sources, and it can read this environment variable to do so. The
              # `rust-src` component is required in order for this to work.
              RUST_SRC_PATH = "${devToolchain}/lib/rustlib/src/rust/library";
            };
    
            # Development tools
    
    Charles Hall's avatar
    Charles Hall committed
            nativeBuildInputs = nativeBuildInputs ++ [
              devToolchain
    
    Charles Hall's avatar
    Charles Hall committed
            ] ++ (with pkgs; [
              engage
            ]);
    
    Charles Hall's avatar
    Charles Hall committed
    }