diff --git a/lib/systems/default.nix b/lib/systems/default.nix index 53c095711aef..72fe1f549cf3 100644 --- a/lib/systems/default.nix +++ b/lib/systems/default.nix @@ -23,6 +23,7 @@ let platforms = import ./platforms.nix { inherit lib; }; examples = import ./examples.nix { inherit lib; }; architectures = import ./architectures.nix { inherit lib; }; + rustc-target-env = import ./rustc-target-env.nix; /** Elaborated systems contain functions, which means that they don't satisfy @@ -449,6 +450,16 @@ let else final.parsed.cpu.name; + # https://doc.rust-lang.org/reference/conditional-compilation.html#target_env + # Accomodate system definitions written before Nixpkgs learned about target_env. + env = + if rust ? platform.env then + rust.platform.env + else if rustc-target-env ? ${final.rust.rustcTargetSpec} then + rustc-target-env.${final.rust.rustcTargetSpec} + else + ""; + # https://doc.rust-lang.org/reference/conditional-compilation.html#target_os os = if rust ? platform then diff --git a/lib/systems/rustc-target-env.nix b/lib/systems/rustc-target-env.nix new file mode 100644 index 000000000000..a0bb0b66dc9c --- /dev/null +++ b/lib/systems/rustc-target-env.nix @@ -0,0 +1,160 @@ +# As of rustc 1.96.0. Empty `target_env` values are omitted. +# +# Generation script: +# #!/bin/bash +# rustc --print target-list | while read -r target ; do +# env=$(rustc --print cfg --target "$target" | grep '^target_env=' | sed 's/# ^target_env="//;s/"$//') +# [[ -z "$env" ]] && continue +# printf ' %s = "%s";\n' "$target" "$env" +# done +{ + aarch64-apple-ios-macabi = "macabi"; + aarch64-apple-ios-sim = "sim"; + aarch64-apple-tvos-sim = "sim"; + aarch64-apple-visionos-sim = "sim"; + aarch64-apple-watchos-sim = "sim"; + aarch64-pc-windows-gnullvm = "gnu"; + aarch64-pc-windows-msvc = "msvc"; + aarch64-unknown-linux-gnu = "gnu"; + aarch64-unknown-linux-gnu_ilp32 = "gnu"; + aarch64-unknown-linux-musl = "musl"; + aarch64-unknown-linux-ohos = "ohos"; + aarch64-unknown-managarm-mlibc = "mlibc"; + aarch64-unknown-nto-qnx700 = "nto70"; + aarch64-unknown-nto-qnx710 = "nto71"; + aarch64-unknown-nto-qnx710_iosock = "nto71_iosock"; + aarch64-unknown-nto-qnx800 = "nto80"; + aarch64-unknown-redox = "relibc"; + aarch64-uwp-windows-msvc = "msvc"; + aarch64-wrs-vxworks = "gnu"; + aarch64_be-unknown-linux-gnu = "gnu"; + aarch64_be-unknown-linux-gnu_ilp32 = "gnu"; + aarch64_be-unknown-linux-musl = "musl"; + arm-unknown-linux-gnueabi = "gnu"; + arm-unknown-linux-gnueabihf = "gnu"; + arm-unknown-linux-musleabi = "musl"; + arm-unknown-linux-musleabihf = "musl"; + arm64ec-pc-windows-msvc = "msvc"; + armeb-unknown-linux-gnueabi = "gnu"; + armv4t-unknown-linux-gnueabi = "gnu"; + armv5te-unknown-linux-gnueabi = "gnu"; + armv5te-unknown-linux-musleabi = "musl"; + armv5te-unknown-linux-uclibceabi = "uclibc"; + armv6k-nintendo-3ds = "newlib"; + armv7-rtems-eabihf = "newlib"; + armv7-sony-vita-newlibeabihf = "newlib"; + armv7-unknown-linux-gnueabi = "gnu"; + armv7-unknown-linux-gnueabihf = "gnu"; + armv7-unknown-linux-musleabi = "musl"; + armv7-unknown-linux-musleabihf = "musl"; + armv7-unknown-linux-ohos = "ohos"; + armv7-unknown-linux-uclibceabi = "uclibc"; + armv7-unknown-linux-uclibceabihf = "uclibc"; + armv7-wrs-vxworks-eabihf = "gnu"; + armv7a-vex-v5 = "v5"; + csky-unknown-linux-gnuabiv2 = "gnu"; + csky-unknown-linux-gnuabiv2hf = "gnu"; + hexagon-unknown-linux-musl = "musl"; + i386-apple-ios = "sim"; + i586-unknown-linux-gnu = "gnu"; + i586-unknown-linux-musl = "musl"; + i586-unknown-redox = "relibc"; + i686-pc-nto-qnx700 = "nto70"; + i686-pc-windows-gnu = "gnu"; + i686-pc-windows-gnullvm = "gnu"; + i686-pc-windows-msvc = "msvc"; + i686-unknown-hurd-gnu = "gnu"; + i686-unknown-linux-gnu = "gnu"; + i686-unknown-linux-musl = "musl"; + i686-uwp-windows-gnu = "gnu"; + i686-uwp-windows-msvc = "msvc"; + i686-win7-windows-gnu = "gnu"; + i686-win7-windows-msvc = "msvc"; + i686-wrs-vxworks = "gnu"; + loongarch64-unknown-linux-gnu = "gnu"; + loongarch64-unknown-linux-musl = "musl"; + loongarch64-unknown-linux-ohos = "ohos"; + m68k-unknown-linux-gnu = "gnu"; + mips-unknown-linux-gnu = "gnu"; + mips-unknown-linux-musl = "musl"; + mips-unknown-linux-uclibc = "uclibc"; + mips64-openwrt-linux-musl = "musl"; + mips64-unknown-linux-gnuabi64 = "gnu"; + mips64-unknown-linux-muslabi64 = "musl"; + mips64el-unknown-linux-gnuabi64 = "gnu"; + mips64el-unknown-linux-muslabi64 = "musl"; + mipsel-unknown-linux-gnu = "gnu"; + mipsel-unknown-linux-musl = "musl"; + mipsel-unknown-linux-uclibc = "uclibc"; + mipsisa32r6-unknown-linux-gnu = "gnu"; + mipsisa32r6el-unknown-linux-gnu = "gnu"; + mipsisa64r6-unknown-linux-gnuabi64 = "gnu"; + mipsisa64r6el-unknown-linux-gnuabi64 = "gnu"; + powerpc-unknown-linux-gnu = "gnu"; + powerpc-unknown-linux-gnuspe = "gnu"; + powerpc-unknown-linux-musl = "musl"; + powerpc-unknown-linux-muslspe = "musl"; + powerpc-wrs-vxworks = "gnu"; + powerpc-wrs-vxworks-spe = "gnu"; + powerpc64-unknown-linux-gnu = "gnu"; + powerpc64-unknown-linux-musl = "musl"; + powerpc64-wrs-vxworks = "gnu"; + powerpc64le-unknown-linux-gnu = "gnu"; + powerpc64le-unknown-linux-musl = "musl"; + riscv32-wrs-vxworks = "gnu"; + riscv32gc-unknown-linux-gnu = "gnu"; + riscv32gc-unknown-linux-musl = "musl"; + riscv32imac-esp-espidf = "newlib"; + riscv32imafc-esp-espidf = "newlib"; + riscv32imc-esp-espidf = "newlib"; + riscv64-wrs-vxworks = "gnu"; + riscv64a23-unknown-linux-gnu = "gnu"; + riscv64gc-unknown-linux-gnu = "gnu"; + riscv64gc-unknown-linux-musl = "musl"; + riscv64gc-unknown-managarm-mlibc = "mlibc"; + riscv64gc-unknown-redox = "relibc"; + s390x-unknown-linux-gnu = "gnu"; + s390x-unknown-linux-musl = "musl"; + sparc-unknown-linux-gnu = "gnu"; + sparc64-unknown-linux-gnu = "gnu"; + thumbv7a-pc-windows-msvc = "msvc"; + thumbv7a-uwp-windows-msvc = "msvc"; + thumbv7neon-unknown-linux-gnueabihf = "gnu"; + thumbv7neon-unknown-linux-musleabihf = "musl"; + wasm32-wali-linux-musl = "musl"; + wasm32-wasip1 = "p1"; + wasm32-wasip1-threads = "p1"; + wasm32-wasip2 = "p2"; + wasm32-wasip3 = "p3"; + x86_64-apple-ios = "sim"; + x86_64-apple-ios-macabi = "macabi"; + x86_64-apple-tvos = "sim"; + x86_64-apple-watchos-sim = "sim"; + x86_64-fortanix-unknown-sgx = "sgx"; + x86_64-pc-nto-qnx710 = "nto71"; + x86_64-pc-nto-qnx710_iosock = "nto71_iosock"; + x86_64-pc-nto-qnx800 = "nto80"; + x86_64-pc-windows-gnu = "gnu"; + x86_64-pc-windows-gnullvm = "gnu"; + x86_64-pc-windows-msvc = "msvc"; + x86_64-unikraft-linux-musl = "musl"; + x86_64-unknown-hurd-gnu = "gnu"; + x86_64-unknown-l4re-uclibc = "uclibc"; + x86_64-unknown-linux-gnu = "gnu"; + x86_64-unknown-linux-gnuasan = "gnu"; + x86_64-unknown-linux-gnumsan = "gnu"; + x86_64-unknown-linux-gnutsan = "gnu"; + x86_64-unknown-linux-gnux32 = "gnu"; + x86_64-unknown-linux-musl = "musl"; + x86_64-unknown-linux-ohos = "ohos"; + x86_64-unknown-managarm-mlibc = "mlibc"; + x86_64-unknown-redox = "relibc"; + x86_64-uwp-windows-gnu = "gnu"; + x86_64-uwp-windows-msvc = "msvc"; + x86_64-win7-windows-gnu = "gnu"; + x86_64-win7-windows-msvc = "msvc"; + x86_64-wrs-vxworks = "gnu"; + xtensa-esp32-espidf = "newlib"; + xtensa-esp32s2-espidf = "newlib"; + xtensa-esp32s3-espidf = "newlib"; +} diff --git a/pkgs/build-support/rust/build-rust-crate/configure-crate.nix b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix index 060ce25df8db..6d7b530454d9 100644 --- a/pkgs/build-support/rust/build-rust-crate/configure-crate.nix +++ b/pkgs/build-support/rust/build-rust-crate/configure-crate.nix @@ -148,7 +148,7 @@ in export CARGO_CFG_TARGET_OS=${stdenv.hostPlatform.rust.platform.os} export CARGO_CFG_TARGET_FAMILY="unix" export CARGO_CFG_UNIX=1 - export CARGO_CFG_TARGET_ENV="gnu" + export CARGO_CFG_TARGET_ENV=${stdenv.hostPlatform.rust.platform.env} export CARGO_CFG_TARGET_ENDIAN=${ if stdenv.hostPlatform.parsed.cpu.significantByte.name == "littleEndian" then "little" else "big" } diff --git a/pkgs/build-support/rust/build-rust-crate/test/default.nix b/pkgs/build-support/rust/build-rust-crate/test/default.nix index 7e05e49072ab..b0f9dd4190f8 100644 --- a/pkgs/build-support/rust/build-rust-crate/test/default.nix +++ b/pkgs/build-support/rust/build-rust-crate/test/default.nix @@ -1008,6 +1008,66 @@ rec { ]; }; + crateWasm32TargetEnv = assertOutputs { + name = "gnu64-crate-target-env"; + mkCrate = mkCrate pkgsCross.wasm32-unknown-none.buildRustCrate; + crateArgs = { + crateName = "wasm32-crate-target-env"; + crateBin = [ { name = "wasm32-crate-target-env"; } ]; + src = symlinkJoin { + name = "wasm32-crate-target-env-sources"; + paths = [ + (mkFile "build.rs" '' + fn main() { + assert_eq!(std::env::var("CARGO_CFG_TARGET_ENV"), Ok("".to_string())); + } + '') + (mkFile "src/main.rs" '' + use std::env; + #[cfg(target_env = "")] + fn main() { + let name: String = env::args().nth(0).unwrap(); + println!("executed {}", name); + } + '') + ]; + }; + }; + expectedFiles = [ + "./bin/wasm32-crate-target-env.wasm" + ]; + }; + + crateGnu64TargetEnv = assertOutputs { + name = "gnu64-crate-target-env"; + mkCrate = mkCrate pkgsCross.gnu64.buildRustCrate; + crateArgs = { + crateName = "gnu64-crate-target-env"; + crateBin = [ { name = "gnu64-crate-target-env"; } ]; + src = symlinkJoin { + name = "gnu64-crate-target-env-sources"; + paths = [ + (mkFile "build.rs" '' + fn main() { + assert_eq!(std::env::var("CARGO_CFG_TARGET_ENV"), Ok("gnu".to_string())); + } + '') + (mkFile "src/main.rs" '' + use std::env; + #[cfg(target_env = "gnu")] + fn main() { + let name: String = env::args().nth(0).unwrap(); + println!("executed {}", name); + } + '') + ]; + }; + }; + expectedFiles = [ + "./bin/gnu64-crate-target-env" + ]; + }; + brotliTest = let pkg = brotliCrates.brotli_2_5_0 { };