{ lib , stdenv , mkShell , rust-channel ? "stable" , rust-bin , rust-toolchain ? rust-bin.${rust-channel}.latest.default.override { extensions = [ "rust-src" "rust-analyzer" "rust-std" ]; } , enableSccache ? true , pkgsBuildBuild # Rust tools , cargo-deny , cargo-insta , cargo-nextest # Commonly used libraries , pkg-config , openssl , zstd , systemdLibs }: mkShell { packages = [ rust-toolchain cargo-deny cargo-insta cargo-nextest pkg-config ]; buildInputs = [ openssl zstd systemdLibs ]; env = { RUST_SRC_PATH = "${rust-toolchain}/lib/rustlib/src/rust/library"; } // (lib.optionalAttrs (enableSccache) { RUSTC_WRAPPER = "${pkgsBuildBuild.sccache}/bin/sccache"; }); # https://hoverbear.org/blog/rust-bindgen-in-nix/ shellHook = let clangArgs = lib.concatStringsSep " " [ "-idirafter ${stdenv.cc.cc}/lib/clang/${lib.getVersion stdenv.cc.cc}/include" ]; gccArgs = lib.concatStringsSep " " [ "-isystem ${stdenv.cc.cc}/include/c++/${lib.getVersion stdenv.cc.cc}" "-isystem ${stdenv.cc.cc}/include/c++/${lib.getVersion stdenv.cc.cc}/${stdenv.hostPlatform.config}" "-idirafter ${stdenv.cc.cc}/lib/gcc/${stdenv.hostPlatform.config}/${lib.getVersion stdenv.cc.cc}/include" ]; in '' export BINDGEN_EXTRA_CLANG_ARGS="${lib.concatStringsSep " " [ "$(< ${stdenv.cc}/nix-support/libc-crt1-cflags)" "$(< ${stdenv.cc}/nix-support/libc-cflags)" "$(< ${stdenv.cc}/nix-support/cc-cflags)" "$(< ${stdenv.cc}/nix-support/libcxx-cxxflags)" "${lib.optionalString stdenv.cc.isClang clangArgs}" "${lib.optionalString stdenv.cc.isGNU gccArgs}" ]}" ''; }