rustc: expose platform lists

Previously, it wasn't possible to access the list of platforms we can
build Rust programs for outside of buildRustPackage.  This was a
problem for packages that have optional Rust components, like
gstreamer or Meson, as there was no way to only build the Rust parts
for supported platforms.  Now it's possible to get that information
from rustc's passthru.
This commit is contained in:
Alyssa Ross 2024-08-15 11:05:15 +02:00
parent ce19166255
commit 0852f8eb84
No known key found for this signature in database
GPG Key ID: F9DBED4859B271C0
4 changed files with 41 additions and 30 deletions

View File

@ -151,23 +151,10 @@ stdenv.mkDerivation ((removeAttrs args [ "depsExtraArgs" "cargoUpdateHook" "carg
strictDeps = true;
meta = meta // {
badPlatforms = meta.badPlatforms or [] ++ [
# Rust is currently unable to target the n32 ABI
lib.systems.inspect.patterns.isMips64n32
];
} // lib.optionalAttrs (rustc.meta ? platforms) {
badPlatforms = meta.badPlatforms or [] ++ rustc.badTargetPlatforms;
# default to Rust's platforms
platforms = lib.intersectLists
meta.platforms or lib.platforms.all
(rustc.meta.platforms ++ [
# Platforms without host tools from
# https://doc.rust-lang.org/nightly/rustc/platform-support.html
"armv7a-darwin"
"armv5tel-linux" "armv7a-linux" "m68k-linux" "mips-linux"
"mips64-linux" "mipsel-linux" "mips64el-linux" "riscv32-linux"
"armv6l-netbsd" "mipsel-netbsd" "riscv64-netbsd"
"x86_64-redox"
"wasm32-wasi"
]);
rustc.targetPlatforms;
};
})

View File

@ -30,7 +30,9 @@ runCommand "${rustc-unwrapped.pname}-wrapper-${rustc-unwrapped.version}" {
};
passthru = {
inherit (rustc-unwrapped) pname version src llvm llvmPackages;
inherit (rustc-unwrapped)
pname version src llvm llvmPackages
tier1TargetPlatforms targetPlatforms badTargetPlatforms;
unwrapped = rustc-unwrapped;
};

View File

@ -61,6 +61,37 @@ rec {
dontStrip = true;
setupHooks = ./setup-hook.sh;
passthru = rec {
tier1TargetPlatforms = [
# Platforms with host tools from
# https://doc.rust-lang.org/nightly/rustc/platform-support.html
"x86_64-darwin" "i686-darwin" "aarch64-darwin"
"i686-freebsd" "x86_64-freebsd"
"x86_64-solaris"
"aarch64-linux" "armv6l-linux" "armv7l-linux" "i686-linux"
"loongarch64-linux" "powerpc64-linux" "powerpc64le-linux"
"riscv64-linux" "s390x-linux" "x86_64-linux"
"aarch64-netbsd" "armv7l-netbsd" "i686-netbsd" "powerpc-netbsd"
"x86_64-netbsd"
"i686-openbsd" "x86_64-openbsd"
"i686-windows" "x86_64-windows"
];
targetPlatforms = tier1TargetPlatforms ++ [
# Platforms without host tools from
# https://doc.rust-lang.org/nightly/rustc/platform-support.html
"armv7a-darwin"
"armv5tel-linux" "armv7a-linux" "m68k-linux" "mips-linux"
"mips64-linux" "mipsel-linux" "mips64el-linux" "riscv32-linux"
"armv6l-netbsd" "mipsel-netbsd" "riscv64-netbsd"
"x86_64-redox"
"wasm32-wasi"
];
badTargetPlatforms = [
# Rust is currently unable to target the n32 ABI
lib.systems.inspect.patterns.isMips64n32
];
};
};
rustc = wrapRustc rustc-unwrapped;

View File

@ -303,6 +303,7 @@ in stdenv.mkDerivation (finalAttrs: {
passthru = {
llvm = llvmShared;
inherit llvmPackages;
inherit (rustc) tier1TargetPlatforms targetPlatforms badTargetPlatforms;
tests = {
inherit fd ripgrep wezterm;
} // lib.optionalAttrs stdenv.hostPlatform.isLinux { inherit firefox thunderbird; };
@ -313,19 +314,9 @@ in stdenv.mkDerivation (finalAttrs: {
description = "Safe, concurrent, practical language";
maintainers = with maintainers; [ havvy ] ++ teams.rust.members;
license = [ licenses.mit licenses.asl20 ];
platforms = [
# Platforms with host tools from
# https://doc.rust-lang.org/nightly/rustc/platform-support.html
"x86_64-darwin" "i686-darwin" "aarch64-darwin"
"i686-freebsd" "x86_64-freebsd"
"x86_64-solaris"
"aarch64-linux" "armv6l-linux" "armv7l-linux" "i686-linux"
"loongarch64-linux" "powerpc64-linux" "powerpc64le-linux"
"riscv64-linux" "s390x-linux" "x86_64-linux"
"aarch64-netbsd" "armv7l-netbsd" "i686-netbsd" "powerpc-netbsd"
"x86_64-netbsd"
"i686-openbsd" "x86_64-openbsd"
"i686-windows" "x86_64-windows"
];
platforms = rustc.tier1TargetPlatforms;
# If rustc can't target a platform, we also can't build rustc for
# that platform.
badPlatforms = rustc.badTargetPlatforms;
};
})