Since version 2.0.0, proc-macro-crate has assumed it can exec()
`env::var("CARGO")` in order to run `cargo locate-project`.
This commit adds a crate override to proc-macro-crate which simply writes the
path to buildPlatform.cargo into the proc-macro-crate sources.
This way we don't need to set `env.CARGO` for every build that depends on
proc-macro-crate -- if we do that, the $CARGO environment variable would be
visible to the entire build. This could potentially lead to incredibly
hard-to-troubleshoot heisenbugs if there is some other crate that expects
`env::var("CARGO")` to exist -- that other crate would mysteriously work only
in projects that use proc-macro-crate but not anywhere else!
This commit is required in order to build Arti (Tor in rust) using crate2nix.
---
pkgs/build-support/rust/default-crate-overrides.nix | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/pkgs/build-support/rust/default-crate-overrides.nix b/pkgs/build-support/rust/default-crate-overrides.nix
index cb0951ce2f39..caa1fb45c6a0 100644
--- a/pkgs/build-support/rust/default-crate-overrides.nix+++ b/pkgs/build-support/rust/default-crate-overrides.nix
@@ -44,6 +44,7 @@
, nixVersions
, boost
, nlohmann_json
+, buildPackages, ...
}:
@@ -324,4 +325,16 @@ in
];
};
+ # Assumes it can run Command::new(env::var("CARGO")).arg("locate-project")+ # https://github.com/bkchr/proc-macro-crate/blame/master/src/lib.rs#L244+ proc-macro-crate = attrs: lib.optionalAttrs (lib.versionAtLeast attrs.version "2.0") {+ prePatch = (attrs.prePatch or "") + ''+ substituteInPlace \+ src/lib.rs \+ --replace-fail \+ 'env::var("CARGO").map_err(|_| Error::CargoEnvVariableNotSet)?' \+ '"${lib.getBin buildPackages.cargo}/bin/cargo"'+ '';+ };+}
2.44.1
Hey,
On Mon, Aug 19, 2024 at 10:57:03AM GMT, Adam Joseph wrote:
>Since version 2.0.0, proc-macro-crate has assumed it can exec()>`env::var("CARGO")` in order to run `cargo locate-project`.>>This commit adds a crate override to proc-macro-crate which simply writes the>path to buildPlatform.cargo into the proc-macro-crate sources.>>This way we don't need to set `env.CARGO` for every build that depends on>proc-macro-crate -- if we do that, the $CARGO environment variable would be>visible to the entire build. This could potentially lead to incredibly>hard-to-troubleshoot heisenbugs if there is some other crate that expects>`env::var("CARGO")` to exist -- that other crate would mysteriously work only>in projects that use proc-macro-crate but not anywhere else!>>This commit is required in order to build Arti (Tor in rust) using crate2nix.
This doesn't apply on my nixpkgs checkout. Can you rebase and re-send,
or maybe point to a repo I can pull it from?
Thanks,
flokli
Sorry about that, will resend.
- a
Quoting Florian Klink (2024-08-22 01:45:43)
> Hey,> > On Mon, Aug 19, 2024 at 10:57:03AM GMT, Adam Joseph wrote:> >Since version 2.0.0, proc-macro-crate has assumed it can exec()> >`env::var("CARGO")` in order to run `cargo locate-project`.> >> >This commit adds a crate override to proc-macro-crate which simply writes the> >path to buildPlatform.cargo into the proc-macro-crate sources.> >> >This way we don't need to set `env.CARGO` for every build that depends on> >proc-macro-crate -- if we do that, the $CARGO environment variable would be> >visible to the entire build. This could potentially lead to incredibly> >hard-to-troubleshoot heisenbugs if there is some other crate that expects> >`env::var("CARGO")` to exist -- that other crate would mysteriously work only> >in projects that use proc-macro-crate but not anywhere else!> >> >This commit is required in order to build Arti (Tor in rust) using crate2nix.> > This doesn't apply on my nixpkgs checkout. Can you rebase and re-send,> or maybe point to a repo I can pull it from?> > Thanks,> flokli