summaryrefslogtreecommitdiff
path: root/usr.bin/make/make.c
diff options
context:
space:
mode:
authorrillig <rillig@NetBSD.org>2022-05-07 17:49:47 +0000
committerrillig <rillig@NetBSD.org>2022-05-07 17:49:47 +0000
commit88bfda226b0daf6aa9a98e6d4d9ea5ed26981fcd (patch)
treeeb61cfa0cbdffdb0dede694c957fb260e7190ea2 /usr.bin/make/make.c
parentc4192bec8245e8ce280bb74eca8820dca4e9574c (diff)
make: allow to randomize build order of targets
In complex dependency structures, when a build fails, a probable cause is a missing dependency declaration between some files. In compat mode, the build order is deterministic, in jobs mode, it is somewhat deterministic. To explore more edge cases, add the line ".MAKE.MODE += randomize-targets" somewhere in the makefile. Fixes PR bin/45226 by riastradh. Reviewed by christos.
Diffstat (limited to 'usr.bin/make/make.c')
-rw-r--r--usr.bin/make/make.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/usr.bin/make/make.c b/usr.bin/make/make.c
index 297df62a368..fa1e594a1b1 100644
--- a/usr.bin/make/make.c
+++ b/usr.bin/make/make.c
@@ -1,4 +1,4 @@
-/* $NetBSD: make.c,v 1.254 2022/05/07 10:05:49 rillig Exp $ */
+/* $NetBSD: make.c,v 1.255 2022/05/07 17:49:47 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -104,7 +104,7 @@
#include "job.h"
/* "@(#)make.c 8.1 (Berkeley) 6/6/93" */
-MAKE_RCSID("$NetBSD: make.c,v 1.254 2022/05/07 10:05:49 rillig Exp $");
+MAKE_RCSID("$NetBSD: make.c,v 1.255 2022/05/07 17:49:47 rillig Exp $");
/* Sequence # to detect recursion. */
static unsigned int checked_seqno = 1;
@@ -932,6 +932,28 @@ GNode_SetLocalVars(GNode *gn)
gn->flags.doneAllsrc = true;
}
+static void
+ScheduleRandomly(GNode *gn)
+{
+ GNodeListNode *ln;
+ size_t i, n;
+
+ n = 0;
+ for (ln = toBeMade.first; ln != NULL; ln = ln->next)
+ n++;
+ i = n > 0 ? (size_t)random() % (n + 1) : 0;
+
+ if (i == 0) {
+ Lst_Append(&toBeMade, gn);
+ return;
+ }
+ i--;
+
+ for (ln = toBeMade.first; i > 0; ln = ln->next)
+ i--;
+ Lst_InsertBefore(&toBeMade, ln, gn);
+}
+
static bool
MakeBuildChild(GNode *cn, GNodeListNode *toBeMadeNext)
{
@@ -957,7 +979,9 @@ MakeBuildChild(GNode *cn, GNodeListNode *toBeMadeNext)
cn->name, cn->cohort_num);
cn->made = REQUESTED;
- if (toBeMadeNext == NULL)
+ if (opts.randomizeTargets && !(cn->type & OP_WAIT))
+ ScheduleRandomly(cn);
+ else if (toBeMadeNext == NULL)
Lst_Append(&toBeMade, cn);
else
Lst_InsertBefore(&toBeMade, toBeMadeNext, cn);