diff options
| author | rillig <rillig@NetBSD.org> | 2022-05-07 17:49:47 +0000 |
|---|---|---|
| committer | rillig <rillig@NetBSD.org> | 2022-05-07 17:49:47 +0000 |
| commit | 88bfda226b0daf6aa9a98e6d4d9ea5ed26981fcd (patch) | |
| tree | eb61cfa0cbdffdb0dede694c957fb260e7190ea2 /usr.bin/make/make.c | |
| parent | c4192bec8245e8ce280bb74eca8820dca4e9574c (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.c | 30 |
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); |
