diff --git a/doc/languages-frameworks/rust.section.md b/doc/languages-frameworks/rust.section.md index 15f16879a5b4d..808936f49e60c 100644 --- a/doc/languages-frameworks/rust.section.md +++ b/doc/languages-frameworks/rust.section.md @@ -567,8 +567,7 @@ buildPythonPackage rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit src sourceRoot; - name = "${pname}-${version}"; + inherit pname version src sourceRoot; hash = "sha256-miW//pnOmww2i6SOGbkrAIdc/JMDT4FJLqdMFojZeoY="; }; @@ -611,9 +610,8 @@ buildPythonPackage rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit src; + inherit pname version src; sourceRoot = "${pname}-${version}/${cargoRoot}"; - name = "${pname}-${version}"; hash = "sha256-PS562W4L1NimqDV2H0jl5vYhL08H9est/pbIxSdYVfo="; }; @@ -652,8 +650,7 @@ buildPythonPackage rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit src; - name = "${pname}-${version}"; + inherit pname version src; hash = "sha256-heOBK8qi2nuc/Ib+I/vLzZ1fUUD/G/KTw9d7M4Hz5O0="; }; @@ -697,8 +694,7 @@ stdenv.mkDerivation rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit src; - name = "${pname}-${version}"; + inherit pname version src; hash = "sha256-8fa3fa+sFi5H+49B5sr2vYPkp9C9s6CcE0zv4xB8gww="; }; diff --git a/pkgs/applications/audio/gnome-podcasts/default.nix b/pkgs/applications/audio/gnome-podcasts/default.nix index f5e53a1c7c66a..de7301e5020cb 100644 --- a/pkgs/applications/audio/gnome-podcasts/default.nix +++ b/pkgs/applications/audio/gnome-podcasts/default.nix @@ -34,7 +34,7 @@ stdenv.mkDerivation rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit pname version src; + inherit src; hash = "sha256-XTfKqKs7874ak7Lzscxw8E2qcnJOWMZaaol8TpIB6Vw="; }; diff --git a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix index adbfe98d81039..c16f3540e6ae2 100644 --- a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix +++ b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix @@ -1,116 +1,156 @@ -{ lib, stdenv, cacert, git, cargo, python3 }: -let cargo-vendor-normalise = stdenv.mkDerivation { - name = "cargo-vendor-normalise"; - src = ./cargo-vendor-normalise.py; - nativeBuildInputs = [ python3.pkgs.wrapPython ]; - dontUnpack = true; - installPhase = "install -D $src $out/bin/cargo-vendor-normalise"; - pythonPath = [ python3.pkgs.toml ]; - postFixup = "wrapPythonPrograms"; - doInstallCheck = true; - installCheckPhase = '' - # check that ../fetchcargo-default-config.toml is a fix point - reference=${../fetchcargo-default-config.toml} - < $reference $out/bin/cargo-vendor-normalise > test; - cmp test $reference - ''; - preferLocalBuild = true; -}; +{ + lib, + stdenv, + cacert, + git, + cargo, + python3, +}: +let + cargo-vendor-normalise = stdenv.mkDerivation { + name = "cargo-vendor-normalise"; + src = ./cargo-vendor-normalise.py; + nativeBuildInputs = [ python3.pkgs.wrapPython ]; + dontUnpack = true; + installPhase = "install -D $src $out/bin/cargo-vendor-normalise"; + pythonPath = [ python3.pkgs.toml ]; + postFixup = "wrapPythonPrograms"; + doInstallCheck = true; + installCheckPhase = '' + # check that ../fetchcargo-default-config.toml is a fix point + reference=${../fetchcargo-default-config.toml} + < $reference $out/bin/cargo-vendor-normalise > test; + cmp test $reference + ''; + preferLocalBuild = true; + }; in -{ name ? "cargo-deps" -, src ? null -, srcs ? [] -, patches ? [] -, sourceRoot ? "" -, cargoUpdateHook ? "" -, nativeBuildInputs ? [] -, ... -} @ args: - -let hash_ = - if args ? hash then - { - outputHashAlgo = if args.hash == "" then "sha256" else null; - outputHash = args.hash; - } - else if args ? sha256 then { outputHashAlgo = "sha256"; outputHash = args.sha256; } - else throw "fetchCargoTarball requires a hash for ${name}"; -in stdenv.mkDerivation ({ - name = "${name}-vendor.tar.gz"; - nativeBuildInputs = [ cacert git cargo-vendor-normalise cargo ] ++ nativeBuildInputs; - - buildPhase = '' - runHook preBuild - - # Ensure deterministic Cargo vendor builds - export SOURCE_DATE_EPOCH=1 - - if [[ ! -f Cargo.lock ]]; then - echo - echo "ERROR: The Cargo.lock file doesn't exist" - echo - echo "Cargo.lock is needed to make sure that cargoHash/cargoSha256 doesn't change" - echo "when the registry is updated." - echo - - exit 1 - fi - - # Keep the original around for copyLockfile - cp Cargo.lock Cargo.lock.orig - - export CARGO_HOME=$(mktemp -d cargo-home.XXX) - CARGO_CONFIG=$(mktemp cargo-config.XXXX) - - if [[ -n "$NIX_CRATES_INDEX" ]]; then - cat >$CARGO_HOME/config.toml < $CARGO_CONFIG - - # Create an empty vendor directory when there is no dependency to vendor - mkdir -p $name - # Add the Cargo.lock to allow hash invalidation - cp Cargo.lock.orig $name/Cargo.lock - - # Packages with git dependencies generate non-default cargo configs, so - # always install it rather than trying to write a standard default template. - install -D $CARGO_CONFIG $name/.cargo/config; - - runHook postBuild - ''; - - # Build a reproducible tar, per instructions at https://reproducible-builds.org/docs/archives/ - installPhase = '' - tar --owner=0 --group=0 --numeric-owner --format=gnu \ - --sort=name --mtime="@$SOURCE_DATE_EPOCH" \ - -czf $out $name - ''; - - inherit (hash_) outputHashAlgo outputHash; - - impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_CRATES_INDEX" ]; -} // (builtins.removeAttrs args [ - "name" "sha256" "cargoUpdateHook" "nativeBuildInputs" -])) +{ + pname ? null, + version ? null, + name ? if args ? pname && args ? version then "${pname}-${version}" else "cargo-deps", + src ? null, + srcs ? [ ], + patches ? [ ], + sourceRoot ? "", + cargoUpdateHook ? "", + nativeBuildInputs ? [ ], + ... +}@args: + +assert lib.assertMsg ( + (args ? pname || args ? version) -> !(args ? name) +) "Either specify `pname` with `version`, or specify `name` only, not a mix of both."; +assert lib.assertMsg ( + args ? pname == args ? version +) "If `pname` is specified, `version` must be also, and vice versa."; +let + # args to remove from the final call to stdenv.mkDerivation, as we've already handled them + removedArgs = [ + "name" + "pname" + "version" + "sha256" + "cargoUpdateHook" + "nativeBuildInputs" + ]; + + hash_ = + if args ? hash then + { + outputHashAlgo = if args.hash == "" then "sha256" else null; + outputHash = args.hash; + } + else if args ? sha256 then + { + outputHashAlgo = "sha256"; + outputHash = args.sha256; + } + else + throw "fetchCargoTarball requires a hash for ${name}"; +in +stdenv.mkDerivation ( + { + name = "${name}-vendor.tar.gz"; + nativeBuildInputs = [ + cacert + git + cargo-vendor-normalise + cargo + ] ++ nativeBuildInputs; + + buildPhase = '' + runHook preBuild + + # Ensure deterministic Cargo vendor builds + export SOURCE_DATE_EPOCH=1 + + if [[ ! -f Cargo.lock ]]; then + echo + echo "ERROR: The Cargo.lock file doesn't exist" + echo + echo "Cargo.lock is needed to make sure that cargoHash/cargoSha256 doesn't change" + echo "when the registry is updated." + echo + + exit 1 + fi + + # Keep the original around for copyLockfile + cp Cargo.lock Cargo.lock.orig + + export CARGO_HOME=$(mktemp -d cargo-home.XXX) + CARGO_CONFIG=$(mktemp cargo-config.XXXX) + + if [[ -n "$NIX_CRATES_INDEX" ]]; then + cat >$CARGO_HOME/config.toml < $CARGO_CONFIG + + # Create an empty vendor directory when there is no dependency to vendor + mkdir -p $name + # Add the Cargo.lock to allow hash invalidation + cp Cargo.lock.orig $name/Cargo.lock + + # Packages with git dependencies generate non-default cargo configs, so + # always install it rather than trying to write a standard default template. + install -D $CARGO_CONFIG $name/.cargo/config; + + runHook postBuild + ''; + + # Build a reproducible tar, per instructions at https://reproducible-builds.org/docs/archives/ + installPhase = '' + tar --owner=0 --group=0 --numeric-owner --format=gnu \ + --sort=name --mtime="@$SOURCE_DATE_EPOCH" \ + -czf $out $name + ''; + + inherit (hash_) outputHashAlgo outputHash; + + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_CRATES_INDEX" ]; + } + // (removeAttrs args removedArgs) +) diff --git a/pkgs/by-name/ch/chance/package.nix b/pkgs/by-name/ch/chance/package.nix index 80d50b7eb7501..b200b39693f0c 100644 --- a/pkgs/by-name/ch/chance/package.nix +++ b/pkgs/by-name/ch/chance/package.nix @@ -26,7 +26,7 @@ stdenv.mkDerivation (finalAttrs: { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit (finalAttrs) pname version src; + inherit (finalAttrs) src; hash = "sha256-Q4CfDQxlhspjg7Et+0zHwZ/iSnp0CnwwpW/gT7htlL8="; }; diff --git a/pkgs/by-name/ge/geopard/package.nix b/pkgs/by-name/ge/geopard/package.nix index 4562b95d442a9..348bd10500428 100644 --- a/pkgs/by-name/ge/geopard/package.nix +++ b/pkgs/by-name/ge/geopard/package.nix @@ -26,7 +26,7 @@ stdenv.mkDerivation (finalAttrs: { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit (finalAttrs) pname version src; + inherit (finalAttrs) src; hash = "sha256-YVbaXGGwQaqjUkA47ryW1VgJpZTx5ApRGdCcB5aA71M="; }; diff --git a/pkgs/by-name/ke/key-rack/package.nix b/pkgs/by-name/ke/key-rack/package.nix index dfe104303b2c8..dcb5ac1c82ff9 100644 --- a/pkgs/by-name/ke/key-rack/package.nix +++ b/pkgs/by-name/ke/key-rack/package.nix @@ -32,7 +32,7 @@ stdenv.mkDerivation (finalAttrs: { ''; cargoDeps = rustPlatform.fetchCargoTarball { - inherit (finalAttrs) pname version src; + inherit (finalAttrs) src; hash = "sha256-wCJTm0W+g3+O1t1fR4maqJoxpPM0NeJG7d54MMAH33c="; }; diff --git a/pkgs/by-name/mo/mousai/package.nix b/pkgs/by-name/mo/mousai/package.nix index b67ef0d86452d..7bdb7dd7ec2ca 100644 --- a/pkgs/by-name/mo/mousai/package.nix +++ b/pkgs/by-name/mo/mousai/package.nix @@ -32,8 +32,7 @@ stdenv.mkDerivation rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit src; - name = "${pname}-${version}"; + inherit pname version src; hash = "sha256-FjnRI1vHA9YF/Uw2+hDtMJmeJVa5RcxaYoG4XgXa9Ds="; }; diff --git a/pkgs/by-name/su/surrealist/package.nix b/pkgs/by-name/su/surrealist/package.nix index 2efacf5d195ff..ae8b0b7c76ef1 100644 --- a/pkgs/by-name/su/surrealist/package.nix +++ b/pkgs/by-name/su/surrealist/package.nix @@ -111,7 +111,7 @@ in stdenv.mkDerivation (finalAttrs: { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit (finalAttrs) patches src sourceRoot version; + inherit (finalAttrs) patches src sourceRoot; name = "${finalAttrs.pname}-${finalAttrs.version}"; hash = "sha256-LtQS0kH+2P4odV7BJYiH6T51+iZHAM9W9mV96rNfNWs="; }; diff --git a/pkgs/development/libraries/libkrun/default.nix b/pkgs/development/libraries/libkrun/default.nix index b08232605ce79..fbccbdd37fef5 100644 --- a/pkgs/development/libraries/libkrun/default.nix +++ b/pkgs/development/libraries/libkrun/default.nix @@ -33,7 +33,7 @@ stdenv.mkDerivation (finalAttrs: { outputs = [ "out" "dev" ]; cargoDeps = rustPlatform.fetchCargoTarball { - inherit (finalAttrs) pname version src; + inherit (finalAttrs) src; hash = "sha256-33s62iOWYh1a8ETY/fbPRxvnj8dR4/UfG8mjFyWwz5k="; }; diff --git a/pkgs/development/python-modules/datafusion/default.nix b/pkgs/development/python-modules/datafusion/default.nix index 1b968fe500074..6343937d0d1ec 100644 --- a/pkgs/development/python-modules/datafusion/default.nix +++ b/pkgs/development/python-modules/datafusion/default.nix @@ -46,7 +46,7 @@ buildPythonPackage rec { cargoDeps = rustPlatform.fetchCargoTarball { name = "datafusion-cargo-deps"; - inherit src pname version; + inherit src; hash = "sha256-M2ZNAFWdsnN9C4+YbqFxZVH9fHR10Bimf1Xzrd9oy9E="; }; diff --git a/pkgs/development/python-modules/pdoc-pyo3-sample-library/default.nix b/pkgs/development/python-modules/pdoc-pyo3-sample-library/default.nix index cf53273f73bbd..3a653ec5f49ab 100644 --- a/pkgs/development/python-modules/pdoc-pyo3-sample-library/default.nix +++ b/pkgs/development/python-modules/pdoc-pyo3-sample-library/default.nix @@ -21,7 +21,7 @@ buildPythonPackage rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit pname version src; + inherit src; hash = "sha256-KrEBr998AV/bKcIoq0tX72/QwPD9bQplrS0Zw+JiSMQ="; }; diff --git a/pkgs/tools/filesystems/stratisd/default.nix b/pkgs/tools/filesystems/stratisd/default.nix index 0c837e14cc448..d6f532643d00f 100644 --- a/pkgs/tools/filesystems/stratisd/default.nix +++ b/pkgs/tools/filesystems/stratisd/default.nix @@ -37,7 +37,7 @@ stdenv.mkDerivation rec { }; cargoDeps = rustPlatform.fetchCargoTarball { - inherit pname version src; + inherit src; hash = "sha256-1KzOKo5Q1uBqO3aCBYUJJxla4873AzrwoFPaNpKKFJU="; };