diff options
Diffstat (limited to 'lib/systems/default.nix')
| -rw-r--r-- | lib/systems/default.nix | 780 |
1 files changed, 445 insertions, 335 deletions
diff --git a/lib/systems/default.nix b/lib/systems/default.nix index ec0106a13dac..67bd9826465c 100644 --- a/lib/systems/default.nix +++ b/lib/systems/default.nix @@ -42,8 +42,10 @@ let both arguments have been `elaborate`-d. */ equals = - let removeFunctions = a: filterAttrs (_: v: !isFunction v) a; - in a: b: removeFunctions a == removeFunctions b; + let + removeFunctions = a: filterAttrs (_: v: !isFunction v) a; + in + a: b: removeFunctions a == removeFunctions b; /** List of all Nix system doubles the nixpkgs flake will expose the package set @@ -57,8 +59,8 @@ let # Turn localSystem or crossSystem, which could be system-string or attrset, into # attrset. - systemToAttrs = systemOrArgs: - if isAttrs systemOrArgs then systemOrArgs else { system = systemOrArgs; }; + systemToAttrs = + systemOrArgs: if isAttrs systemOrArgs then systemOrArgs else { system = systemOrArgs; }; # Elaborate a `localSystem` or `crossSystem` so that it contains everything # necessary. @@ -66,370 +68,478 @@ let # `parsed` is inferred from args, both because there are two options with one # clearly preferred, and to prevent cycles. A simpler fixed point where the RHS # always just used `final.*` would fail on both counts. - elaborate = systemOrArgs: let - allArgs = systemToAttrs systemOrArgs; + elaborate = + systemOrArgs: + let + allArgs = systemToAttrs systemOrArgs; - # Those two will always be derived from "config", if given, so they should NOT - # be overridden further down with "// args". - args = builtins.removeAttrs allArgs [ "parsed" "system" ]; + # Those two will always be derived from "config", if given, so they should NOT + # be overridden further down with "// args". + args = builtins.removeAttrs allArgs [ + "parsed" + "system" + ]; - # TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL. - rust = args.rust or args.rustc or {}; + # TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL. + rust = args.rust or args.rustc or { }; - final = { - # Prefer to parse `config` as it is strictly more informative. - parsed = parse.mkSystemFromString (args.config or allArgs.system); - # This can be losslessly-extracted from `parsed` iff parsing succeeds. - system = parse.doubleFromSystem final.parsed; - # TODO: This currently can't be losslessly-extracted from `parsed`, for example - # because of -mingw32. - config = parse.tripleFromSystem final.parsed; - # Determine whether we can execute binaries built for the provided platform. - canExecute = platform: - final.isAndroid == platform.isAndroid && - parse.isCompatible final.parsed.cpu platform.parsed.cpu - && final.parsed.kernel == platform.parsed.kernel; - isCompatible = _: throw "2022-05-23: isCompatible has been removed in favor of canExecute, refer to the 22.11 changelog for details"; - # Derived meta-data - useLLVM = final.isFreeBSD || final.isOpenBSD; + final = + { + # Prefer to parse `config` as it is strictly more informative. + parsed = parse.mkSystemFromString (args.config or allArgs.system); + # This can be losslessly-extracted from `parsed` iff parsing succeeds. + system = parse.doubleFromSystem final.parsed; + # TODO: This currently can't be losslessly-extracted from `parsed`, for example + # because of -mingw32. + config = parse.tripleFromSystem final.parsed; + # Determine whether we can execute binaries built for the provided platform. + canExecute = + platform: + final.isAndroid == platform.isAndroid + && parse.isCompatible final.parsed.cpu platform.parsed.cpu + && final.parsed.kernel == platform.parsed.kernel; + isCompatible = + _: + throw "2022-05-23: isCompatible has been removed in favor of canExecute, refer to the 22.11 changelog for details"; + # Derived meta-data + useLLVM = final.isFreeBSD || final.isOpenBSD; - libc = - /**/ if final.isDarwin then "libSystem" - else if final.isMinGW then "msvcrt" - else if final.isWasi then "wasilibc" - else if final.isWasm && !final.isWasi then null - else if final.isRedox then "relibc" - else if final.isMusl then "musl" - else if final.isUClibc then "uclibc" - else if final.isAndroid then "bionic" - else if final.isLLVMLibc then "llvm" - else if final.isLinux /* default */ then "glibc" - else if final.isFreeBSD then "fblibc" - else if final.isOpenBSD then "oblibc" - else if final.isNetBSD then "nblibc" - else if final.isAvr then "avrlibc" - else if final.isGhcjs then null - else if final.isNone then "newlib" - # TODO(@Ericson2314) think more about other operating systems - else "native/impure"; - # Choose what linker we wish to use by default. Someday we might also - # choose the C compiler, runtime library, C++ standard library, etc. in - # this way, nice and orthogonally, and deprecate `useLLVM`. But due to - # the monolithic GCC build we cannot actually make those choices - # independently, so we are just doing `linker` and keeping `useLLVM` for - # now. - linker = - /**/ if final.useLLVM or false then "lld" - else if final.isDarwin then "cctools" - # "bfd" and "gold" both come from GNU binutils. The existence of Gold - # is why we use the more obscure "bfd" and not "binutils" for this - # choice. - else "bfd"; - # The standard lib directory name that non-nixpkgs binaries distributed - # for this platform normally assume. - libDir = if final.isLinux then - if final.isx86_64 || final.isMips64 || final.isPower64 - then "lib64" - else "lib" - else null; - extensions = optionalAttrs final.hasSharedLibraries { - sharedLibrary = - if final.isDarwin then ".dylib" - else if final.isWindows then ".dll" - else ".so"; - } // { - staticLibrary = - /**/ if final.isWindows then ".lib" - else ".a"; - library = - /**/ if final.isStatic then final.extensions.staticLibrary - else final.extensions.sharedLibrary; - executable = - /**/ if final.isWindows then ".exe" - else ""; - }; - # Misc boolean options - useAndroidPrebuilt = false; - useiOSPrebuilt = false; + libc = + if final.isDarwin then + "libSystem" + else if final.isMinGW then + "msvcrt" + else if final.isWasi then + "wasilibc" + else if final.isWasm && !final.isWasi then + null + else if final.isRedox then + "relibc" + else if final.isMusl then + "musl" + else if final.isUClibc then + "uclibc" + else if final.isAndroid then + "bionic" + else if final.isLLVMLibc then + "llvm" + else if + final.isLinux # default + then + "glibc" + else if final.isFreeBSD then + "fblibc" + else if final.isOpenBSD then + "oblibc" + else if final.isNetBSD then + "nblibc" + else if final.isAvr then + "avrlibc" + else if final.isGhcjs then + null + else if final.isNone then + "newlib" + # TODO(@Ericson2314) think more about other operating systems + else + "native/impure"; + # Choose what linker we wish to use by default. Someday we might also + # choose the C compiler, runtime library, C++ standard library, etc. in + # this way, nice and orthogonally, and deprecate `useLLVM`. But due to + # the monolithic GCC build we cannot actually make those choices + # independently, so we are just doing `linker` and keeping `useLLVM` for + # now. + linker = + if final.useLLVM or false then + "lld" + else if final.isDarwin then + "cctools" + # "bfd" and "gold" both come from GNU binutils. The existence of Gold + # is why we use the more obscure "bfd" and not "binutils" for this + # choice. + else + "bfd"; + # The standard lib directory name that non-nixpkgs binaries distributed + # for this platform normally assume. + libDir = + if final.isLinux then + if final.isx86_64 || final.isMips64 || final.isPower64 then "lib64" else "lib" + else + null; + extensions = + optionalAttrs final.hasSharedLibraries { + sharedLibrary = + if final.isDarwin then + ".dylib" + else if final.isWindows then + ".dll" + else + ".so"; + } + // { + staticLibrary = if final.isWindows then ".lib" else ".a"; + library = if final.isStatic then final.extensions.staticLibrary else final.extensions.sharedLibrary; + executable = if final.isWindows then ".exe" else ""; + }; + # Misc boolean options + useAndroidPrebuilt = false; + useiOSPrebuilt = false; - # Output from uname - uname = { - # uname -s - system = { - linux = "Linux"; - windows = "Windows"; - darwin = "Darwin"; - netbsd = "NetBSD"; - freebsd = "FreeBSD"; - openbsd = "OpenBSD"; - wasi = "Wasi"; - redox = "Redox"; - genode = "Genode"; - }.${final.parsed.kernel.name} or null; + # Output from uname + uname = { + # uname -s + system = + { + linux = "Linux"; + windows = "Windows"; + darwin = "Darwin"; + netbsd = "NetBSD"; + freebsd = "FreeBSD"; + openbsd = "OpenBSD"; + wasi = "Wasi"; + redox = "Redox"; + genode = "Genode"; + } + .${final.parsed.kernel.name} or null; - # uname -m - processor = - if final.isPower64 - then "ppc64${optionalString final.isLittleEndian "le"}" - else if final.isPower - then "ppc${optionalString final.isLittleEndian "le"}" - else if final.isMips64 - then "mips64" # endianness is *not* included on mips64 - else final.parsed.cpu.name; + # uname -m + processor = + if final.isPower64 then + "ppc64${optionalString final.isLittleEndian "le"}" + else if final.isPower then + "ppc${optionalString final.isLittleEndian "le"}" + else if final.isMips64 then + "mips64" # endianness is *not* included on mips64 + else + final.parsed.cpu.name; - # uname -r - release = null; - }; + # uname -r + release = null; + }; - # It is important that hasSharedLibraries==false when the platform has no - # dynamic library loader. Various tools (including the gcc build system) - # have knowledge of which platforms are incapable of dynamic linking, and - # will still build on/for those platforms with --enable-shared, but simply - # omit any `.so` build products such as libgcc_s.so. When that happens, - # it causes hard-to-troubleshoot build failures. - hasSharedLibraries = with final; - (isAndroid || isGnu || isMusl # Linux (allows multiple libcs) - || isDarwin || isSunOS || isOpenBSD || isFreeBSD || isNetBSD # BSDs - || isCygwin || isMinGW || isWindows # Windows - || isWasm # WASM - ) && !isStatic; + # It is important that hasSharedLibraries==false when the platform has no + # dynamic library loader. Various tools (including the gcc build system) + # have knowledge of which platforms are incapable of dynamic linking, and + # will still build on/for those platforms with --enable-shared, but simply + # omit any `.so` build products such as libgcc_s.so. When that happens, + # it causes hard-to-troubleshoot build failures. + hasSharedLibraries = + with final; + ( + isAndroid + || isGnu + || isMusl # Linux (allows multiple libcs) + || isDarwin + || isSunOS + || isOpenBSD + || isFreeBSD + || isNetBSD # BSDs + || isCygwin + || isMinGW + || isWindows # Windows + || isWasm # WASM + ) + && !isStatic; - # The difference between `isStatic` and `hasSharedLibraries` is mainly the - # addition of the `staticMarker` (see make-derivation.nix). Some - # platforms, like embedded machines without a libc (e.g. arm-none-eabi) - # don't support dynamic linking, but don't get the `staticMarker`. - # `pkgsStatic` sets `isStatic=true`, so `pkgsStatic.hostPlatform` always - # has the `staticMarker`. - isStatic = final.isWasi || final.isRedox; + # The difference between `isStatic` and `hasSharedLibraries` is mainly the + # addition of the `staticMarker` (see make-derivation.nix). Some + # platforms, like embedded machines without a libc (e.g. arm-none-eabi) + # don't support dynamic linking, but don't get the `staticMarker`. + # `pkgsStatic` sets `isStatic=true`, so `pkgsStatic.hostPlatform` always + # has the `staticMarker`. + isStatic = final.isWasi || final.isRedox; - # Just a guess, based on `system` - inherit - ({ - linux-kernel = args.linux-kernel or {}; - gcc = args.gcc or {}; - } // platforms.select final) - linux-kernel gcc; + # Just a guess, based on `system` + inherit + ( + { + linux-kernel = args.linux-kernel or { }; + gcc = args.gcc or { }; + } + // platforms.select final + ) + linux-kernel + gcc + ; - # TODO: remove after 23.05 is EOL, with an error pointing to the rust.* attrs. - rustc = args.rustc or {}; + # TODO: remove after 23.05 is EOL, with an error pointing to the rust.* attrs. + rustc = args.rustc or { }; - linuxArch = - if final.isAarch32 then "arm" - else if final.isAarch64 then "arm64" - else if final.isx86_32 then "i386" - else if final.isx86_64 then "x86_64" - # linux kernel does not distinguish microblaze/microblazeel - else if final.isMicroBlaze then "microblaze" - else if final.isMips32 then "mips" - else if final.isMips64 then "mips" # linux kernel does not distinguish mips32/mips64 - else if final.isPower then "powerpc" - else if final.isRiscV then "riscv" - else if final.isS390 then "s390" - else if final.isLoongArch64 then "loongarch" - else final.parsed.cpu.name; + linuxArch = + if final.isAarch32 then + "arm" + else if final.isAarch64 then + "arm64" + else if final.isx86_32 then + "i386" + else if final.isx86_64 then + "x86_64" + # linux kernel does not distinguish microblaze/microblazeel + else if final.isMicroBlaze then + "microblaze" + else if final.isMips32 then + "mips" + else if final.isMips64 then + "mips" # linux kernel does not distinguish mips32/mips64 + else if final.isPower then + "powerpc" + else if final.isRiscV then + "riscv" + else if final.isS390 then + "s390" + else if final.isLoongArch64 then + "loongarch" + else + final.parsed.cpu.name; - # https://source.denx.de/u-boot/u-boot/-/blob/9bfb567e5f1bfe7de8eb41f8c6d00f49d2b9a426/common/image.c#L81-106 - ubootArch = - if final.isx86_32 then "x86" # not i386 - else if final.isMips64 then "mips64" # uboot *does* distinguish between mips32/mips64 - else final.linuxArch; # other cases appear to agree with linuxArch + # https://source.denx.de/u-boot/u-boot/-/blob/9bfb567e5f1bfe7de8eb41f8c6d00f49d2b9a426/common/image.c#L81-106 + ubootArch = + if final.isx86_32 then + "x86" # not i386 + else if final.isMips64 then + "mips64" # uboot *does* distinguish between mips32/mips64 + else + final.linuxArch; # other cases appear to agree with linuxArch - qemuArch = - if final.isAarch32 then "arm" - else if final.isS390 && !final.isS390x then null - else if final.isx86_64 then "x86_64" - else if final.isx86 then "i386" - else if final.isMips64n32 then "mipsn32${optionalString final.isLittleEndian "el"}" - else if final.isMips64 then "mips64${optionalString final.isLittleEndian "el"}" - else final.uname.processor; + qemuArch = + if final.isAarch32 then + "arm" + else if final.isS390 && !final.isS390x then + null + else if final.isx86_64 then + "x86_64" + else if final.isx86 then + "i386" + else if final.isMips64n32 then + "mipsn32${optionalString final.isLittleEndian "el"}" + else if final.isMips64 then + "mips64${optionalString final.isLittleEndian "el"}" + else + final.uname.processor; - # Name used by UEFI for architectures. - efiArch = - if final.isx86_32 then "ia32" - else if final.isx86_64 then "x64" - else if final.isAarch32 then "arm" - else if final.isAarch64 then "aa64" - else final.parsed.cpu.name; + # Name used by UEFI for architectures. + efiArch = + if final.isx86_32 then + "ia32" + else if final.isx86_64 then + "x64" + else if final.isAarch32 then + "arm" + else if final.isAarch64 then + "aa64" + else + final.parsed.cpu.name; - darwinArch = { - armv7a = "armv7"; - aarch64 = "arm64"; - }.${final.parsed.cpu.name} or final.parsed.cpu.name; + darwinArch = + { + armv7a = "armv7"; + aarch64 = "arm64"; + } + .${final.parsed.cpu.name} or final.parsed.cpu.name; - darwinPlatform = - if final.isMacOS then "macos" - else if final.isiOS then "ios" - else null; - # The canonical name for this attribute is darwinSdkVersion, but some - # platforms define the old name "sdkVer". - darwinSdkVersion = final.sdkVer or "11.3"; - darwinMinVersion = final.darwinSdkVersion; - darwinMinVersionVariable = - if final.isMacOS then "MACOSX_DEPLOYMENT_TARGET" - else if final.isiOS then "IPHONEOS_DEPLOYMENT_TARGET" - else null; + darwinPlatform = + if final.isMacOS then + "macos" + else if final.isiOS then + "ios" + else + null; + # The canonical name for this attribute is darwinSdkVersion, but some + # platforms define the old name "sdkVer". + darwinSdkVersion = final.sdkVer or "11.3"; + darwinMinVersion = final.darwinSdkVersion; + darwinMinVersionVariable = + if final.isMacOS then + "MACOSX_DEPLOYMENT_TARGET" + else if final.isiOS then + "IPHONEOS_DEPLOYMENT_TARGET" + else + null; - # Remove before 25.05 - androidSdkVersion = - if (args ? sdkVer && !args ? androidSdkVersion) then - throw "For android `sdkVer` has been renamed to `androidSdkVersion`" - else if (args ? androidSdkVersion) then - args.androidSdkVersion - else - null; - androidNdkVersion = - if (args ? ndkVer && !args ? androidNdkVersion) then - throw "For android `ndkVer` has been renamed to `androidNdkVersion`" - else if (args ? androidSdkVersion) then - args.androidNdkVersion - else - null; - } // ( - let - selectEmulator = pkgs: + # Remove before 25.05 + androidSdkVersion = + if (args ? sdkVer && !args ? androidSdkVersion) then + throw "For android `sdkVer` has been renamed to `androidSdkVersion`" + else if (args ? androidSdkVersion) then + args.androidSdkVersion + else + null; + androidNdkVersion = + if (args ? ndkVer && !args ? androidNdkVersion) then + throw "For android `ndkVer` has been renamed to `androidNdkVersion`" + else if (args ? androidSdkVersion) then + args.androidNdkVersion + else + null; + } + // ( let - wine = (pkgs.winePackagesFor "wine${toString final.parsed.cpu.bits}").minimal; + selectEmulator = + pkgs: + let + wine = (pkgs.winePackagesFor "wine${toString final.parsed.cpu.bits}").minimal; + in + # Note: we guarantee that the return value is either `null` or a path + # to an emulator program. That is, if an emulator requires additional + # arguments, a wrapper should be used. + if pkgs.stdenv.hostPlatform.canExecute final then + lib.getExe (pkgs.writeShellScriptBin "exec" ''exec "$@"'') + else if final.isWindows then + "${wine}/bin/wine${optionalString (final.parsed.cpu.bits == 64) "64"}" + else if final.isLinux && pkgs.stdenv.hostPlatform.isLinux && final.qemuArch != null then + "${pkgs.qemu-user}/bin/qemu-${final.qemuArch}" + else if final.isWasi then + "${pkgs.wasmtime}/bin/wasmtime" + else if final.isMmix then + "${pkgs.mmixware}/bin/mmix" + else + null; in - # Note: we guarantee that the return value is either `null` or a path - # to an emulator program. That is, if an emulator requires additional - # arguments, a wrapper should be used. - if pkgs.stdenv.hostPlatform.canExecute final - then lib.getExe (pkgs.writeShellScriptBin "exec" ''exec "$@"'') - else if final.isWindows - then "${wine}/bin/wine${optionalString (final.parsed.cpu.bits == 64) "64"}" - else if final.isLinux && pkgs.stdenv.hostPlatform.isLinux && final.qemuArch != null - then "${pkgs.qemu-user}/bin/qemu-${final.qemuArch}" - else if final.isWasi - then "${pkgs.wasmtime}/bin/wasmtime" - else if final.isMmix - then "${pkgs.mmixware}/bin/mmix" - else null; - in { - emulatorAvailable = pkgs: (selectEmulator pkgs) != null; + { + emulatorAvailable = pkgs: (selectEmulator pkgs) != null; - # whether final.emulator pkgs.pkgsStatic works - staticEmulatorAvailable = pkgs: final.emulatorAvailable pkgs - && (final.isLinux || final.isWasi || final.isMmix); + # whether final.emulator pkgs.pkgsStatic works + staticEmulatorAvailable = + pkgs: final.emulatorAvailable pkgs && (final.isLinux || final.isWasi || final.isMmix); - emulator = pkgs: - if (final.emulatorAvailable pkgs) - then selectEmulator pkgs - else throw "Don't know how to run ${final.config} executables."; + emulator = + pkgs: + if (final.emulatorAvailable pkgs) then + selectEmulator pkgs + else + throw "Don't know how to run ${final.config} executables."; - }) // mapAttrs (n: v: v final.parsed) inspect.predicates - // mapAttrs (n: v: v final.gcc.arch or "default") architectures.predicates - // args // { - rust = rust // { - # Once args.rustc.platform.target-family is deprecated and - # removed, there will no longer be any need to modify any - # values from args.rust.platform, so we can drop all the - # "args ? rust" etc. checks, and merge args.rust.platform in - # /after/. - platform = rust.platform or {} // { - # https://doc.rust-lang.org/reference/conditional-compilation.html#target_arch - arch = - /**/ if rust ? platform then rust.platform.arch - else if final.isAarch32 then "arm" - else if final.isMips64 then "mips64" # never add "el" suffix - else if final.isPower64 then "powerpc64" # never add "le" suffix - else final.parsed.cpu.name; + } + ) + // mapAttrs (n: v: v final.parsed) inspect.predicates + // mapAttrs (n: v: v final.gcc.arch or "default") architectures.predicates + // args + // { + rust = rust // { + # Once args.rustc.platform.target-family is deprecated and + # removed, there will no longer be any need to modify any + # values from args.rust.platform, so we can drop all the + # "args ? rust" etc. checks, and merge args.rust.platform in + # /after/. + platform = rust.platform or { } // { + # https://doc.rust-lang.org/reference/conditional-compilation.html#target_arch + arch = + if rust ? platform then + rust.platform.arch + else if final.isAarch32 then + "arm" + else if final.isMips64 then + "mips64" # never add "el" suffix + else if final.isPower64 then + "powerpc64" # never add "le" suffix + else + final.parsed.cpu.name; - # https://doc.rust-lang.org/reference/conditional-compilation.html#target_os - os = - /**/ if rust ? platform then rust.platform.os or "none" - else if final.isDarwin then "macos" - else if final.isWasm && !final.isWasi then "unknown" # Needed for {wasm32,wasm64}-unknown-unknown. - else final.parsed.kernel.name; + # https://doc.rust-lang.org/reference/conditional-compilation.html#target_os + os = + if rust ? platform then + rust.platform.os or "none" + else if final.isDarwin then + "macos" + else if final.isWasm && !final.isWasi then + "unknown" # Needed for {wasm32,wasm64}-unknown-unknown. + else + final.parsed.kernel.name; - # https://doc.rust-lang.org/reference/conditional-compilation.html#target_family - target-family = - /**/ if args ? rust.platform.target-family then args.rust.platform.target-family - else if args ? rustc.platform.target-family - then - ( - # Since https://github.com/rust-lang/rust/pull/84072 - # `target-family` is a list instead of single value. - let - f = args.rustc.platform.target-family; - in + # https://doc.rust-lang.org/reference/conditional-compilation.html#target_family + target-family = + if args ? rust.platform.target-family then + args.rust.platform.target-family + else if args ? rustc.platform.target-family then + ( + # Since https://github.com/rust-lang/rust/pull/84072 + # `target-family` is a list instead of single value. + let + f = args.rustc.platform.target-family; + in if isList f then f else [ f ] - ) - else optional final.isUnix "unix" - ++ optional final.isWindows "windows" - ++ optional final.isWasm "wasm"; + ) + else + optional final.isUnix "unix" ++ optional final.isWindows "windows" ++ optional final.isWasm "wasm"; - # https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor - vendor = let - inherit (final.parsed) vendor; - in rust.platform.vendor or { - "w64" = "pc"; - }.${vendor.name} or vendor.name; - }; + # https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor + vendor = + let + inherit (final.parsed) vendor; + in + rust.platform.vendor or { + "w64" = "pc"; + } + .${vendor.name} or vendor.name; + }; - # The name of the rust target, even if it is custom. Adjustments are - # because rust has slightly different naming conventions than we do. - rustcTarget = let - inherit (final.parsed) cpu kernel abi; - cpu_ = rust.platform.arch or { - "armv7a" = "armv7"; - "armv7l" = "armv7"; - "armv6l" = "arm"; - "armv5tel" = "armv5te"; - "riscv32" = "riscv32gc"; - "riscv64" = "riscv64gc"; - }.${cpu.name} or cpu.name; - vendor_ = final.rust.platform.vendor; - # TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL. - in - args.rust.rustcTarget or - args.rustc.config or ( - # Rust uses `wasm32-wasip?` rather than `wasm32-unknown-wasi`. - # We cannot know which subversion does the user want, and - # currently use WASI 0.1 as default for compatibility. Custom - # users can set `rust.rustcTarget` to override it. - if final.isWasi - then "${cpu_}-wasip1" - else "${cpu_}-${vendor_}-${kernel.name}${optionalString (abi.name != "unknown") "-${abi.name}"}" - ); + # The name of the rust target, even if it is custom. Adjustments are + # because rust has slightly different naming conventions than we do. + rustcTarget = + let + inherit (final.parsed) cpu kernel abi; + cpu_ = + rust.platform.arch or { + "armv7a" = "armv7"; + "armv7l" = "armv7"; + "armv6l" = "arm"; + "armv5tel" = "armv5te"; + "riscv32" = "riscv32gc"; + "riscv64" = "riscv64gc"; + } + .${cpu.name} or cpu.name; + vendor_ = final.rust.platform.vendor; + # TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL. + in + args.rust.rustcTarget or args.rustc.config or ( + # Rust uses `wasm32-wasip?` rather than `wasm32-unknown-wasi`. + # We cannot know which subversion does the user want, and + # currently use WASI 0.1 as default for compatibility. Custom + # users can set `rust.rustcTarget` to override it. + if final.isWasi then + "${cpu_}-wasip1" + else + "${cpu_}-${vendor_}-${kernel.name}${optionalString (abi.name != "unknown") "-${abi.name}"}" + ); - # The name of the rust target if it is standard, or the json file - # containing the custom target spec. - rustcTargetSpec = rust.rustcTargetSpec or ( - /**/ if rust ? platform - then builtins.toFile (final.rust.rustcTarget + ".json") (toJSON rust.platform) - else final.rust.rustcTarget); + # The name of the rust target if it is standard, or the json file + # containing the custom target spec. + rustcTargetSpec = + rust.rustcTargetSpec or ( + if rust ? platform then + builtins.toFile (final.rust.rustcTarget + ".json") (toJSON rust.platform) + else + final.rust.rustcTarget + ); - # The name of the rust target if it is standard, or the - # basename of the file containing the custom target spec, - # without the .json extension. - # - # This is the name used by Cargo for target subdirectories. - cargoShortTarget = - removeSuffix ".json" (baseNameOf "${final.rust.rustcTargetSpec}"); + # The name of the rust target if it is standard, or the + # basename of the file containing the custom target spec, + # without the .json extension. + # + # This is the name used by Cargo for target subdirectories. + cargoShortTarget = removeSuffix ".json" (baseNameOf "${final.rust.rustcTargetSpec}"); - # When used as part of an environment variable name, triples are - # uppercased and have all hyphens replaced by underscores: - # - # https://github.com/rust-lang/cargo/pull/9169 - # https://github.com/rust-lang/cargo/issues/8285#issuecomment-634202431 - cargoEnvVarTarget = - replaceStrings ["-"] ["_"] - (toUpper final.rust.cargoShortTarget); + # When used as part of an environment variable name, triples are + # uppercased and have all hyphens replaced by underscores: + # + # https://github.com/rust-lang/cargo/pull/9169 + # https://github.com/rust-lang/cargo/issues/8285#issuecomment-634202431 + cargoEnvVarTarget = replaceStrings [ "-" ] [ "_" ] (toUpper final.rust.cargoShortTarget); - # True if the target is no_std - # https://github.com/rust-lang/rust/blob/2e44c17c12cec45b6a682b1e53a04ac5b5fcc9d2/src/bootstrap/config.rs#L415-L421 - isNoStdTarget = - any (t: hasInfix t final.rust.rustcTarget) ["-none" "nvptx" "switch" "-uefi"]; + # True if the target is no_std + # https://github.com/rust-lang/rust/blob/2e44c17c12cec45b6a682b1e53a04ac5b5fcc9d2/src/bootstrap/config.rs#L415-L421 + isNoStdTarget = any (t: hasInfix t final.rust.rustcTarget) [ + "-none" + "nvptx" + "switch" + "-uefi" + ]; + }; }; - }; - in assert final.useAndroidPrebuilt -> final.isAndroid; - assert foldl - (pass: { assertion, message }: - if assertion final - then pass - else throw message) - true - (final.parsed.abi.assertions or []); + in + assert final.useAndroidPrebuilt -> final.isAndroid; + assert foldl (pass: { assertion, message }: if assertion final then pass else throw message) true ( + final.parsed.abi.assertions or [ ] + ); final; in |
