···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; };
425425- "3" = # Awkward hacks, beware!
426426- if elemAt l 1 == "apple"
427427- then { cpu = elemAt l 0; vendor = "apple"; kernel = elemAt l 2; }
428428- else if (elemAt l 1 == "linux") || (elemAt l 2 == "gnu")
429429- then { cpu = elemAt l 0; kernel = elemAt l 1; abi = elemAt l 2; }
430430- else if (elemAt l 2 == "mingw32") # autotools breaks on -gnu for window
431431- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "windows"; }
432432- else if (elemAt l 2 == "wasi")
433433- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "wasi"; }
434434- else if (elemAt l 2 == "redox")
435435- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "redox"; }
436436- else if (elemAt l 2 == "mmixware")
437437- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = "mmixware"; }
438438- else if hasPrefix "freebsd" (elemAt l 2)
439439- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; }
440440- else if hasPrefix "netbsd" (elemAt l 2)
441441- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; }
442442- else if (elem (elemAt l 2) ["eabi" "eabihf" "elf"])
443443- then { cpu = elemAt l 0; vendor = "unknown"; kernel = elemAt l 1; abi = elemAt l 2; }
444444- else if (elemAt l 2 == "ghcjs")
445445- then { cpu = elemAt l 0; vendor = "unknown"; kernel = elemAt l 2; }
446446- else if hasPrefix "genode" (elemAt l 2)
447447- then { cpu = elemAt l 0; vendor = elemAt l 1; kernel = elemAt l 2; }
425425+ "3" =
426426+ # cpu-kernel-environment
427427+ if elemAt l 1 == "linux" ||
428428+ elem (elemAt l 2) ["eabi" "eabihf" "elf" "gnu"]
429429+ then {
430430+ cpu = elemAt l 0;
431431+ kernel = elemAt l 1;
432432+ abi = elemAt l 2;
433433+ vendor = "unknown";
434434+ }
435435+ # cpu-vendor-os
436436+ else if elemAt l 1 == "apple" ||
437437+ elem (elemAt l 2) [ "wasi" "redox" "mmixware" "ghcjs" "mingw32" ] ||
438438+ hasPrefix "freebsd" (elemAt l 2) ||
439439+ hasPrefix "netbsd" (elemAt l 2) ||
440440+ hasPrefix "genode" (elemAt l 2)
441441+ then {
442442+ cpu = elemAt l 0;
443443+ vendor = elemAt l 1;
444444+ kernel = if elemAt l 2 == "mingw32"
445445+ then "windows" # autotools breaks on -gnu for window
446446+ else elemAt l 2;
447447+ }
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)}