{ lib , stdenv , mkShell , llvmPackages , 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 , bzip2 , curl , libgit2 , libssh2 , lz4 , openssl , sqlite , systemdLibs , zlib , zstd }: mkShell { packages = [ rust-toolchain cargo-deny cargo-insta cargo-nextest pkg-config ]; buildInputs = [ bzip2 curl libgit2 libssh2 lz4 openssl sqlite systemdLibs zlib zstd ]; env = { RUST_SRC_PATH = "${rust-toolchain}/lib/rustlib/src/rust/library"; LIBCLANG_PATH = "${llvmPackages.libclang}/lib"; } // (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}" ]}" ''; }