Skip to content

Commit 36a566b

Browse files
Adam JosephEricson2314
andcommitted
lib/systems/parse.nix: mkSkeletonFromList: improve readability
The main purpose of this PR is to make the basis for `mkSkeletonFromList`'s decision between `cpu-kernel-libcabi` vs `cpu-vendor-os` clear, without changing its behavior. The existing code obscures this decision behind a sequence of prioritized matches (i.e. `if-then`) which jump around between different coordinates. Two side benefits of this PR: 1. It makes the root cause of #165836 obvious: we are missing a case for `cpu-vendor-libcabi`. This is why nixpkgs stumbles over `*-none-*`. 2. It illuminates some very weird corner cases in the existing logic, like `*-${vendor}-ghcjs` overriding the `vendor` field, and `mingw32` being transformed into `windows` in some cases. Co-authored-by: John Ericson <git@JohnEricson.me>
1 parent 4f34f4a commit 36a566b

1 file changed

Lines changed: 23 additions & 23 deletions

File tree

lib/systems/parse.nix

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -422,29 +422,29 @@ rec {
422422
else if (elemAt l 1) == "elf"
423423
then { cpu = elemAt l 0; vendor = "unknown"; kernel = "none"; abi = elemAt l 1; }
424424
else { cpu = elemAt l 0; kernel = elemAt l 1; };
425-
"3" = # Awkward hacks, beware!
426-
if elemAt l 1 == "apple"
427-
then { cpu = elemAt l 0; vendor = "apple"; kernel = elemAt l 2; }
428-
else if (elemAt l 1 == "linux") || (elemAt l 2 == "gnu")
429-
then { cpu = elemAt l 0; kernel = elemAt l 1; abi = elemAt l 2; }
430-
else if (elemAt l 2 == "mingw32") # autotools breaks on -gnu for window
431-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "windows"; }
432-
else if (elemAt l 2 == "wasi")
433-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "wasi"; }
434-
else if (elemAt l 2 == "redox")
435-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "redox"; }
436-
else if (elemAt l 2 == "mmixware")
437-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "mmixware"; }
438-
else if hasPrefix "freebsd" (elemAt l 2)
439-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; }
440-
else if hasPrefix "netbsd" (elemAt l 2)
441-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; }
442-
else if (elem (elemAt l 2) ["eabi" "eabihf" "elf"])
443-
then { cpu = elemAt l 0; vendor = "unknown"; kernel = elemAt l 1; abi = elemAt l 2; }
444-
else if (elemAt l 2 == "ghcjs")
445-
then { cpu = elemAt l 0; vendor = "unknown"; kernel = elemAt l 2; }
446-
else if hasPrefix "genode" (elemAt l 2)
447-
then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; }
425+
"3" =
426+
# cpu-kernel-environment
427+
if elemAt l 1 == "linux" ||
428+
elem (elemAt l 2) ["eabi" "eabihf" "elf" "gnu"]
429+
then {
430+
cpu = elemAt l 0;
431+
kernel = elemAt l 1;
432+
abi = elemAt l 2;
433+
vendor = "unknown";
434+
}
435+
# cpu-vendor-os
436+
else if elemAt l 1 == "apple" ||
437+
elem (elemAt l 2) [ "wasi" "redox" "mmixware" "ghcjs" "mingw32" ] ||
438+
hasPrefix "freebsd" (elemAt l 2) ||
439+
hasPrefix "netbsd" (elemAt l 2) ||
440+
hasPrefix "genode" (elemAt l 2)
441+
then {
442+
cpu = elemAt l 0;
443+
vendor = elemAt l 1;
444+
kernel = if elemAt l 2 == "mingw32"
445+
then "windows" # autotools breaks on -gnu for window
446+
else elemAt l 2;
447+
}
448448
else throw "Target specification with 3 components is ambiguous";
449449
"4" = { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; abi = elemAt l 3; };
450450
}.${toString (length l)}

0 commit comments

Comments
 (0)