# Dependencies (keep sorted) { craneLib , inputs , jq , lib , pkgsBuildHost , rocksdb , rust , snappy , stdenv # Options (keep sorted) , default-features ? true , features ? [] , profile ? "release" , version-extra ? inputs.self.shortRev or inputs.self.dirtyShortRev or null, }: let cargoManifest = lib.importTOML "${inputs.self}/Cargo.toml"; buildDepsOnlyEnv = { NIX_OUTPATH_USED_AS_RANDOM_SEED = "randomseed"; CARGO_PROFILE = profile; ROCKSDB_INCLUDE_DIR = "${rocksdb}/include"; ROCKSDB_LIB_DIR = "${rocksdb}/lib"; } // (import ./cross-compilation-env.nix { # Keep sorted inherit lib pkgsBuildHost rust snappy stdenv; }); buildPackageEnv = (lib.optionalAttrs (version-extra != null) { GRAPEVINE_VERSION_EXTRA = version-extra; }) // buildDepsOnlyEnv; commonAttrs = { # Reading from cargoManifest directly instead of using # createNameFromCargoToml to avoid IFD pname = cargoManifest.package.name; version = cargoManifest.package.version; src = let filter = inputs.nix-filter.lib; in filter { root = inputs.self; # Keep sorted include = [ ".cargo/config.toml" "Cargo.lock" "Cargo.toml" "src" ]; }; dontStrip = profile != "release"; nativeBuildInputs = [ # bindgen needs the build platform's libclang. Apparently due to "splicing # weirdness", pkgs.rustPlatform.bindgenHook on its own doesn't quite do the # right thing here. pkgsBuildHost.rustPlatform.bindgenHook # We don't actually depend on `jq`, but crane's `buildPackage` does, but # its `buildDepsOnly` doesn't. This causes those two derivations to have # differing values for `NIX_CFLAGS_COMPILE`, which contributes to spurious # rebuilds of bindgen and its depedents. jq ]; # Opt out of crane's automagic cross support doIncludeCrossToolchainEnv = false; # This is redundant with CI doCheck = false; }; in craneLib.buildPackage (commonAttrs // { cargoArtifacts = craneLib.buildDepsOnly (commonAttrs // { env = buildDepsOnlyEnv; }); cargoExtraArgs = "--locked " + lib.optionalString (!default-features) "--no-default-features " + lib.optionalString (features != []) "--features " + (builtins.concatStringsSep "," features); env = buildPackageEnv; passthru = { env = buildPackageEnv; }; meta.mainProgram = commonAttrs.pname; })