{ description = "Improvise — Multi-Dimensional Data Modeling Terminal Application"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; rust-overlay = { url = "github:oxalica/rust-overlay"; }; flake-utils.url = "github:numtide/flake-utils"; crate2nix.url = "github:nix-community/crate2nix"; }; outputs = { self, nixpkgs, rust-overlay, flake-utils, crate2nix, }: flake-utils.lib.eachDefaultSystem (system: let overlays = [(import rust-overlay)]; pkgs = import nixpkgs {inherit system overlays;}; isLinux = pkgs.lib.hasInfix "linux" system; buildPkgs = if isLinux then pkgs.pkgsMusl else pkgs; rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = ["rust-src" "clippy" "rustfmt"]; targets = pkgs.lib.optionals isLinux ["x86_64-unknown-linux-musl"]; }; generatedCargoNix = crate2nix.tools.${system}.generatedCargoNix { name = "improvise"; src = ./.; }; musliTarget = "x86_64-unknown-linux-musl"; cargoNix = import generatedCargoNix { pkgs = pkgs; }; in { devShells.default = pkgs.mkShell ({ nativeBuildInputs = [ rustToolchain pkgs.pkg-config pkgs.rust-analyzer crate2nix.packages.${system}.default ] ++ pkgs.lib.optionals isLinux [ pkgs.gcc pkgs.pkgsMusl.stdenv.cc ]; RUST_BACKTRACE = "1"; } // pkgs.lib.optionalAttrs isLinux { CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER = "${pkgs.gcc}/bin/gcc"; CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER = "${pkgs.pkgsMusl.stdenv.cc}/bin/cc"; CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl"; }); packages.default = cargoNix.rootCrate.build; }); }