From 4aa036f15aa55e788eda633805d8397274d6c052 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Sat, 8 Apr 2023 17:29:06 -0700 Subject: [PATCH] rav1e: fix cross `cargo cbuild` needs to have the `C{C,XX}_FOR_{${platform}}` variables set just like `cargo` since it is basically a wrapper around cargo. Without these variables, it will try to use the `hostPlatform` C compiler to compile `build.rs` scripts, and will pass flags to that compiler which only make sense on the `buildPlatform`. So it's just doomed without the environment variables. Right now it looks like `rav1e` is the only package we have that is using `cargo-c`, but if that changes in the future we should factor this out as its own hook, like `maturinBuildHook` and the others. --- pkgs/tools/video/rav1e/default.nix | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/pkgs/tools/video/rav1e/default.nix b/pkgs/tools/video/rav1e/default.nix index 244aed92f813..83b4204d2dc5 100644 --- a/pkgs/tools/video/rav1e/default.nix +++ b/pkgs/tools/video/rav1e/default.nix @@ -10,10 +10,29 @@ , zlib , libiconv , Security +, buildPackages }: let rustTargetPlatformSpec = rust.toRustTargetSpec stdenv.hostPlatform; + + # TODO: if another package starts using cargo-c (seems likely), + # factor this out into a makeCargoChook expression in + # pkgs/build-support/rust/hooks/default.nix + ccForBuild = "${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc"; + cxxForBuild = "${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}c++"; + ccForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"; + cxxForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++"; + rustBuildPlatform = rust.toRustTarget stdenv.buildPlatform; + rustTargetPlatform = rust.toRustTarget stdenv.hostPlatform; + setEnvVars = '' + env \ + "CC_${rustBuildPlatform}"="${ccForBuild}" \ + "CXX_${rustBuildPlatform}"="${cxxForBuild}" \ + "CC_${rustTargetPlatform}"="${ccForHost}" \ + "CXX_${rustTargetPlatform}"="${cxxForHost}" \ + ''; + in rustPlatform.buildRustPackage rec { pname = "rav1e"; version = "0.6.3"; @@ -38,11 +57,13 @@ in rustPlatform.buildRustPackage rec { checkType = "debug"; - postBuild = '' + postBuild = '' + ${setEnvVars} \ cargo cbuild --release --frozen --prefix=${placeholder "out"} --target ${rustTargetPlatformSpec} ''; postInstall = '' + ${setEnvVars} \ cargo cinstall --release --frozen --prefix=${placeholder "out"} --target ${rustTargetPlatformSpec} '';