1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-25 14:51:16 +02:00

Improve build failure error messages

This commit is contained in:
Eelco Dolstra 2025-05-09 00:32:41 +02:00
parent 7c477772d2
commit 8014671210
2 changed files with 34 additions and 7 deletions

View file

@ -322,6 +322,22 @@ Goal::Co DerivationGoal::haveDerivation()
}
static std::string showKnownOutputs(Store & store, const Derivation & drv)
{
std::string msg;
StorePathSet expectedOutputPaths;
for (auto & i : drv.outputsAndOptPaths(store))
if (i.second.second)
expectedOutputPaths.insert(*i.second.second);
if (!expectedOutputPaths.empty()) {
msg += "\nOutput paths:";
for (auto & p : expectedOutputPaths)
msg += fmt("\n %s", Magenta(store.printStorePath(p)));
}
return msg;
}
/* At least one of the output paths could not be
produced using a substitute. So we have to build instead. */
Goal::Co DerivationGoal::gaveUpOnSubstitution()
@ -392,9 +408,14 @@ Goal::Co DerivationGoal::gaveUpOnSubstitution()
if (nrFailed != 0) {
if (!useDerivation)
throw Error("some dependencies of '%s' are missing", worker.store.printStorePath(drvPath));
co_return done(BuildResult::DependencyFailed, {}, Error(
"%s dependencies of derivation '%s' failed to build",
nrFailed, worker.store.printStorePath(drvPath)));
auto msg = fmt(
"Cannot build '%s'.\n"
"Reason: " ANSI_RED "%d %s failed" ANSI_NORMAL ".",
Magenta(worker.store.printStorePath(drvPath)),
nrFailed,
nrFailed == 1 ? "dependency" : "dependencies");
msg += showKnownOutputs(worker.store, *drv);
co_return done(BuildResult::DependencyFailed, {}, Error(msg));
}
if (retrySubstitution == RetrySubstitution::YesNeed) {
@ -955,12 +976,16 @@ Goal::Co DerivationGoal::buildDone()
diskFull |= cleanupDecideWhetherDiskFull();
auto msg = fmt("builder for '%s' %s",
auto msg = fmt(
"Cannot build '%s'.\n"
"Reason: " ANSI_RED "builder %s" ANSI_NORMAL ".",
Magenta(worker.store.printStorePath(drvPath)),
statusToString(status));
msg += showKnownOutputs(worker.store, *drv);
if (!logger->isVerbose() && !logTail.empty()) {
msg += fmt(";\nlast %d log lines:\n", logTail.size());
msg += fmt("\nLast %d log lines:\n", logTail.size());
for (auto & line : logTail) {
msg += "> ";
msg += line;

View file

@ -179,12 +179,14 @@ test "$(<<<"$out" grep -cE '^error:')" = 4
out="$(nix build -f fod-failing.nix -L x4 2>&1)" && status=0 || status=$?
test "$status" = 1
test "$(<<<"$out" grep -cE '^error:')" = 2
<<<"$out" grepQuiet -E "error: 1 dependencies of derivation '.*-x4\\.drv' failed to build"
<<<"$out" grepQuiet -E "error: Cannot build '.*-x4\\.drv'"
<<<"$out" grepQuiet -E "Reason: 1 dependency failed."
<<<"$out" grepQuiet -E "hash mismatch in fixed-output derivation '.*-x2\\.drv'"
out="$(nix build -f fod-failing.nix -L x4 --keep-going 2>&1)" && status=0 || status=$?
test "$status" = 1
test "$(<<<"$out" grep -cE '^error:')" = 3
<<<"$out" grepQuiet -E "error: 2 dependencies of derivation '.*-x4\\.drv' failed to build"
<<<"$out" grepQuiet -E "error: Cannot build '.*-x4\\.drv'"
<<<"$out" grepQuiet -E "Reason: 2 dependencies failed."
<<<"$out" grepQuiet -vE "hash mismatch in fixed-output derivation '.*-x3\\.drv'"
<<<"$out" grepQuiet -vE "hash mismatch in fixed-output derivation '.*-x2\\.drv'"