{ 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"; }; outputs = { self, nixpkgs, rust-overlay, flake-utils, }: flake-utils.lib.eachDefaultSystem (system: let overlays = [(import rust-overlay)]; pkgs = import nixpkgs {inherit system overlays;}; isLinux = pkgs.lib.hasInfix "linux" system; rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = ["rust-src" "clippy" "rustfmt"]; targets = pkgs.lib.optionals isLinux ["x86_64-unknown-linux-musl"]; }; in { devShells.default = pkgs.mkShell ({ nativeBuildInputs = [ rustToolchain pkgs.pkg-config pkgs.rust-analyzer ] ++ pkgs.lib.optionals isLinux [ # Provide cc (gcc) for building proc-macro / build-script crates # that target the host (x86_64-unknown-linux-gnu). pkgs.gcc # musl-gcc wrapper for the static musl target. pkgs.pkgsMusl.stdenv.cc ]; RUST_BACKTRACE = "1"; } // pkgs.lib.optionalAttrs isLinux { # Tell Cargo which linker to use for each target so it never # falls back to rust-lld (which can't find glibc on NixOS). 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"; # Default build target: static musl binary. CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl"; }); packages.default = if isLinux then (pkgs.pkgsMusl.makeRustPlatform { cargo = rustToolchain; rustc = rustToolchain; }).buildRustPackage { pname = "improvise"; version = "0.1.0"; src = ./.; cargoLock.lockFile = ./Cargo.lock; } else (pkgs.makeRustPlatform { cargo = rustToolchain; rustc = rustToolchain; }).buildRustPackage { pname = "improvise"; version = "0.1.0"; src = ./.; cargoLock.lockFile = ./Cargo.lock; }; }); }