summaryrefslogtreecommitdiff
path: root/lib/systems
diff options
context:
space:
mode:
authorWolfgang Walther <walther@technowledgy.de>2025-07-24 14:30:44 +0200
committerWolfgang Walther <walther@technowledgy.de>2025-07-24 14:33:09 +0200
commit90604d95bc3d98e88f2bf0eb071d18e6f1a3b76d (patch)
tree9642f2ae238e6387c24d4514fc518d3d86fc1741 /lib/systems
parentMerge staging-next into staging (diff)
parentMerge branch 'master' into staging-next (diff)
downloadnixpkgs-90604d95bc3d98e88f2bf0eb071d18e6f1a3b76d.tar.gz
Merge branch 'staging-next' into staging
Diffstat (limited to 'lib/systems')
-rw-r--r--lib/systems/architectures.nix9
-rw-r--r--lib/systems/default.nix977
-rw-r--r--lib/systems/examples.nix45
-rw-r--r--lib/systems/inspect.nix20
4 files changed, 534 insertions, 517 deletions
diff --git a/lib/systems/architectures.nix b/lib/systems/architectures.nix
index 91fc2ef0bbfe..95c9d0da341a 100644
--- a/lib/systems/architectures.nix
+++ b/lib/systems/architectures.nix
@@ -477,7 +477,8 @@ rec {
"armv9.1-a" = [
"armv9-a"
"armv8.6-a"
- ] ++ inferiors."armv8.6-a";
+ ]
+ ++ inferiors."armv8.6-a";
"armv9.2-a" = lib.unique (
[
"armv9.1-a"
@@ -503,12 +504,14 @@ rec {
"armv8.2-a"
"cortex-a53"
"cortex-a72"
- ] ++ inferiors."armv8.2-a";
+ ]
+ ++ inferiors."armv8.2-a";
cortex-a76 = [
"armv8.2-a"
"cortex-a53"
"cortex-a72"
- ] ++ inferiors."armv8.2-a";
+ ]
+ ++ inferiors."armv8.2-a";
# Ampere
ampere1 = withInferiors [
diff --git a/lib/systems/default.nix b/lib/systems/default.nix
index 2de5b6a858be..db358c759d81 100644
--- a/lib/systems/default.nix
+++ b/lib/systems/default.nix
@@ -83,531 +83,530 @@ let
# 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
- && (
- # Only perform this check when cpus have the same type;
- # assume compatible cpu have all the instructions included
- final.parsed.cpu == platform.parsed.cpu
- ->
- # if both have gcc.arch defined, check whether final can execute the given platform
- (
- (final ? gcc.arch && platform ? gcc.arch)
- -> architectures.canExecute final.gcc.arch platform.gcc.arch
- )
- # if platform has gcc.arch defined but final doesn't, don't assume it can be executed
- || (platform ? gcc.arch -> !(final ? gcc.arch))
- );
+ 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
+ && (
+ # Only perform this check when cpus have the same type;
+ # assume compatible cpu have all the instructions included
+ final.parsed.cpu == platform.parsed.cpu
+ ->
+ # if both have gcc.arch defined, check whether final can execute the given platform
+ (
+ (final ? gcc.arch && platform ? gcc.arch)
+ -> architectures.canExecute final.gcc.arch platform.gcc.arch
+ )
+ # if platform has gcc.arch defined but final doesn't, don't assume it can be executed
+ || (platform ? gcc.arch -> !(final ? gcc.arch))
+ );
- 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;
+ 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.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";
+ 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.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";
}
- // {
- 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;
+ .${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 if final.isDarwin then
+ final.darwinArch
+ 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 if final.isDarwin then
- final.darwinArch
- 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.isAarch64 then
+ "aarch64"
+ 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.isAarch64 then
- "aarch64"
- 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 = parse.darwinArch final.parsed.cpu;
- darwinArch = parse.darwinArch final.parsed.cpu;
+ 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"
+ # Handle Android SDK and NDK versions.
+ androidSdkVersion = args.androidSdkVersion or null;
+ androidNdkVersion = args.androidNdkVersion or null;
+ }
+ // (
+ let
+ 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;
- # 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"
+ in
+ {
+ emulatorAvailable = pkgs: (selectEmulator pkgs) != null;
+
+ # 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
- null;
+ throw "Don't know how to run ${final.config} executables.";
- # Handle Android SDK and NDK versions.
- androidSdkVersion = args.androidSdkVersion or null;
- androidNdkVersion = args.androidNdkVersion or null;
}
- // (
- let
- 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"
+ )
+ // 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
- null;
- in
- {
- emulatorAvailable = pkgs: (selectEmulator pkgs) != null;
-
- # whether final.emulator pkgs.pkgsStatic works
- staticEmulatorAvailable =
- pkgs: final.emulatorAvailable pkgs && (final.isLinux || final.isWasi || final.isMmix);
+ final.parsed.cpu.name;
- emulator =
- pkgs:
- if (final.emulatorAvailable pkgs) then
- selectEmulator pkgs
+ # 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
- 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;
-
- # 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
- if isList f then f else [ f ]
- )
- else
- optional final.isUnix "unix" ++ optional final.isWindows "windows" ++ optional final.isWasm "wasm";
+ final.parsed.kernel.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;
- };
+ # 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";
- # The name of the rust target, even if it is custom. Adjustments are
- # because rust has slightly different naming conventions than we do.
- rustcTarget =
+ # https://doc.rust-lang.org/reference/conditional-compilation.html#target_vendor
+ vendor =
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;
+ inherit (final.parsed) vendor;
in
- # TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL.
- 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}"}"
- );
+ rust.platform.vendor or {
+ "w64" = "pc";
+ }
+ .${vendor.name} or vendor.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, 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;
+ in
+ # TODO: deprecate args.rustc in favour of args.rust after 23.05 is EOL.
+ 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
- # 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 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
+ );
- # 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 = replaceString "-" "_" (toUpper final.rust.cargoShortTarget);
+ # 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}");
- # 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"
- ];
- };
- }
- // {
- go = {
- # See https://pkg.go.dev/internal/platform for a list of known platforms
- GOARCH =
- {
- "aarch64" = "arm64";
- "arm" = "arm";
- "armv5tel" = "arm";
- "armv6l" = "arm";
- "armv7l" = "arm";
- "i686" = "386";
- "loongarch64" = "loong64";
- "mips" = "mips";
- "mips64el" = "mips64le";
- "mipsel" = "mipsle";
- "powerpc64" = "ppc64";
- "powerpc64le" = "ppc64le";
- "riscv64" = "riscv64";
- "s390x" = "s390x";
- "x86_64" = "amd64";
- "wasm32" = "wasm";
- }
- .${final.parsed.cpu.name} or null;
- GOOS = if final.isWasi then "wasip1" else final.parsed.kernel.name;
+ # 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 = replaceString "-" "_" (toUpper final.rust.cargoShortTarget);
- # See https://go.dev/wiki/GoArm
- GOARM = toString (lib.intersectLists [ (final.parsed.cpu.version or "") ] [ "5" "6" "7" ]);
- };
+ # 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"
+ ];
+ };
+ }
+ // {
+ go = {
+ # See https://pkg.go.dev/internal/platform for a list of known platforms
+ GOARCH =
+ {
+ "aarch64" = "arm64";
+ "arm" = "arm";
+ "armv5tel" = "arm";
+ "armv6l" = "arm";
+ "armv7l" = "arm";
+ "i686" = "386";
+ "loongarch64" = "loong64";
+ "mips" = "mips";
+ "mips64el" = "mips64le";
+ "mipsel" = "mipsle";
+ "powerpc64" = "ppc64";
+ "powerpc64le" = "ppc64le";
+ "riscv64" = "riscv64";
+ "s390x" = "s390x";
+ "x86_64" = "amd64";
+ "wasm32" = "wasm";
+ }
+ .${final.parsed.cpu.name} or null;
+ GOOS = if final.isWasi then "wasip1" else final.parsed.kernel.name;
- node = {
- # See these locations for a list of known architectures/platforms:
- # - https://nodejs.org/api/os.html#osarch
- # - https://nodejs.org/api/os.html#osplatform
- arch =
- if final.isAarch then
- "arm" + lib.optionalString final.is64bit "64"
- else if final.isMips32 then
- "mips" + lib.optionalString final.isLittleEndian "el"
- else if final.isMips64 && final.isLittleEndian then
- "mips64el"
- else if final.isPower then
- "ppc" + lib.optionalString final.is64bit "64"
- else if final.isx86_64 then
- "x64"
- else if final.isx86_32 then
- "ia32"
- else if final.isS390x then
- "s390x"
- else if final.isRiscV64 then
- "riscv64"
- else if final.isLoongArch64 then
- "loong64"
- else
- null;
+ # See https://go.dev/wiki/GoArm
+ GOARM = toString (lib.intersectLists [ (final.parsed.cpu.version or "") ] [ "5" "6" "7" ]);
+ };
- platform =
- if final.isAndroid then
- "android"
- else if final.isDarwin then
- "darwin"
- else if final.isFreeBSD then
- "freebsd"
- else if final.isLinux then
- "linux"
- else if final.isOpenBSD then
- "openbsd"
- else if final.isSunOS then
- "sunos"
- else if final.isWindows then
- "win32"
- else
- null;
- };
+ node = {
+ # See these locations for a list of known architectures/platforms:
+ # - https://nodejs.org/api/os.html#osarch
+ # - https://nodejs.org/api/os.html#osplatform
+ arch =
+ if final.isAarch then
+ "arm" + lib.optionalString final.is64bit "64"
+ else if final.isMips32 then
+ "mips" + lib.optionalString final.isLittleEndian "el"
+ else if final.isMips64 && final.isLittleEndian then
+ "mips64el"
+ else if final.isPower then
+ "ppc" + lib.optionalString final.is64bit "64"
+ else if final.isx86_64 then
+ "x64"
+ else if final.isx86_32 then
+ "ia32"
+ else if final.isS390x then
+ "s390x"
+ else if final.isRiscV64 then
+ "riscv64"
+ else if final.isLoongArch64 then
+ "loong64"
+ else
+ null;
+
+ platform =
+ if final.isAndroid then
+ "android"
+ else if final.isDarwin then
+ "darwin"
+ else if final.isFreeBSD then
+ "freebsd"
+ else if final.isLinux then
+ "linux"
+ else if final.isOpenBSD then
+ "openbsd"
+ else if final.isSunOS then
+ "sunos"
+ else if final.isWindows then
+ "win32"
+ else
+ null;
};
+ };
in
assert final.useAndroidPrebuilt -> final.isAndroid;
assert foldl (pass: { assertion, message }: if assertion final then pass else throw message) true (
diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix
index 9f67c109c787..152ac4ddc0ec 100644
--- a/lib/systems/examples.nix
+++ b/lib/systems/examples.nix
@@ -38,23 +38,28 @@ rec {
sheevaplug = {
config = "armv5tel-unknown-linux-gnueabi";
- } // platforms.sheevaplug;
+ }
+ // platforms.sheevaplug;
raspberryPi = {
config = "armv6l-unknown-linux-gnueabihf";
- } // platforms.raspberrypi;
+ }
+ // platforms.raspberrypi;
bluefield2 = {
config = "aarch64-unknown-linux-gnu";
- } // platforms.bluefield2;
+ }
+ // platforms.bluefield2;
remarkable1 = {
config = "armv7l-unknown-linux-gnueabihf";
- } // platforms.zero-gravitas;
+ }
+ // platforms.zero-gravitas;
remarkable2 = {
config = "armv7l-unknown-linux-gnueabihf";
- } // platforms.zero-sugar;
+ }
+ // platforms.zero-sugar;
armv7l-hf-multiplatform = {
config = "armv7l-unknown-linux-gnueabihf";
@@ -70,7 +75,8 @@ rec {
androidSdkVersion = "33";
androidNdkVersion = "26";
useAndroidPrebuilt = true;
- } // platforms.armv7a-android;
+ }
+ // platforms.armv7a-android;
aarch64-android-prebuilt = {
config = "aarch64-unknown-linux-android";
@@ -91,39 +97,48 @@ rec {
pogoplug4 = {
config = "armv5tel-unknown-linux-gnueabi";
- } // platforms.pogoplug4;
+ }
+ // platforms.pogoplug4;
ben-nanonote = {
config = "mipsel-unknown-linux-uclibc";
- } // platforms.ben_nanonote;
+ }
+ // platforms.ben_nanonote;
fuloongminipc = {
config = "mipsel-unknown-linux-gnu";
- } // platforms.fuloong2f_n32;
+ }
+ // platforms.fuloong2f_n32;
# can execute on 32bit chip
mips-linux-gnu = {
config = "mips-unknown-linux-gnu";
- } // platforms.gcc_mips32r2_o32;
+ }
+ // platforms.gcc_mips32r2_o32;
mipsel-linux-gnu = {
config = "mipsel-unknown-linux-gnu";
- } // platforms.gcc_mips32r2_o32;
+ }
+ // platforms.gcc_mips32r2_o32;
# require 64bit chip (for more registers, 64-bit floating point, 64-bit "long long") but use 32bit pointers
mips64-linux-gnuabin32 = {
config = "mips64-unknown-linux-gnuabin32";
- } // platforms.gcc_mips64r2_n32;
+ }
+ // platforms.gcc_mips64r2_n32;
mips64el-linux-gnuabin32 = {
config = "mips64el-unknown-linux-gnuabin32";
- } // platforms.gcc_mips64r2_n32;
+ }
+ // platforms.gcc_mips64r2_n32;
# 64bit pointers
mips64-linux-gnuabi64 = {
config = "mips64-unknown-linux-gnuabi64";
- } // platforms.gcc_mips64r2_64;
+ }
+ // platforms.gcc_mips64r2_64;
mips64el-linux-gnuabi64 = {
config = "mips64el-unknown-linux-gnuabi64";
- } // platforms.gcc_mips64r2_64;
+ }
+ // platforms.gcc_mips64r2_64;
muslpi = raspberryPi // {
config = "armv6l-unknown-linux-musleabihf";
diff --git a/lib/systems/inspect.nix b/lib/systems/inspect.nix
index efc02d79f9c8..2cc009133f2a 100644
--- a/lib/systems/inspect.nix
+++ b/lib/systems/inspect.nix
@@ -260,16 +260,16 @@ rec {
bits = 64;
};
};
- isILP32 =
- [
- {
- cpu = {
- family = "wasm";
- bits = 32;
- };
- }
- ]
- ++ map
+ isILP32 = [
+ {
+ cpu = {
+ family = "wasm";
+ bits = 32;
+ };
+ }
+ ]
+ ++
+ map
(a: {
abi = {
abi = a;