From 1f0f59d5a1b09d97335234c6cb34653971a53fdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A9clairevoyant?= <848000+eclairevoyant@users.noreply.github.com> Date: Wed, 7 Aug 2024 06:22:32 -0400 Subject: [PATCH 1/5] rustPlatform.fetchCargoTarball: nixfmt --- .../rust/fetch-cargo-tarball/default.nix | 219 ++++++++++-------- 1 file changed, 123 insertions(+), 96 deletions(-) diff --git a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix index adbfe98d8103..a1fa2f074f84 100644 --- a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix +++ b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix @@ -1,116 +1,143 @@ -{ 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: +{ + 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; +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 + buildPhase = '' + runHook preBuild - # Ensure deterministic Cargo vendor builds - export SOURCE_DATE_EPOCH=1 + # 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 + 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 + exit 1 + fi - # Keep the original around for copyLockfile - cp Cargo.lock Cargo.lock.orig + # 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) + 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_HOME/config.toml < $CARGO_CONFIG + cargo vendor $name --respect-source-config | cargo-vendor-normalise > $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 + # 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; + # 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 - ''; + 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 - ''; + # 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; + inherit (hash_) outputHashAlgo outputHash; - impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_CRATES_INDEX" ]; -} // (builtins.removeAttrs args [ - "name" "sha256" "cargoUpdateHook" "nativeBuildInputs" -])) + impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_CRATES_INDEX" ]; + } + // (builtins.removeAttrs args [ + "name" + "sha256" + "cargoUpdateHook" + "nativeBuildInputs" + ]) +) From 3207bc22374806a175923147df90175f1cc89496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A9clairevoyant?= <848000+eclairevoyant@users.noreply.github.com> Date: Wed, 7 Aug 2024 06:59:16 -0400 Subject: [PATCH 2/5] rustPlatform.fetchCargoTarball: support pname, version --- .../rust/fetch-cargo-tarball/default.nix | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix index a1fa2f074f84..c16f3540e6ae 100644 --- a/pkgs/build-support/rust/fetch-cargo-tarball/default.nix +++ b/pkgs/build-support/rust/fetch-cargo-tarball/default.nix @@ -26,7 +26,9 @@ let }; in { - name ? "cargo-deps", + pname ? null, + version ? null, + name ? if args ? pname && args ? version then "${pname}-${version}" else "cargo-deps", src ? null, srcs ? [ ], patches ? [ ], @@ -36,7 +38,23 @@ in ... }@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 { @@ -134,10 +152,5 @@ stdenv.mkDerivation ( impureEnvVars = lib.fetchers.proxyImpureEnvVars ++ [ "NIX_CRATES_INDEX" ]; } - // (builtins.removeAttrs args [ - "name" - "sha256" - "cargoUpdateHook" - "nativeBuildInputs" - ]) + // (removeAttrs args removedArgs) ) From 5c38beb516f8da3a823d94b746dd3bf3c6b9bbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A9clairevoyant?= <848000+eclairevoyant@users.noreply.github.com> Date: Fri, 9 Aug 2024 21:18:50 -0400 Subject: [PATCH 3/5] doc/rust: prefer pname+version over name in fetchCargoTarball --- doc/languages-frameworks/rust.section.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/doc/languages-frameworks/rust.section.md b/doc/languages-frameworks/rust.section.md index 15f16879a5b4..808936f49e60 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="; }; From 558837126b37b17f5bf062404fc1263852ff1626 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A9clairevoyant?= <848000+eclairevoyant@users.noreply.github.com> Date: Wed, 7 Aug 2024 07:00:51 -0400 Subject: [PATCH 4/5] mousai: change name -> pname+version in cargoDeps --- pkgs/by-name/mo/mousai/package.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkgs/by-name/mo/mousai/package.nix b/pkgs/by-name/mo/mousai/package.nix index b67ef0d86452..7bdb7dd7ec2c 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="; }; From e273bc80a5225d08fa20c97fc872a2b1449b8feb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A9clairevoyant?= <848000+eclairevoyant@users.noreply.github.com> Date: Fri, 9 Aug 2024 21:53:11 -0400 Subject: [PATCH 5/5] treewide: remove existing usages of pname+version in fetchCargoTarball This is done because the existing fetchCargoTarball does not support pname or version, resulting in a vendor tarball with the name cargo-deps-vendor.tar.gz. Since adding pname+version support would change the name of the derivation, and therefore its hash, we remove existing usages to avoid treewide breakage. --- pkgs/applications/audio/gnome-podcasts/default.nix | 2 +- pkgs/by-name/ch/chance/package.nix | 2 +- pkgs/by-name/ge/geopard/package.nix | 2 +- pkgs/by-name/ke/key-rack/package.nix | 2 +- pkgs/by-name/su/surrealist/package.nix | 2 +- pkgs/development/libraries/libkrun/default.nix | 2 +- pkgs/development/python-modules/datafusion/default.nix | 2 +- .../python-modules/pdoc-pyo3-sample-library/default.nix | 2 +- pkgs/tools/filesystems/stratisd/default.nix | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pkgs/applications/audio/gnome-podcasts/default.nix b/pkgs/applications/audio/gnome-podcasts/default.nix index f5e53a1c7c66..de7301e5020c 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/by-name/ch/chance/package.nix b/pkgs/by-name/ch/chance/package.nix index 80d50b7eb750..b200b39693f0 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 4562b95d442a..348bd1050042 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 dfe104303b2c..dcb5ac1c82ff 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/su/surrealist/package.nix b/pkgs/by-name/su/surrealist/package.nix index 2efacf5d195f..ae8b0b7c76ef 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 b08232605ce7..fbccbdd37fef 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 1b968fe50007..6343937d0d1e 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 cf53273f73bb..3a653ec5f49a 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 0c837e14cc44..d6f532643d00 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="; };