From 36a566b78fe4904913c1c8d16e75da1a7aa6eadb Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Sun, 10 Jul 2022 01:59:54 -0700 Subject: 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 --- lib/systems/parse.nix | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) (limited to 'lib/systems') diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix index d8ba251503a63..43e4473667d50 100644 --- a/lib/systems/parse.nix +++ b/lib/systems/parse.nix @@ -422,29 +422,29 @@ rec { else if (elemAt l 1) == "elf" then { cpu = elemAt l 0; vendor = "unknown"; kernel = "none"; abi = elemAt l 1; } else { cpu = elemAt l 0; kernel = elemAt l 1; }; - "3" = # Awkward hacks, beware! - if elemAt l 1 == "apple" - then { cpu = elemAt l 0; vendor = "apple"; kernel = elemAt l 2; } - else if (elemAt l 1 == "linux") || (elemAt l 2 == "gnu") - then { cpu = elemAt l 0; kernel = elemAt l 1; abi = elemAt l 2; } - else if (elemAt l 2 == "mingw32") # autotools breaks on -gnu for window - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "windows"; } - else if (elemAt l 2 == "wasi") - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "wasi"; } - else if (elemAt l 2 == "redox") - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "redox"; } - else if (elemAt l 2 == "mmixware") - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "mmixware"; } - else if hasPrefix "freebsd" (elemAt l 2) - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; } - else if hasPrefix "netbsd" (elemAt l 2) - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; } - else if (elem (elemAt l 2) ["eabi" "eabihf" "elf"]) - then { cpu = elemAt l 0; vendor = "unknown"; kernel = elemAt l 1; abi = elemAt l 2; } - else if (elemAt l 2 == "ghcjs") - then { cpu = elemAt l 0; vendor = "unknown"; kernel = elemAt l 2; } - else if hasPrefix "genode" (elemAt l 2) - then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; } + "3" = + # cpu-kernel-environment + if elemAt l 1 == "linux" || + elem (elemAt l 2) ["eabi" "eabihf" "elf" "gnu"] + then { + cpu = elemAt l 0; + kernel = elemAt l 1; + abi = elemAt l 2; + vendor = "unknown"; + } + # cpu-vendor-os + else if elemAt l 1 == "apple" || + elem (elemAt l 2) [ "wasi" "redox" "mmixware" "ghcjs" "mingw32" ] || + hasPrefix "freebsd" (elemAt l 2) || + hasPrefix "netbsd" (elemAt l 2) || + hasPrefix "genode" (elemAt l 2) + then { + cpu = elemAt l 0; + vendor = elemAt l 1; + kernel = if elemAt l 2 == "mingw32" + then "windows" # autotools breaks on -gnu for window + else elemAt l 2; + } else throw "Target specification with 3 components is ambiguous"; "4" = { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; abi = elemAt l 3; }; }.${toString (length l)} -- cgit 1.4.1