treewide: Format all Nix files
Format all Nix files using the officially approved formatter,
making the CI check introduced in the previous commit succeed:
nix-build ci -A fmt.check
This is the next step of the of the [implementation](https://github.com/NixOS/nixfmt/issues/153)
of the accepted [RFC 166](https://github.com/NixOS/rfcs/pull/166).
This commit will lead to merge conflicts for a number of PRs,
up to an estimated ~1100 (~33%) among the PRs with activity in the past 2
months, but that should be lower than what it would be without the previous
[partial treewide format](https://github.com/NixOS/nixpkgs/pull/322537).
Merge conflicts caused by this commit can now automatically be resolved while rebasing using the
[auto-rebase script](8616af08d9/maintainers/scripts/auto-rebase).
If you run into any problems regarding any of this, please reach out to the
[formatting team](https://nixos.org/community/teams/formatting/) by
pinging @NixOS/nix-formatting.
This commit is contained in:
@@ -5,94 +5,395 @@ rec {
|
||||
features = {
|
||||
# x86_64 Generic
|
||||
# Spec: https://gitlab.com/x86-psABIs/x86-64-ABI/
|
||||
default = [ ];
|
||||
x86-64 = [ ];
|
||||
x86-64-v2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
|
||||
x86-64-v3 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "avx" "avx2" "fma" ];
|
||||
x86-64-v4 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "avx" "avx2" "avx512" "fma" ];
|
||||
default = [ ];
|
||||
x86-64 = [ ];
|
||||
x86-64-v2 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
];
|
||||
x86-64-v3 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
x86-64-v4 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
# x86_64 Intel
|
||||
nehalem = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
|
||||
westmere = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
|
||||
silvermont = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
|
||||
sandybridge = [ "sse3" "ssse3" "sse4_1" "sse4_2" "avx" ];
|
||||
ivybridge = [ "sse3" "ssse3" "sse4_1" "sse4_2" "avx" ];
|
||||
haswell = [ "sse3" "ssse3" "sse4_1" "sse4_2" "avx" "avx2" "fma" ];
|
||||
broadwell = [ "sse3" "ssse3" "sse4_1" "sse4_2" "avx" "avx2" "fma" ];
|
||||
skylake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
|
||||
skylake-avx512 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
cannonlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
icelake-client = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
icelake-server = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
cascadelake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
cooperlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
tigerlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
alderlake = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
|
||||
sapphirerapids = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
emeraldrapids = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
sierraforest = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" "avx2" "fma" ];
|
||||
nehalem = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
];
|
||||
westmere = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
];
|
||||
silvermont = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
];
|
||||
sandybridge = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"avx"
|
||||
];
|
||||
ivybridge = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"avx"
|
||||
];
|
||||
haswell = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
broadwell = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
skylake = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
skylake-avx512 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
cannonlake = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
icelake-client = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
icelake-server = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
cascadelake = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
cooperlake = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
tigerlake = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
alderlake = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
sapphirerapids = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
emeraldrapids = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
sierraforest = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
# x86_64 AMD
|
||||
btver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" ];
|
||||
btver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "aes" "avx" ];
|
||||
bdver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
|
||||
bdver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
|
||||
bdver3 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "fma" "fma4" ];
|
||||
bdver4 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" "fma4" ];
|
||||
znver1 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
|
||||
znver2 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
|
||||
znver3 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "fma" ];
|
||||
znver4 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
znver5 = [ "sse3" "ssse3" "sse4_1" "sse4_2" "sse4a" "aes" "avx" "avx2" "avx512" "fma" ];
|
||||
btver1 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
];
|
||||
btver2 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"aes"
|
||||
"avx"
|
||||
];
|
||||
bdver1 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"fma"
|
||||
"fma4"
|
||||
];
|
||||
bdver2 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"fma"
|
||||
"fma4"
|
||||
];
|
||||
bdver3 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"fma"
|
||||
"fma4"
|
||||
];
|
||||
bdver4 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
"fma4"
|
||||
];
|
||||
znver1 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
znver2 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
znver3 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"fma"
|
||||
];
|
||||
znver4 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
znver5 = [
|
||||
"sse3"
|
||||
"ssse3"
|
||||
"sse4_1"
|
||||
"sse4_2"
|
||||
"sse4a"
|
||||
"aes"
|
||||
"avx"
|
||||
"avx2"
|
||||
"avx512"
|
||||
"fma"
|
||||
];
|
||||
# other
|
||||
armv5te = [ ];
|
||||
armv6 = [ ];
|
||||
armv7-a = [ ];
|
||||
armv8-a = [ ];
|
||||
mips32 = [ ];
|
||||
loongson2f = [ ];
|
||||
armv5te = [ ];
|
||||
armv6 = [ ];
|
||||
armv7-a = [ ];
|
||||
armv8-a = [ ];
|
||||
mips32 = [ ];
|
||||
loongson2f = [ ];
|
||||
};
|
||||
|
||||
# a superior CPU has all the features of an inferior and is able to build and test code for it
|
||||
inferiors = {
|
||||
# x86_64 Generic
|
||||
default = [ ];
|
||||
x86-64 = [ ];
|
||||
x86-64-v2 = [ "x86-64" ];
|
||||
default = [ ];
|
||||
x86-64 = [ ];
|
||||
x86-64-v2 = [ "x86-64" ];
|
||||
x86-64-v3 = [ "x86-64-v2" ] ++ inferiors.x86-64-v2;
|
||||
x86-64-v4 = [ "x86-64-v3" ] ++ inferiors.x86-64-v3;
|
||||
|
||||
# x86_64 Intel
|
||||
# https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
|
||||
nehalem = [ "x86-64-v2" ] ++ inferiors.x86-64-v2;
|
||||
westmere = [ "nehalem" ] ++ inferiors.nehalem;
|
||||
sandybridge = [ "westmere" ] ++ inferiors.westmere;
|
||||
ivybridge = [ "sandybridge" ] ++ inferiors.sandybridge;
|
||||
nehalem = [ "x86-64-v2" ] ++ inferiors.x86-64-v2;
|
||||
westmere = [ "nehalem" ] ++ inferiors.nehalem;
|
||||
sandybridge = [ "westmere" ] ++ inferiors.westmere;
|
||||
ivybridge = [ "sandybridge" ] ++ inferiors.sandybridge;
|
||||
|
||||
haswell = lib.unique ([ "ivybridge" "x86-64-v3" ] ++ inferiors.ivybridge ++ inferiors.x86-64-v3);
|
||||
broadwell = [ "haswell" ] ++ inferiors.haswell;
|
||||
skylake = [ "broadwell" ] ++ inferiors.broadwell;
|
||||
haswell = lib.unique (
|
||||
[
|
||||
"ivybridge"
|
||||
"x86-64-v3"
|
||||
]
|
||||
++ inferiors.ivybridge
|
||||
++ inferiors.x86-64-v3
|
||||
);
|
||||
broadwell = [ "haswell" ] ++ inferiors.haswell;
|
||||
skylake = [ "broadwell" ] ++ inferiors.broadwell;
|
||||
|
||||
skylake-avx512 = lib.unique ([ "skylake" "x86-64-v4" ] ++ inferiors.skylake ++ inferiors.x86-64-v4);
|
||||
cannonlake = [ "skylake-avx512" ] ++ inferiors.skylake-avx512;
|
||||
icelake-client = [ "cannonlake" ] ++ inferiors.cannonlake;
|
||||
skylake-avx512 = lib.unique (
|
||||
[
|
||||
"skylake"
|
||||
"x86-64-v4"
|
||||
]
|
||||
++ inferiors.skylake
|
||||
++ inferiors.x86-64-v4
|
||||
);
|
||||
cannonlake = [ "skylake-avx512" ] ++ inferiors.skylake-avx512;
|
||||
icelake-client = [ "cannonlake" ] ++ inferiors.cannonlake;
|
||||
icelake-server = [ "icelake-client" ] ++ inferiors.icelake-client;
|
||||
cascadelake = [ "cannonlake" ] ++ inferiors.cannonlake;
|
||||
cooperlake = [ "cascadelake" ] ++ inferiors.cascadelake;
|
||||
tigerlake = [ "icelake-server" ] ++ inferiors.icelake-server;
|
||||
sapphirerapids = [ "tigerlake" ] ++ inferiors.tigerlake;
|
||||
emeraldrapids = [ "sapphirerapids" ] ++ inferiors.sapphirerapids;
|
||||
cascadelake = [ "cannonlake" ] ++ inferiors.cannonlake;
|
||||
cooperlake = [ "cascadelake" ] ++ inferiors.cascadelake;
|
||||
tigerlake = [ "icelake-server" ] ++ inferiors.icelake-server;
|
||||
sapphirerapids = [ "tigerlake" ] ++ inferiors.tigerlake;
|
||||
emeraldrapids = [ "sapphirerapids" ] ++ inferiors.sapphirerapids;
|
||||
|
||||
# CX16 does not exist on alderlake, while it does on nearly all other intel CPUs
|
||||
alderlake = [ ];
|
||||
sierraforest = [ "alderlake" ] ++ inferiors.alderlake;
|
||||
alderlake = [ ];
|
||||
sierraforest = [ "alderlake" ] ++ inferiors.alderlake;
|
||||
|
||||
# x86_64 AMD
|
||||
# TODO: fill this (need testing)
|
||||
btver1 = [ ];
|
||||
btver2 = [ ];
|
||||
bdver1 = [ ];
|
||||
bdver2 = [ ];
|
||||
bdver3 = [ ];
|
||||
bdver4 = [ ];
|
||||
btver1 = [ ];
|
||||
btver2 = [ ];
|
||||
bdver1 = [ ];
|
||||
bdver2 = [ ];
|
||||
bdver3 = [ ];
|
||||
bdver4 = [ ];
|
||||
# Regarding `skylake` as inferior of `znver1`, there are reports of
|
||||
# successful usage by Gentoo users and Phoronix benchmarking of different
|
||||
# `-march` targets.
|
||||
@@ -112,34 +413,43 @@ rec {
|
||||
# https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html
|
||||
# https://en.wikichip.org/wiki/amd/microarchitectures/zen
|
||||
# https://en.wikichip.org/wiki/intel/microarchitectures/skylake
|
||||
znver1 = [ "skylake" ] ++ inferiors.skylake; # Includes haswell and x86-64-v3
|
||||
znver2 = [ "znver1" ] ++ inferiors.znver1;
|
||||
znver3 = [ "znver2" ] ++ inferiors.znver2;
|
||||
znver4 = lib.unique ([ "znver3" "x86-64-v4" ] ++ inferiors.znver3 ++ inferiors.x86-64-v4);
|
||||
znver5 = [ "znver4" ] ++ inferiors.znver4;
|
||||
znver1 = [ "skylake" ] ++ inferiors.skylake; # Includes haswell and x86-64-v3
|
||||
znver2 = [ "znver1" ] ++ inferiors.znver1;
|
||||
znver3 = [ "znver2" ] ++ inferiors.znver2;
|
||||
znver4 = lib.unique (
|
||||
[
|
||||
"znver3"
|
||||
"x86-64-v4"
|
||||
]
|
||||
++ inferiors.znver3
|
||||
++ inferiors.x86-64-v4
|
||||
);
|
||||
znver5 = [ "znver4" ] ++ inferiors.znver4;
|
||||
|
||||
# other
|
||||
armv5te = [ ];
|
||||
armv6 = [ ];
|
||||
armv7-a = [ ];
|
||||
armv8-a = [ ];
|
||||
mips32 = [ ];
|
||||
loongson2f = [ ];
|
||||
armv5te = [ ];
|
||||
armv6 = [ ];
|
||||
armv7-a = [ ];
|
||||
armv8-a = [ ];
|
||||
mips32 = [ ];
|
||||
loongson2f = [ ];
|
||||
};
|
||||
|
||||
predicates = let
|
||||
featureSupport = feature: x: builtins.elem feature features.${x} or [];
|
||||
in {
|
||||
sse3Support = featureSupport "sse3";
|
||||
ssse3Support = featureSupport "ssse3";
|
||||
sse4_1Support = featureSupport "sse4_1";
|
||||
sse4_2Support = featureSupport "sse4_2";
|
||||
sse4_aSupport = featureSupport "sse4a";
|
||||
avxSupport = featureSupport "avx";
|
||||
avx2Support = featureSupport "avx2";
|
||||
avx512Support = featureSupport "avx512";
|
||||
aesSupport = featureSupport "aes";
|
||||
fmaSupport = featureSupport "fma";
|
||||
fma4Support = featureSupport "fma4";
|
||||
};
|
||||
predicates =
|
||||
let
|
||||
featureSupport = feature: x: builtins.elem feature features.${x} or [ ];
|
||||
in
|
||||
{
|
||||
sse3Support = featureSupport "sse3";
|
||||
ssse3Support = featureSupport "ssse3";
|
||||
sse4_1Support = featureSupport "sse4_1";
|
||||
sse4_2Support = featureSupport "sse4_2";
|
||||
sse4_aSupport = featureSupport "sse4a";
|
||||
avxSupport = featureSupport "avx";
|
||||
avx2Support = featureSupport "avx2";
|
||||
avx512Support = featureSupport "avx512";
|
||||
aesSupport = featureSupport "aes";
|
||||
fmaSupport = featureSupport "fma";
|
||||
fma4Support = featureSupport "fma4";
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
# 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;
|
||||
|
||||
# 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 {};
|
||||
|
||||
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
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
# 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:
|
||||
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 {
|
||||
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 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";
|
||||
|
||||
# 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;
|
||||
# uname -r
|
||||
release = null;
|
||||
};
|
||||
|
||||
# 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.
|
||||
# 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;
|
||||
|
||||
# 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 { };
|
||||
|
||||
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
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
# 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:
|
||||
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
|
||||
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}"}"
|
||||
);
|
||||
{
|
||||
emulatorAvailable = pkgs: (selectEmulator pkgs) != null;
|
||||
|
||||
# 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);
|
||||
# whether final.emulator pkgs.pkgsStatic works
|
||||
staticEmulatorAvailable =
|
||||
pkgs: final.emulatorAvailable pkgs && (final.isLinux || final.isWasi || final.isMmix);
|
||||
|
||||
# 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}");
|
||||
emulator =
|
||||
pkgs:
|
||||
if (final.emulatorAvailable pkgs) then
|
||||
selectEmulator pkgs
|
||||
else
|
||||
throw "Don't know how to run ${final.config} executables.";
|
||||
|
||||
# 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);
|
||||
}
|
||||
)
|
||||
// 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;
|
||||
|
||||
# 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"];
|
||||
# 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";
|
||||
|
||||
# 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 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}");
|
||||
|
||||
# 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"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
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
|
||||
|
||||
@@ -7,16 +7,24 @@ let
|
||||
|
||||
all = [
|
||||
# Cygwin
|
||||
"i686-cygwin" "x86_64-cygwin"
|
||||
"i686-cygwin"
|
||||
"x86_64-cygwin"
|
||||
|
||||
# Darwin
|
||||
"x86_64-darwin" "i686-darwin" "aarch64-darwin" "armv7a-darwin"
|
||||
"x86_64-darwin"
|
||||
"i686-darwin"
|
||||
"aarch64-darwin"
|
||||
"armv7a-darwin"
|
||||
|
||||
# FreeBSD
|
||||
"i686-freebsd" "x86_64-freebsd" "aarch64-freebsd"
|
||||
"i686-freebsd"
|
||||
"x86_64-freebsd"
|
||||
"aarch64-freebsd"
|
||||
|
||||
# Genode
|
||||
"aarch64-genode" "i686-genode" "x86_64-genode"
|
||||
"aarch64-genode"
|
||||
"i686-genode"
|
||||
"x86_64-genode"
|
||||
|
||||
# illumos
|
||||
"x86_64-solaris"
|
||||
@@ -25,94 +33,163 @@ let
|
||||
"javascript-ghcjs"
|
||||
|
||||
# Linux
|
||||
"aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux"
|
||||
"armv7l-linux" "i686-linux" "loongarch64-linux" "m68k-linux" "microblaze-linux"
|
||||
"microblazeel-linux" "mips-linux" "mips64-linux" "mips64el-linux"
|
||||
"mipsel-linux" "powerpc64-linux" "powerpc64le-linux" "riscv32-linux"
|
||||
"riscv64-linux" "s390-linux" "s390x-linux" "x86_64-linux"
|
||||
"aarch64-linux"
|
||||
"armv5tel-linux"
|
||||
"armv6l-linux"
|
||||
"armv7a-linux"
|
||||
"armv7l-linux"
|
||||
"i686-linux"
|
||||
"loongarch64-linux"
|
||||
"m68k-linux"
|
||||
"microblaze-linux"
|
||||
"microblazeel-linux"
|
||||
"mips-linux"
|
||||
"mips64-linux"
|
||||
"mips64el-linux"
|
||||
"mipsel-linux"
|
||||
"powerpc64-linux"
|
||||
"powerpc64le-linux"
|
||||
"riscv32-linux"
|
||||
"riscv64-linux"
|
||||
"s390-linux"
|
||||
"s390x-linux"
|
||||
"x86_64-linux"
|
||||
|
||||
# MMIXware
|
||||
"mmix-mmixware"
|
||||
|
||||
# NetBSD
|
||||
"aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd"
|
||||
"i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd"
|
||||
"riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd"
|
||||
"aarch64-netbsd"
|
||||
"armv6l-netbsd"
|
||||
"armv7a-netbsd"
|
||||
"armv7l-netbsd"
|
||||
"i686-netbsd"
|
||||
"m68k-netbsd"
|
||||
"mipsel-netbsd"
|
||||
"powerpc-netbsd"
|
||||
"riscv32-netbsd"
|
||||
"riscv64-netbsd"
|
||||
"x86_64-netbsd"
|
||||
|
||||
# none
|
||||
"aarch64_be-none" "aarch64-none" "arm-none" "armv6l-none" "avr-none" "i686-none"
|
||||
"microblaze-none" "microblazeel-none" "mips-none" "mips64-none" "msp430-none" "or1k-none" "m68k-none"
|
||||
"powerpc-none" "powerpcle-none" "riscv32-none" "riscv64-none" "rx-none"
|
||||
"s390-none" "s390x-none" "vc4-none" "x86_64-none"
|
||||
"aarch64_be-none"
|
||||
"aarch64-none"
|
||||
"arm-none"
|
||||
"armv6l-none"
|
||||
"avr-none"
|
||||
"i686-none"
|
||||
"microblaze-none"
|
||||
"microblazeel-none"
|
||||
"mips-none"
|
||||
"mips64-none"
|
||||
"msp430-none"
|
||||
"or1k-none"
|
||||
"m68k-none"
|
||||
"powerpc-none"
|
||||
"powerpcle-none"
|
||||
"riscv32-none"
|
||||
"riscv64-none"
|
||||
"rx-none"
|
||||
"s390-none"
|
||||
"s390x-none"
|
||||
"vc4-none"
|
||||
"x86_64-none"
|
||||
|
||||
# OpenBSD
|
||||
"i686-openbsd" "x86_64-openbsd"
|
||||
"i686-openbsd"
|
||||
"x86_64-openbsd"
|
||||
|
||||
# Redox
|
||||
"x86_64-redox"
|
||||
|
||||
# WASI
|
||||
"wasm64-wasi" "wasm32-wasi"
|
||||
"wasm64-wasi"
|
||||
"wasm32-wasi"
|
||||
|
||||
# Windows
|
||||
"aarch64-windows" "x86_64-windows" "i686-windows"
|
||||
"aarch64-windows"
|
||||
"x86_64-windows"
|
||||
"i686-windows"
|
||||
];
|
||||
|
||||
allParsed = map parse.mkSystemFromString all;
|
||||
|
||||
filterDoubles = f: map parse.doubleFromSystem (lists.filter f allParsed);
|
||||
|
||||
in {
|
||||
in
|
||||
{
|
||||
inherit all;
|
||||
|
||||
none = [];
|
||||
none = [ ];
|
||||
|
||||
arm = filterDoubles predicates.isAarch32;
|
||||
armv7 = filterDoubles predicates.isArmv7;
|
||||
aarch = filterDoubles predicates.isAarch;
|
||||
aarch64 = filterDoubles predicates.isAarch64;
|
||||
x86 = filterDoubles predicates.isx86;
|
||||
i686 = filterDoubles predicates.isi686;
|
||||
x86_64 = filterDoubles predicates.isx86_64;
|
||||
microblaze = filterDoubles predicates.isMicroBlaze;
|
||||
mips = filterDoubles predicates.isMips;
|
||||
mmix = filterDoubles predicates.isMmix;
|
||||
power = filterDoubles predicates.isPower;
|
||||
riscv = filterDoubles predicates.isRiscV;
|
||||
riscv32 = filterDoubles predicates.isRiscV32;
|
||||
riscv64 = filterDoubles predicates.isRiscV64;
|
||||
rx = filterDoubles predicates.isRx;
|
||||
vc4 = filterDoubles predicates.isVc4;
|
||||
or1k = filterDoubles predicates.isOr1k;
|
||||
m68k = filterDoubles predicates.isM68k;
|
||||
s390 = filterDoubles predicates.isS390;
|
||||
s390x = filterDoubles predicates.isS390x;
|
||||
loongarch64 = filterDoubles predicates.isLoongArch64;
|
||||
js = filterDoubles predicates.isJavaScript;
|
||||
arm = filterDoubles predicates.isAarch32;
|
||||
armv7 = filterDoubles predicates.isArmv7;
|
||||
aarch = filterDoubles predicates.isAarch;
|
||||
aarch64 = filterDoubles predicates.isAarch64;
|
||||
x86 = filterDoubles predicates.isx86;
|
||||
i686 = filterDoubles predicates.isi686;
|
||||
x86_64 = filterDoubles predicates.isx86_64;
|
||||
microblaze = filterDoubles predicates.isMicroBlaze;
|
||||
mips = filterDoubles predicates.isMips;
|
||||
mmix = filterDoubles predicates.isMmix;
|
||||
power = filterDoubles predicates.isPower;
|
||||
riscv = filterDoubles predicates.isRiscV;
|
||||
riscv32 = filterDoubles predicates.isRiscV32;
|
||||
riscv64 = filterDoubles predicates.isRiscV64;
|
||||
rx = filterDoubles predicates.isRx;
|
||||
vc4 = filterDoubles predicates.isVc4;
|
||||
or1k = filterDoubles predicates.isOr1k;
|
||||
m68k = filterDoubles predicates.isM68k;
|
||||
s390 = filterDoubles predicates.isS390;
|
||||
s390x = filterDoubles predicates.isS390x;
|
||||
loongarch64 = filterDoubles predicates.isLoongArch64;
|
||||
js = filterDoubles predicates.isJavaScript;
|
||||
|
||||
bigEndian = filterDoubles predicates.isBigEndian;
|
||||
littleEndian = filterDoubles predicates.isLittleEndian;
|
||||
bigEndian = filterDoubles predicates.isBigEndian;
|
||||
littleEndian = filterDoubles predicates.isLittleEndian;
|
||||
|
||||
cygwin = filterDoubles predicates.isCygwin;
|
||||
darwin = filterDoubles predicates.isDarwin;
|
||||
freebsd = filterDoubles predicates.isFreeBSD;
|
||||
cygwin = filterDoubles predicates.isCygwin;
|
||||
darwin = filterDoubles predicates.isDarwin;
|
||||
freebsd = filterDoubles predicates.isFreeBSD;
|
||||
# Should be better, but MinGW is unclear.
|
||||
gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; })
|
||||
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; })
|
||||
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; })
|
||||
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabin32; })
|
||||
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabi64; })
|
||||
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabielfv1; })
|
||||
++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabielfv2; });
|
||||
illumos = filterDoubles predicates.isSunOS;
|
||||
linux = filterDoubles predicates.isLinux;
|
||||
netbsd = filterDoubles predicates.isNetBSD;
|
||||
openbsd = filterDoubles predicates.isOpenBSD;
|
||||
unix = filterDoubles predicates.isUnix;
|
||||
wasi = filterDoubles predicates.isWasi;
|
||||
redox = filterDoubles predicates.isRedox;
|
||||
windows = filterDoubles predicates.isWindows;
|
||||
genode = filterDoubles predicates.isGenode;
|
||||
gnu =
|
||||
filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnu;
|
||||
})
|
||||
++ filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnueabi;
|
||||
})
|
||||
++ filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnueabihf;
|
||||
})
|
||||
++ filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnuabin32;
|
||||
})
|
||||
++ filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnuabi64;
|
||||
})
|
||||
++ filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnuabielfv1;
|
||||
})
|
||||
++ filterDoubles (matchAttrs {
|
||||
kernel = parse.kernels.linux;
|
||||
abi = parse.abis.gnuabielfv2;
|
||||
});
|
||||
illumos = filterDoubles predicates.isSunOS;
|
||||
linux = filterDoubles predicates.isLinux;
|
||||
netbsd = filterDoubles predicates.isNetBSD;
|
||||
openbsd = filterDoubles predicates.isOpenBSD;
|
||||
unix = filterDoubles predicates.isUnix;
|
||||
wasi = filterDoubles predicates.isWasi;
|
||||
redox = filterDoubles predicates.isRedox;
|
||||
windows = filterDoubles predicates.isWindows;
|
||||
genode = filterDoubles predicates.isGenode;
|
||||
|
||||
embedded = filterDoubles predicates.isNone;
|
||||
embedded = filterDoubles predicates.isNone;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,9 @@ rec {
|
||||
};
|
||||
ppc64-musl = {
|
||||
config = "powerpc64-unknown-linux-musl";
|
||||
gcc = { abi = "elfv2"; };
|
||||
gcc = {
|
||||
abi = "elfv2";
|
||||
};
|
||||
};
|
||||
|
||||
sheevaplug = {
|
||||
@@ -95,16 +97,28 @@ rec {
|
||||
} // platforms.fuloong2f_n32;
|
||||
|
||||
# can execute on 32bit chip
|
||||
mips-linux-gnu = { config = "mips-unknown-linux-gnu"; } // platforms.gcc_mips32r2_o32;
|
||||
mipsel-linux-gnu = { config = "mipsel-unknown-linux-gnu"; } // platforms.gcc_mips32r2_o32;
|
||||
mips-linux-gnu = {
|
||||
config = "mips-unknown-linux-gnu";
|
||||
} // platforms.gcc_mips32r2_o32;
|
||||
mipsel-linux-gnu = {
|
||||
config = "mipsel-unknown-linux-gnu";
|
||||
} // 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;
|
||||
mips64el-linux-gnuabin32 = { config = "mips64el-unknown-linux-gnuabin32"; } // platforms.gcc_mips64r2_n32;
|
||||
mips64-linux-gnuabin32 = {
|
||||
config = "mips64-unknown-linux-gnuabin32";
|
||||
} // platforms.gcc_mips64r2_n32;
|
||||
mips64el-linux-gnuabin32 = {
|
||||
config = "mips64el-unknown-linux-gnuabin32";
|
||||
} // platforms.gcc_mips64r2_n32;
|
||||
|
||||
# 64bit pointers
|
||||
mips64-linux-gnuabi64 = { config = "mips64-unknown-linux-gnuabi64"; } // platforms.gcc_mips64r2_64;
|
||||
mips64el-linux-gnuabi64 = { config = "mips64el-unknown-linux-gnuabi64"; } // platforms.gcc_mips64r2_64;
|
||||
mips64-linux-gnuabi64 = {
|
||||
config = "mips64-unknown-linux-gnuabi64";
|
||||
} // platforms.gcc_mips64r2_64;
|
||||
mips64el-linux-gnuabi64 = {
|
||||
config = "mips64el-unknown-linux-gnuabi64";
|
||||
} // platforms.gcc_mips64r2_64;
|
||||
|
||||
muslpi = raspberryPi // {
|
||||
config = "armv6l-unknown-linux-musleabihf";
|
||||
@@ -114,12 +128,20 @@ rec {
|
||||
config = "aarch64-unknown-linux-musl";
|
||||
};
|
||||
|
||||
gnu64 = { config = "x86_64-unknown-linux-gnu"; };
|
||||
gnu64 = {
|
||||
config = "x86_64-unknown-linux-gnu";
|
||||
};
|
||||
gnu64_simplekernel = gnu64 // platforms.pc_simplekernel; # see test/cross/default.nix
|
||||
gnu32 = { config = "i686-unknown-linux-gnu"; };
|
||||
gnu32 = {
|
||||
config = "i686-unknown-linux-gnu";
|
||||
};
|
||||
|
||||
musl64 = { config = "x86_64-unknown-linux-musl"; };
|
||||
musl32 = { config = "i686-unknown-linux-musl"; };
|
||||
musl64 = {
|
||||
config = "x86_64-unknown-linux-musl";
|
||||
};
|
||||
musl32 = {
|
||||
config = "i686-unknown-linux-musl";
|
||||
};
|
||||
|
||||
riscv64 = riscv "64";
|
||||
riscv32 = riscv "32";
|
||||
@@ -294,13 +316,13 @@ rec {
|
||||
aarch64-darwin = {
|
||||
config = "aarch64-apple-darwin";
|
||||
xcodePlatform = "MacOSX";
|
||||
platform = {};
|
||||
platform = { };
|
||||
};
|
||||
|
||||
x86_64-darwin = {
|
||||
config = "x86_64-apple-darwin";
|
||||
xcodePlatform = "MacOSX";
|
||||
platform = {};
|
||||
platform = { };
|
||||
};
|
||||
|
||||
#
|
||||
|
||||
@@ -38,124 +38,429 @@ rec {
|
||||
# `lib.attrsets.matchAttrs`, which requires a match on *all* attributes of
|
||||
# the product.
|
||||
|
||||
isi686 = { cpu = cpuTypes.i686; };
|
||||
isx86_32 = { cpu = { family = "x86"; bits = 32; }; };
|
||||
isx86_64 = { cpu = { family = "x86"; bits = 64; }; };
|
||||
isPower = { cpu = { family = "power"; }; };
|
||||
isPower64 = { cpu = { family = "power"; bits = 64; }; };
|
||||
isi686 = {
|
||||
cpu = cpuTypes.i686;
|
||||
};
|
||||
isx86_32 = {
|
||||
cpu = {
|
||||
family = "x86";
|
||||
bits = 32;
|
||||
};
|
||||
};
|
||||
isx86_64 = {
|
||||
cpu = {
|
||||
family = "x86";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isPower = {
|
||||
cpu = {
|
||||
family = "power";
|
||||
};
|
||||
};
|
||||
isPower64 = {
|
||||
cpu = {
|
||||
family = "power";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
# This ABI is the default in NixOS PowerPC64 BE, but not on mainline GCC,
|
||||
# so it sometimes causes issues in certain packages that makes the wrong
|
||||
# assumption on the used ABI.
|
||||
isAbiElfv2 = [
|
||||
{ abi = { abi = "elfv2"; }; }
|
||||
{ abi = { name = "musl"; }; cpu = { family = "power"; bits = 64; }; }
|
||||
{
|
||||
abi = {
|
||||
abi = "elfv2";
|
||||
};
|
||||
}
|
||||
{
|
||||
abi = {
|
||||
name = "musl";
|
||||
};
|
||||
cpu = {
|
||||
family = "power";
|
||||
bits = 64;
|
||||
};
|
||||
}
|
||||
];
|
||||
isx86 = { cpu = { family = "x86"; }; };
|
||||
isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
|
||||
isArmv7 = map ({ arch, ... }: { cpu = { inherit arch; }; })
|
||||
(filter (cpu: hasPrefix "armv7" cpu.arch or "")
|
||||
(attrValues cpuTypes));
|
||||
isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
|
||||
isAarch = { cpu = { family = "arm"; }; };
|
||||
isMicroBlaze = { cpu = { family = "microblaze"; }; };
|
||||
isMips = { cpu = { family = "mips"; }; };
|
||||
isMips32 = { cpu = { family = "mips"; bits = 32; }; };
|
||||
isMips64 = { cpu = { family = "mips"; bits = 64; }; };
|
||||
isMips64n32 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "n32"; }; };
|
||||
isMips64n64 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "64"; }; };
|
||||
isMmix = { cpu = { family = "mmix"; }; };
|
||||
isRiscV = { cpu = { family = "riscv"; }; };
|
||||
isRiscV32 = { cpu = { family = "riscv"; bits = 32; }; };
|
||||
isRiscV64 = { cpu = { family = "riscv"; bits = 64; }; };
|
||||
isRx = { cpu = { family = "rx"; }; };
|
||||
isSparc = { cpu = { family = "sparc"; }; };
|
||||
isSparc64 = { cpu = { family = "sparc"; bits = 64; }; };
|
||||
isWasm = { cpu = { family = "wasm"; }; };
|
||||
isMsp430 = { cpu = { family = "msp430"; }; };
|
||||
isVc4 = { cpu = { family = "vc4"; }; };
|
||||
isAvr = { cpu = { family = "avr"; }; };
|
||||
isAlpha = { cpu = { family = "alpha"; }; };
|
||||
isOr1k = { cpu = { family = "or1k"; }; };
|
||||
isM68k = { cpu = { family = "m68k"; }; };
|
||||
isS390 = { cpu = { family = "s390"; }; };
|
||||
isS390x = { cpu = { family = "s390"; bits = 64; }; };
|
||||
isLoongArch64 = { cpu = { family = "loongarch"; bits = 64; }; };
|
||||
isJavaScript = { cpu = cpuTypes.javascript; };
|
||||
isx86 = {
|
||||
cpu = {
|
||||
family = "x86";
|
||||
};
|
||||
};
|
||||
isAarch32 = {
|
||||
cpu = {
|
||||
family = "arm";
|
||||
bits = 32;
|
||||
};
|
||||
};
|
||||
isArmv7 = map (
|
||||
{ arch, ... }:
|
||||
{
|
||||
cpu = { inherit arch; };
|
||||
}
|
||||
) (filter (cpu: hasPrefix "armv7" cpu.arch or "") (attrValues cpuTypes));
|
||||
isAarch64 = {
|
||||
cpu = {
|
||||
family = "arm";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isAarch = {
|
||||
cpu = {
|
||||
family = "arm";
|
||||
};
|
||||
};
|
||||
isMicroBlaze = {
|
||||
cpu = {
|
||||
family = "microblaze";
|
||||
};
|
||||
};
|
||||
isMips = {
|
||||
cpu = {
|
||||
family = "mips";
|
||||
};
|
||||
};
|
||||
isMips32 = {
|
||||
cpu = {
|
||||
family = "mips";
|
||||
bits = 32;
|
||||
};
|
||||
};
|
||||
isMips64 = {
|
||||
cpu = {
|
||||
family = "mips";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isMips64n32 = {
|
||||
cpu = {
|
||||
family = "mips";
|
||||
bits = 64;
|
||||
};
|
||||
abi = {
|
||||
abi = "n32";
|
||||
};
|
||||
};
|
||||
isMips64n64 = {
|
||||
cpu = {
|
||||
family = "mips";
|
||||
bits = 64;
|
||||
};
|
||||
abi = {
|
||||
abi = "64";
|
||||
};
|
||||
};
|
||||
isMmix = {
|
||||
cpu = {
|
||||
family = "mmix";
|
||||
};
|
||||
};
|
||||
isRiscV = {
|
||||
cpu = {
|
||||
family = "riscv";
|
||||
};
|
||||
};
|
||||
isRiscV32 = {
|
||||
cpu = {
|
||||
family = "riscv";
|
||||
bits = 32;
|
||||
};
|
||||
};
|
||||
isRiscV64 = {
|
||||
cpu = {
|
||||
family = "riscv";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isRx = {
|
||||
cpu = {
|
||||
family = "rx";
|
||||
};
|
||||
};
|
||||
isSparc = {
|
||||
cpu = {
|
||||
family = "sparc";
|
||||
};
|
||||
};
|
||||
isSparc64 = {
|
||||
cpu = {
|
||||
family = "sparc";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isWasm = {
|
||||
cpu = {
|
||||
family = "wasm";
|
||||
};
|
||||
};
|
||||
isMsp430 = {
|
||||
cpu = {
|
||||
family = "msp430";
|
||||
};
|
||||
};
|
||||
isVc4 = {
|
||||
cpu = {
|
||||
family = "vc4";
|
||||
};
|
||||
};
|
||||
isAvr = {
|
||||
cpu = {
|
||||
family = "avr";
|
||||
};
|
||||
};
|
||||
isAlpha = {
|
||||
cpu = {
|
||||
family = "alpha";
|
||||
};
|
||||
};
|
||||
isOr1k = {
|
||||
cpu = {
|
||||
family = "or1k";
|
||||
};
|
||||
};
|
||||
isM68k = {
|
||||
cpu = {
|
||||
family = "m68k";
|
||||
};
|
||||
};
|
||||
isS390 = {
|
||||
cpu = {
|
||||
family = "s390";
|
||||
};
|
||||
};
|
||||
isS390x = {
|
||||
cpu = {
|
||||
family = "s390";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isLoongArch64 = {
|
||||
cpu = {
|
||||
family = "loongarch";
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isJavaScript = {
|
||||
cpu = cpuTypes.javascript;
|
||||
};
|
||||
|
||||
is32bit = { cpu = { bits = 32; }; };
|
||||
is64bit = { cpu = { bits = 64; }; };
|
||||
isILP32 = [ { cpu = { family = "wasm"; bits = 32; }; } ] ++
|
||||
map (a: { abi = { abi = a; }; }) [ "n32" "ilp32" "x32" ];
|
||||
isBigEndian = { cpu = { significantByte = significantBytes.bigEndian; }; };
|
||||
isLittleEndian = { cpu = { significantByte = significantBytes.littleEndian; }; };
|
||||
is32bit = {
|
||||
cpu = {
|
||||
bits = 32;
|
||||
};
|
||||
};
|
||||
is64bit = {
|
||||
cpu = {
|
||||
bits = 64;
|
||||
};
|
||||
};
|
||||
isILP32 =
|
||||
[
|
||||
{
|
||||
cpu = {
|
||||
family = "wasm";
|
||||
bits = 32;
|
||||
};
|
||||
}
|
||||
]
|
||||
++ map
|
||||
(a: {
|
||||
abi = {
|
||||
abi = a;
|
||||
};
|
||||
})
|
||||
[
|
||||
"n32"
|
||||
"ilp32"
|
||||
"x32"
|
||||
];
|
||||
isBigEndian = {
|
||||
cpu = {
|
||||
significantByte = significantBytes.bigEndian;
|
||||
};
|
||||
};
|
||||
isLittleEndian = {
|
||||
cpu = {
|
||||
significantByte = significantBytes.littleEndian;
|
||||
};
|
||||
};
|
||||
|
||||
isBSD = { kernel = { families = { inherit (kernelFamilies) bsd; }; }; };
|
||||
isDarwin = { kernel = { families = { inherit (kernelFamilies) darwin; }; }; };
|
||||
isUnix = [ isBSD isDarwin isLinux isSunOS isCygwin isRedox ];
|
||||
isBSD = {
|
||||
kernel = {
|
||||
families = { inherit (kernelFamilies) bsd; };
|
||||
};
|
||||
};
|
||||
isDarwin = {
|
||||
kernel = {
|
||||
families = { inherit (kernelFamilies) darwin; };
|
||||
};
|
||||
};
|
||||
isUnix = [
|
||||
isBSD
|
||||
isDarwin
|
||||
isLinux
|
||||
isSunOS
|
||||
isCygwin
|
||||
isRedox
|
||||
];
|
||||
|
||||
isMacOS = { kernel = kernels.macos; };
|
||||
isiOS = { kernel = kernels.ios; };
|
||||
isLinux = { kernel = kernels.linux; };
|
||||
isSunOS = { kernel = kernels.solaris; };
|
||||
isFreeBSD = { kernel = { name = "freebsd"; }; };
|
||||
isNetBSD = { kernel = kernels.netbsd; };
|
||||
isOpenBSD = { kernel = kernels.openbsd; };
|
||||
isWindows = { kernel = kernels.windows; };
|
||||
isCygwin = { kernel = kernels.windows; abi = abis.cygnus; };
|
||||
isMinGW = { kernel = kernels.windows; abi = abis.gnu; };
|
||||
isWasi = { kernel = kernels.wasi; };
|
||||
isRedox = { kernel = kernels.redox; };
|
||||
isGhcjs = { kernel = kernels.ghcjs; };
|
||||
isGenode = { kernel = kernels.genode; };
|
||||
isNone = { kernel = kernels.none; };
|
||||
isMacOS = {
|
||||
kernel = kernels.macos;
|
||||
};
|
||||
isiOS = {
|
||||
kernel = kernels.ios;
|
||||
};
|
||||
isLinux = {
|
||||
kernel = kernels.linux;
|
||||
};
|
||||
isSunOS = {
|
||||
kernel = kernels.solaris;
|
||||
};
|
||||
isFreeBSD = {
|
||||
kernel = {
|
||||
name = "freebsd";
|
||||
};
|
||||
};
|
||||
isNetBSD = {
|
||||
kernel = kernels.netbsd;
|
||||
};
|
||||
isOpenBSD = {
|
||||
kernel = kernels.openbsd;
|
||||
};
|
||||
isWindows = {
|
||||
kernel = kernels.windows;
|
||||
};
|
||||
isCygwin = {
|
||||
kernel = kernels.windows;
|
||||
abi = abis.cygnus;
|
||||
};
|
||||
isMinGW = {
|
||||
kernel = kernels.windows;
|
||||
abi = abis.gnu;
|
||||
};
|
||||
isWasi = {
|
||||
kernel = kernels.wasi;
|
||||
};
|
||||
isRedox = {
|
||||
kernel = kernels.redox;
|
||||
};
|
||||
isGhcjs = {
|
||||
kernel = kernels.ghcjs;
|
||||
};
|
||||
isGenode = {
|
||||
kernel = kernels.genode;
|
||||
};
|
||||
isNone = {
|
||||
kernel = kernels.none;
|
||||
};
|
||||
|
||||
isAndroid = [ { abi = abis.android; } { abi = abis.androideabi; } ];
|
||||
isGnu = with abis; map (a: { abi = a; }) [ gnuabi64 gnuabin32 gnu gnueabi gnueabihf gnuabielfv1 gnuabielfv2 ];
|
||||
isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf muslabin32 muslabi64 ];
|
||||
isUClibc = with abis; map (a: { abi = a; }) [ uclibc uclibceabi uclibceabihf ];
|
||||
isLLVMLibc = [ { abi = abis.llvm; } ];
|
||||
isAndroid = [
|
||||
{ abi = abis.android; }
|
||||
{ abi = abis.androideabi; }
|
||||
];
|
||||
isGnu =
|
||||
with abis;
|
||||
map (a: { abi = a; }) [
|
||||
gnuabi64
|
||||
gnuabin32
|
||||
gnu
|
||||
gnueabi
|
||||
gnueabihf
|
||||
gnuabielfv1
|
||||
gnuabielfv2
|
||||
];
|
||||
isMusl =
|
||||
with abis;
|
||||
map (a: { abi = a; }) [
|
||||
musl
|
||||
musleabi
|
||||
musleabihf
|
||||
muslabin32
|
||||
muslabi64
|
||||
];
|
||||
isUClibc =
|
||||
with abis;
|
||||
map (a: { abi = a; }) [
|
||||
uclibc
|
||||
uclibceabi
|
||||
uclibceabihf
|
||||
];
|
||||
isLLVMLibc = [ { abi = abis.llvm; } ];
|
||||
|
||||
isEfi = [
|
||||
{ cpu = { family = "arm"; version = "6"; }; }
|
||||
{ cpu = { family = "arm"; version = "7"; }; }
|
||||
{ cpu = { family = "arm"; version = "8"; }; }
|
||||
{ cpu = { family = "riscv"; }; }
|
||||
{ cpu = { family = "x86"; }; }
|
||||
{
|
||||
cpu = {
|
||||
family = "arm";
|
||||
version = "6";
|
||||
};
|
||||
}
|
||||
{
|
||||
cpu = {
|
||||
family = "arm";
|
||||
version = "7";
|
||||
};
|
||||
}
|
||||
{
|
||||
cpu = {
|
||||
family = "arm";
|
||||
version = "8";
|
||||
};
|
||||
}
|
||||
{
|
||||
cpu = {
|
||||
family = "riscv";
|
||||
};
|
||||
}
|
||||
{
|
||||
cpu = {
|
||||
family = "x86";
|
||||
};
|
||||
}
|
||||
];
|
||||
|
||||
isElf = { kernel.execFormat = execFormats.elf; };
|
||||
isMacho = { kernel.execFormat = execFormats.macho; };
|
||||
isElf = {
|
||||
kernel.execFormat = execFormats.elf;
|
||||
};
|
||||
isMacho = {
|
||||
kernel.execFormat = execFormats.macho;
|
||||
};
|
||||
};
|
||||
|
||||
# given two patterns, return a pattern which is their logical AND.
|
||||
# Since a pattern is a list-of-disjuncts, this needs to
|
||||
patternLogicalAnd = pat1_: pat2_:
|
||||
patternLogicalAnd =
|
||||
pat1_: pat2_:
|
||||
let
|
||||
# patterns can be either a list or a (bare) singleton; turn
|
||||
# them into singletons for uniform handling
|
||||
pat1 = toList pat1_;
|
||||
pat2 = toList pat2_;
|
||||
in
|
||||
concatMap (attr1:
|
||||
map (attr2:
|
||||
recursiveUpdateUntil
|
||||
(path: subattr1: subattr2:
|
||||
if (builtins.intersectAttrs subattr1 subattr2) == {} || subattr1 == subattr2
|
||||
then true
|
||||
else throw ''
|
||||
pattern conflict at path ${toString path}:
|
||||
${toJSON subattr1}
|
||||
${toJSON subattr2}
|
||||
'')
|
||||
attr1
|
||||
attr2
|
||||
)
|
||||
pat2)
|
||||
pat1;
|
||||
concatMap (
|
||||
attr1:
|
||||
map (
|
||||
attr2:
|
||||
recursiveUpdateUntil (
|
||||
path: subattr1: subattr2:
|
||||
if (builtins.intersectAttrs subattr1 subattr2) == { } || subattr1 == subattr2 then
|
||||
true
|
||||
else
|
||||
throw ''
|
||||
pattern conflict at path ${toString path}:
|
||||
${toJSON subattr1}
|
||||
${toJSON subattr2}
|
||||
''
|
||||
) attr1 attr2
|
||||
) pat2
|
||||
) pat1;
|
||||
|
||||
matchAnyAttrs = patterns:
|
||||
if isList patterns then attrs: any (pattern: matchAttrs pattern attrs) patterns
|
||||
else matchAttrs patterns;
|
||||
matchAnyAttrs =
|
||||
patterns:
|
||||
if isList patterns then
|
||||
attrs: any (pattern: matchAttrs pattern attrs) patterns
|
||||
else
|
||||
matchAttrs patterns;
|
||||
|
||||
predicates = mapAttrs (_: matchAnyAttrs) patterns;
|
||||
|
||||
@@ -164,7 +469,9 @@ rec {
|
||||
# that `lib.meta.availableOn` can distinguish them from the patterns which
|
||||
# apply only to the `parsed` field.
|
||||
|
||||
platformPatterns = mapAttrs (_: p: { parsed = {}; } // p) {
|
||||
isStatic = { isStatic = true; };
|
||||
platformPatterns = mapAttrs (_: p: { parsed = { }; } // p) {
|
||||
isStatic = {
|
||||
isStatic = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user