Commit bbb42450 authored by Adam Joseph's avatar Adam Joseph Committed by Florian Klink
Browse files

default-crate-overrides: proc-macro-crate assumes env::var("CARGO")

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!
parent ab682c47
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@
, udev
, webkitgtk_4_1
, zlib
, buildPackages
, ...
}:

@@ -357,4 +358,15 @@ in
    buildInputs = [ atk ];
  };

  # 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"'
    '';
  };
}