diff --git a/ci/default.nix b/ci/default.nix index 540a0faea0ab7..8a0fbddf0eabb 100644 --- a/ci/default.nix +++ b/ci/default.nix @@ -200,5 +200,6 @@ rec { officialRelease = false; inherit pkgs lib-tests; nix = pkgs.nixVersions.latest; + supportedSystems = [ system ]; }; } diff --git a/pkgs/top-level/make-tarball.nix b/pkgs/top-level/make-tarball.nix index 3318b17ba9260..0d7d8146b7c1c 100644 --- a/pkgs/top-level/make-tarball.nix +++ b/pkgs/top-level/make-tarball.nix @@ -4,6 +4,7 @@ pkgs ? import nixpkgs.outPath { }, nix ? pkgs.nix, lib-tests ? import ../../lib/tests/release.nix { inherit pkgs; }, + supportedSystems ? builtins.fromJSON (builtins.readFile ../../ci/supportedSystems.json), }: pkgs.releaseTools.sourceTarball { @@ -44,7 +45,12 @@ pkgs.releaseTools.sourceTarball { checkPhase = '' echo "generating packages.json" - NIX_STATE_DIR=$TMPDIR NIX_PATH= nix-instantiate --eval --raw --expr "import $src/pkgs/top-level/packages-info.nix {}" | sed "s|$src/||g" | jq -c > packages.json + echo ' '''${builtins.toJSON supportedSystems}''' ' | + NIX_STATE_DIR=$TMPDIR NIX_PATH= nix-instantiate \ + --eval --raw --arg-from-stdin supportedSystems \ + --expr "{ supportedSystems }: import $src/pkgs/top-level/packages-info.nix { supportedSystems = builtins.fromJSON supportedSystems; }" | + sed "s|$src/||g" | + jq -c > packages.json # Arbitrary number. The index has ~115k packages as of April 2024. if [ $(jq -r '.packages | length' < packages.json) -lt 100000 ]; then diff --git a/pkgs/top-level/packages-info.nix b/pkgs/top-level/packages-info.nix index 04f5f42cdfaab..ff8a59e5bb662 100644 --- a/pkgs/top-level/packages-info.nix +++ b/pkgs/top-level/packages-info.nix @@ -1,10 +1,29 @@ { trace ? false, + supportedSystems, }: let - pkgs = import ../.. { config = import ./packages-config.nix; }; + pkgsSystems = + if builtins.all (v: v != builtins.currentSystem) supportedSystems then + supportedSystems ++ [ builtins.currentSystem ] + else + supportedSystems; + + pkgsByArch = builtins.listToAttrs ( + map (system: { + name = system; + value = import ../.. { + inherit system; + config = import ./packages-config.nix; + }; + }) pkgsSystems + ); + + pkgs = pkgsByArch.${builtins.currentSystem}; + inherit (pkgs) lib; + generateInfo = path: value: let @@ -23,10 +42,42 @@ let system ; ${if value ? "outputs" then "outputs" else null} = lib.listToAttrs ( - lib.map (x: { - name = x; - value = null; - }) value.outputs + lib.map ( + x: + let + platforms = lib.intersectLists (value.meta.hydraPlatforms + or (lib.subtractLists (value.meta.badPlatforms or [ ]) (value.meta.platforms or supportedSystems)) + ) supportedSystems; + + outPaths = lib.listToAttrs ( + lib.map ( + platform: + let + drvForPlatform = + if lib.hasAttrByPath path pkgsByArch.${platform} then + lib.getAttrFromPath path pkgsByArch.${platform} + else + null; + outPath = + if builtins.isAttrs drvForPlatform && drvForPlatform ? ${x}.outPath then + builtins.unsafeDiscardStringContext drvForPlatform.${x}.outPath + else + null; + eval = builtins.tryEval outPath; + in + { + name = platform; + value = if eval.success then eval.value else null; + } + ) platforms + ); + in + { + name = x; + value = (builtins.tryEval outPaths).value or null; + # value = null; + } + ) value.outputs ); # TODO: Remove the following two fallbacks when all packages have been fixed. # Note: pname and version are *required* by repology, so do not change to diff --git a/pkgs/top-level/release-small.nix b/pkgs/top-level/release-small.nix index e7b89beed282b..2a4dd02a2d4c7 100644 --- a/pkgs/top-level/release-small.nix +++ b/pkgs/top-level/release-small.nix @@ -42,7 +42,7 @@ in { tarball = import ./make-tarball.nix { - inherit nixpkgs; + inherit nixpkgs supportedSystems; officialRelease = false; }; diff --git a/pkgs/top-level/release.nix b/pkgs/top-level/release.nix index 2d0c24ba761b5..abe296568f7ef 100644 --- a/pkgs/top-level/release.nix +++ b/pkgs/top-level/release.nix @@ -101,6 +101,7 @@ let pkgs nixpkgs officialRelease + supportedSystems ; };