From f4aeabd04a6f5c0daffebce808e0ea0301266af0 Mon Sep 17 00:00:00 2001 From: Andreas Rammhold Date: Wed, 11 Dec 2019 22:59:19 +0100 Subject: [PATCH] buildRustCrate: document and cleanup the symbol seeding That code had been in the derivation for a while but no explanation was given why that is needed. It might be helpful to our future selfs to document why things are done the way they are. --- pkgs/build-support/rust/build-rust-crate/default.nix | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkgs/build-support/rust/build-rust-crate/default.nix b/pkgs/build-support/rust/build-rust-crate/default.nix index 67e2106ef98..7cd99324dbc 100644 --- a/pkgs/build-support/rust/build-rust-crate/default.nix +++ b/pkgs/build-support/rust/build-rust-crate/default.nix @@ -93,8 +93,13 @@ stdenv.mkDerivation (rec { libName = if crate ? libName then crate.libName else crate.crateName; libPath = if crate ? libPath then crate.libPath else ""; - depsMetadata = lib.foldl' (str: dep: str + dep.metadata) "" (dependencies ++ buildDependencies); - metadata = lib.substring 0 10 (builtins.hashString "sha256" (crateName + "-" + crateVersion + "___" + toString crateFeatures + "___" + depsMetadata )); + # Seed the symbol hashes with something unique every time. + # https://doc.rust-lang.org/1.0.0/rustc/metadata/loader/index.html#frobbing-symbols + metadata = let + depsMetadata = lib.foldl' (str: dep: str + dep.metadata) "" (dependencies ++ buildDependencies); + hashedMetadata = builtins.hashString "sha256" + (crateName + "-" + crateVersion + "___" + toString crateFeatures + "___" + depsMetadata); + in lib.substring 0 10 hashedMetadata; crateBin = if crate ? crateBin then lib.foldl' (bins: bin: let