From add81e270cf5be0dae19ef1baf557c18fa3bc479 Mon Sep 17 00:00:00 2001 From: Eman Resu <78693624+quatquatt@users.noreply.github.com> Date: Sat, 16 May 2026 14:09:45 -0400 Subject: [PATCH] lib.systems.doubles: only typecheck in CI --- ci/OWNERS | 2 +- lib/systems/doubles.nix | 22 +++++++++++++++++++--- lib/systems/parse.nix | 6 ++++-- lib/tests/systems.nix | 16 ++++++++++++++++ 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/ci/OWNERS b/ci/OWNERS index 43ef6f666651..463c546e695b 100644 --- a/ci/OWNERS +++ b/ci/OWNERS @@ -39,6 +39,7 @@ /lib/derivations.nix @NixOS/stdenv /lib/fetchers.nix @alyssais @NixOS/stdenv /lib/meta.nix @alyssais @NixOS/stdenv +/lib/meta-types.nix @infinisil @adisbladis @NixOS/stdenv /lib/source-types.nix @alyssais @NixOS/stdenv /lib/systems @alyssais @NixOS/stdenv ## Libraries / Module system @@ -67,7 +68,6 @@ /pkgs/stdenv/generic/problems.nix @infinisil /pkgs/test/problems @infinisil /pkgs/stdenv/generic/check-meta.nix @infinisil @Ericson2314 @adisbladis @NixOS/stdenv -/pkgs/stdenv/generic/meta-types.nix @infinisil @adisbladis @NixOS/stdenv /pkgs/stdenv/cross @Ericson2314 @NixOS/stdenv /pkgs/build-support @philiptaron /pkgs/build-support/cc-wrapper @Ericson2314 diff --git a/lib/systems/doubles.nix b/lib/systems/doubles.nix index e9fa908dfc88..d3e184320fbd 100644 --- a/lib/systems/doubles.nix +++ b/lib/systems/doubles.nix @@ -1,7 +1,15 @@ { lib }: let - inherit (lib) lists; + inherit (lib) + lists + splitString + ; inherit (lib.systems) parse; + inherit (parse) + mkSystemFromSkeleton + mkSkeletonFromList + doubleFromSystem + ; inherit (lib.systems.inspect) predicates; inherit (lib.attrsets) matchAttrs; @@ -117,9 +125,17 @@ let "x86_64-uefi" ]; - allParsed = map parse.mkSystemFromString all; + uncheckedSystemFromString = + let + systemType = { + _type = "system"; + }; + in + s: mkSystemFromSkeleton (mkSkeletonFromList (splitString "-" s)) // systemType; - filterDoubles = f: map parse.doubleFromSystem (lists.filter f allParsed); + allParsed = map uncheckedSystemFromString all; + + filterDoubles = f: map doubleFromSystem (lists.filter f allParsed); in { diff --git a/lib/systems/parse.nix b/lib/systems/parse.nix index e8e5a7799014..cdfeafe7c18d 100644 --- a/lib/systems/parse.nix +++ b/lib/systems/parse.nix @@ -903,6 +903,8 @@ rec { or (throw "system string '${lib.concatStringsSep "-" l}' has invalid number of hyphen-separated components"); # This should revert the job done by config.guess from the gcc compiler. + # Note: this does _not_ verify that the system is valid + # `mkSystemFromString` is recommended for external use mkSystemFromSkeleton = let getCpu = name: cpuTypes.${name} or (throw "Unknown CPU type: ${name}"); @@ -960,9 +962,9 @@ rec { }; in - mkSystem parsed; + parsed; - mkSystemFromString = s: mkSystemFromSkeleton (mkSkeletonFromList (splitString "-" s)); + mkSystemFromString = s: mkSystem (mkSystemFromSkeleton (mkSkeletonFromList (splitString "-" s))); kernelName = kernel: if kernel ? version then kernel.name + toString kernel.version else kernel.name; diff --git a/lib/tests/systems.nix b/lib/tests/systems.nix index 3feef87d97c0..e2b9093511c6 100644 --- a/lib/tests/systems.nix +++ b/lib/tests/systems.nix @@ -215,6 +215,22 @@ lib.runTests ( }) // { + test_platforms_pass_typecheck = { + # To improve performance, the result of parsing all 70+ systems in + # `lib.platforms` into their attrset representations aren't typechecked. + # The results are expected to be constant, and avoiding the slow + # validation gives a meaningful improvement to evaluation speed. We ensure + # that all systems pass validation here + expr = builtins.filter ( + system: + let + evalResult = builtins.tryEval (lib.systems.parse.mkSystemFromString system); + in + evalResult.success == false + ) lib.platforms.all; + + expected = [ ]; + }; test_equals_example_x86_64-linux = { expr = lib.systems.equals (lib.systems.elaborate "x86_64-linux") ( lib.systems.elaborate "x86_64-linux"