115 lines
3.5 KiB
Nix
115 lines
3.5 KiB
Nix
# This expression will, as efficiently as possible, dump a
|
|
# *superset* of all attrpaths of derivations which might be
|
|
# part of a release on *any* platform.
|
|
#
|
|
# Both this expression and what ofborg uses (release-outpaths.nix)
|
|
# are essentially single-threaded (under the current cppnix
|
|
# implementation).
|
|
#
|
|
# This expression runs much, much, much faster and uses much, much
|
|
# less memory than the ofborg script by skipping the
|
|
# platform-relevance checks. The ofborg outpaths.nix script takes
|
|
# half an hour on a 3ghz core and peaks at 60gbytes of memory; this
|
|
# expression runs on the same machine in 44 seconds with peak memory
|
|
# usage of 5gbytes.
|
|
#
|
|
# Once you have the list of attrnames you can split it up into
|
|
# $NUM_CORES batches and run the platform checks separately for each
|
|
# batch, in parallel.
|
|
#
|
|
# To dump the attrnames:
|
|
#
|
|
# nix-instantiate --eval --strict --json pkgs/top-level/release-attrpaths-superset.nix -A names
|
|
#
|
|
{
|
|
lib ? import (path + "/lib"),
|
|
trace ? false,
|
|
checkMeta ? true,
|
|
path ? ./../..,
|
|
}:
|
|
let
|
|
|
|
# The intended semantics are that an attrpath rooted at pkgs is
|
|
# part of the (unfiltered) release jobset iff both of the following
|
|
# are true:
|
|
#
|
|
# 1. The attrpath leads to a value for which lib.isDerivation is true
|
|
#
|
|
# 2. Any proper prefix of the attrpath at which lib.isDerivation
|
|
# is true also has __recurseIntoDerivationForReleaseJobs=true.
|
|
#
|
|
# The second condition is unfortunately necessary because there are
|
|
# Hydra release jobnames which have proper prefixes which are
|
|
# attrnames of derivations (!). We should probably restructure
|
|
# the job tree so that this is not the case.
|
|
#
|
|
justAttrNames =
|
|
path: value:
|
|
let
|
|
result =
|
|
if path == [ "AAAAAASomeThingsFailToEvaluate" ] then
|
|
[ ]
|
|
else if
|
|
lib.isDerivation value
|
|
&&
|
|
# in some places we have *derivations* with jobsets as subattributes, ugh
|
|
!(value.__recurseIntoDerivationForReleaseJobs or false)
|
|
then
|
|
[ path ]
|
|
|
|
# Even wackier case: we have meta.broken==true jobs with
|
|
# !meta.broken jobs as subattributes with license=unfree, and
|
|
# check-meta.nix won't throw an "unfree" failure because the
|
|
# enclosing derivation is marked broken. Yeah. Bonkers.
|
|
# We should just forbid jobsets enclosed by derivations.
|
|
else if lib.isDerivation value && !value.meta.available then
|
|
[ ]
|
|
|
|
else if !(lib.isAttrs value) then
|
|
[ ]
|
|
else
|
|
lib.pipe value [
|
|
(builtins.mapAttrs (
|
|
name: value:
|
|
builtins.addErrorContext "while evaluating package set attribute path '${
|
|
lib.showAttrPath (path ++ [ name ])
|
|
}'" (justAttrNames (path ++ [ name ]) value)
|
|
))
|
|
builtins.attrValues
|
|
builtins.concatLists
|
|
];
|
|
in
|
|
if !trace then result else lib.trace "** ${lib.concatStringsSep "." path}" result;
|
|
|
|
releaseOutpaths = import ./release-outpaths.nix {
|
|
inherit checkMeta;
|
|
attrNamesOnly = true;
|
|
inherit path;
|
|
};
|
|
|
|
paths = [
|
|
# I am not entirely sure why these three packages end up in
|
|
# the Hydra jobset. But they do, and they don't meet the
|
|
# criteria above, so at the moment they are special-cased.
|
|
[
|
|
"pkgsLLVM"
|
|
"stdenv"
|
|
]
|
|
[
|
|
"pkgsStatic"
|
|
"stdenv"
|
|
]
|
|
[
|
|
"pkgsMusl"
|
|
"stdenv"
|
|
]
|
|
]
|
|
++ justAttrNames [ ] releaseOutpaths;
|
|
|
|
names = map (path: (lib.concatStringsSep "." path)) paths;
|
|
|
|
in
|
|
{
|
|
inherit paths names;
|
|
}
|