From 6d1a64478eb9d87ca483ac7f31cbc24ecf34fbfc Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Sun, 16 Apr 2023 22:21:21 -0700 Subject: [PATCH] rustc: fix >=1.68 host!=build Our `rustc.nix` adds a `--target` flag for the host when doing a host!=target build, but neglects to add a `--target` flag for the buildPlatform when doing a build!=(host==target) build. This commit corrects that. Before rustc 1.68 omitting the --target flag for the buildPlatform did not cause any problems. As of rustc 1.68, build!=host without a --target for the build will fail like below (with hundreds more "cannot find std::" errors. ``` $ nix build -f . -L pkgsCross.aarch64-multiplatform.rustc ... Copying stage1 library from stage1 (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu / aarch64-unknown-linux-gnu) Uplifting stage1 library (x86_64-unknown-linux-gnu -> aarch64-unknown-linux-gnu) Copying stage2 library from stage1 (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu / aarch64-unknown-linux-gnu) Building stage2 tool rust-analyzer-proc-macro-srv (aarch64-unknown-linux-gnu) Compiling autocfg v1.1.0 Compiling libc v0.2.135 Compiling cfg-if v1.0.0 Compiling proc-macro2 v1.0.47 Compiling quote v1.0.21 Compiling unicode-ident v1.0.5 Compiling syn v1.0.102 Compiling once_cell v1.15.0 Compiling parking_lot_core v0.9.4 Compiling serde_derive v1.0.145 Compiling hashbrown v0.12.3 Compiling scopeguard v1.1.0 Compiling smallvec v1.10.0 Compiling log v0.4.17 Compiling serde v1.0.145 Compiling rustc-hash v1.1.0 error[E0463]: can't find crate for `std` error: cannot find macro `println` in this scope --> /nix/tmp/nix-build-rustc-aarch64-unknown-linux-gnu-1.68.2.drv-0/rustc-1.68.2-src/vendor/libc-0.2.135/build.rs:7:5 | 7 | println!("cargo:rerun-if-changed=build.rs"); | ^^^^^^^ error: cannot find macro `println` in this scope --> /nix/tmp/nix-build-rustc-aarch64-unknown-linux-gnu-1.68.2.drv-0/rustc-1.68.2-src/vendor/libc-0.2.135/build.rs:16:9 | 16 | println!( | ^^^^^^^ error: cannot find macro `println` in this scope --> /nix/tmp/nix-build-rustc-aarch64-unknown-linux-gnu-1.68.2.drv-0/rustc-1.68.2-src/vendor/libc-0.2.135/build.rs:29:13 | 29 | println!("cargo:rustc-cfg=freebsd10") | ^^^^^^^ ``` --- pkgs/development/compilers/rust/rustc.nix | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pkgs/development/compilers/rust/rustc.nix b/pkgs/development/compilers/rust/rustc.nix index f9068a7999a20..a1c6189799345 100644 --- a/pkgs/development/compilers/rust/rustc.nix +++ b/pkgs/development/compilers/rust/rustc.nix @@ -79,11 +79,19 @@ in stdenv.mkDerivation rec { "--enable-vendor" "--build=${rust.toRustTargetSpec stdenv.buildPlatform}" "--host=${rust.toRustTargetSpec stdenv.hostPlatform}" - # std is built for all platforms in --target. When building a cross-compiler - # we need to add the host platform as well so rustc can compile build.rs - # scripts. + # std is built for all platforms in --target. "--target=${concatStringsSep "," ([ (rust.toRustTargetSpec stdenv.targetPlatform) + + # (build!=target): When cross-building a compiler we need to add + # the build platform as well so rustc can compile build.rs + # scripts. + ] ++ optionals (stdenv.buildPlatform != stdenv.targetPlatform) [ + (rust.toRustTargetSpec stdenv.buildPlatform) + + # (host!=target): When building a cross-targeting compiler we + # need to add the host platform as well so rustc can compile + # build.rs scripts. ] ++ optionals (stdenv.hostPlatform != stdenv.targetPlatform) [ (rust.toRustTargetSpec stdenv.hostPlatform) ])}"