Merge: stdenv.mkDerivation: support output checks with and without structuredAttrs (#357054)

This commit is contained in:
Maximilian Bosch
2024-11-30 12:35:30 +01:00
committed by GitHub
3 changed files with 53 additions and 52 deletions
+1 -12
View File
@@ -188,18 +188,7 @@ stdenv.mkDerivation (
-e "s|\$<TARGET_FILE:nvim|\${stdenv.hostPlatform.emulator buildPackages} &|g"
'';
# check that the above patching actually works
outputChecks =
let
disallowedRequisites = [ stdenv.cc ] ++ lib.optional (lua != codegenLua) codegenLua;
in
{
out = {
inherit disallowedRequisites;
};
debug = {
inherit disallowedRequisites;
};
};
disallowedRequisites = [ stdenv.cc ] ++ lib.optional (lua != codegenLua) codegenLua;
cmakeFlags =
[
+4 -6
View File
@@ -132,21 +132,19 @@ let
disallowedReferences = [ "dev" "doc" "man" ];
disallowedRequisites = [
stdenv'.cc
llvmPackages.llvm.out
] ++ (
map lib.getDev (builtins.filter (drv: drv ? "dev") finalAttrs.buildInputs)
) ++ lib.optionals jitSupport [
llvmPackages.llvm.out
];
);
};
outputChecks.lib = {
disallowedReferences = [ "out" "dev" "doc" "man" ];
disallowedRequisites = [
stdenv'.cc
llvmPackages.llvm.out
] ++ (
map lib.getDev (builtins.filter (drv: drv ? "dev") finalAttrs.buildInputs)
) ++ lib.optionals jitSupport [
llvmPackages.llvm.out
];
);
};
buildInputs = [
+48 -34
View File
@@ -134,6 +134,8 @@ let
"__darwinAllowLocalNetworking"
"__impureHostDeps" "__propagatedImpureHostDeps"
"sandboxProfile" "propagatedSandboxProfile"
"disallowedReferences" "disallowedRequisites"
"allowedReferences" "allowedRequisites"
];
# Turn a derivation into its outPath without a string context attached.
@@ -143,6 +145,42 @@ let
then builtins.unsafeDiscardStringContext drv.outPath
else drv;
makeOutputChecks = attrs:
# If we use derivations directly here, they end up as build-time dependencies.
# This is especially problematic in the case of disallowed*, since the disallowed
# derivations will be built by nix as build-time dependencies, while those
# derivations might take a very long time to build, or might not even build
# successfully on the platform used.
# We can improve on this situation by instead passing only the outPath,
# without an attached string context, to nix. The out path will be a placeholder
# which will be replaced by the actual out path if the derivation in question
# is part of the final closure (and thus needs to be built). If it is not
# part of the final closure, then the placeholder will be passed along,
# but in that case we know for a fact that the derivation is not part of the closure.
# This means that passing the out path to nix does the right thing in either
# case, both for disallowed and allowed references/requisites, and we won't
# build the derivation if it wouldn't be part of the closure, saving time and resources.
# While the problem is less severe for allowed*, since we want the derivation
# to be built eventually, we would still like to get the error early and without
# having to wait while nix builds a derivation that might not be used.
# See also https://github.com/NixOS/nix/issues/4629
optionalAttrs (attrs ? disallowedReferences) {
disallowedReferences =
map unsafeDerivationToUntrackedOutpath attrs.disallowedReferences;
} //
optionalAttrs (attrs ? disallowedRequisites) {
disallowedRequisites =
map unsafeDerivationToUntrackedOutpath attrs.disallowedRequisites;
} //
optionalAttrs (attrs ? allowedReferences) {
allowedReferences =
mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedReferences;
} //
optionalAttrs (attrs ? allowedRequisites) {
allowedRequisites =
mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedRequisites;
};
makeDerivationArgument =
@@ -455,40 +493,16 @@ else let
"/bin/sh"
];
__propagatedImpureHostDeps = computedPropagatedImpureHostDeps ++ __propagatedImpureHostDeps;
}) //
# If we use derivations directly here, they end up as build-time dependencies.
# This is especially problematic in the case of disallowed*, since the disallowed
# derivations will be built by nix as build-time dependencies, while those
# derivations might take a very long time to build, or might not even build
# successfully on the platform used.
# We can improve on this situation by instead passing only the outPath,
# without an attached string context, to nix. The out path will be a placeholder
# which will be replaced by the actual out path if the derivation in question
# is part of the final closure (and thus needs to be built). If it is not
# part of the final closure, then the placeholder will be passed along,
# but in that case we know for a fact that the derivation is not part of the closure.
# This means that passing the out path to nix does the right thing in either
# case, both for disallowed and allowed references/requisites, and we won't
# build the derivation if it wouldn't be part of the closure, saving time and resources.
# While the problem is less severe for allowed*, since we want the derivation
# to be built eventually, we would still like to get the error early and without
# having to wait while nix builds a derivation that might not be used.
# See also https://github.com/NixOS/nix/issues/4629
optionalAttrs (attrs ? disallowedReferences) {
disallowedReferences =
map unsafeDerivationToUntrackedOutpath attrs.disallowedReferences;
} //
optionalAttrs (attrs ? disallowedRequisites) {
disallowedRequisites =
map unsafeDerivationToUntrackedOutpath attrs.disallowedRequisites;
} //
optionalAttrs (attrs ? allowedReferences) {
allowedReferences =
mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedReferences;
} //
optionalAttrs (attrs ? allowedRequisites) {
allowedRequisites =
mapNullable unsafeDerivationToUntrackedOutpath attrs.allowedRequisites;
}) // lib.optionalAttrs (!__structuredAttrs) (
makeOutputChecks attrs
) // lib.optionalAttrs (__structuredAttrs) {
outputChecks = builtins.listToAttrs (map (name: {
inherit name;
value = lib.zipAttrsWith (_: builtins.concatLists) [
(makeOutputChecks attrs)
(makeOutputChecks attrs.outputChecks.${name} or {})
];
}) outputs);
};
in