git: eb560911563f - stable/14 - Merge bmake-20250618
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 10 Jan 2026 21:34:09 UTC
The branch stable/14 has been updated by sjg:
URL: https://cgit.FreeBSD.org/src/commit/?id=eb560911563f13e56a74167e323fda1cf111e008
commit eb560911563f13e56a74167e323fda1cf111e008
Author: Simon J. Gerraty <sjg@FreeBSD.org>
AuthorDate: 2025-06-28 02:47:23 +0000
Commit: Simon J. Gerraty <sjg@FreeBSD.org>
CommitDate: 2026-01-10 21:33:13 +0000
Merge bmake-20250618
(cherry picked from commit 0b46a53a2f50b5ab0f4598104119a049b9c42cc9)
---
contrib/bmake/ChangeLog | 85 ++
contrib/bmake/FILES | 5 +
contrib/bmake/VERSION | 2 +-
contrib/bmake/bmake.1 | 11 +-
contrib/bmake/bmake.cat1 | 7 +-
contrib/bmake/compat.c | 32 +-
contrib/bmake/cond.c | 10 +-
contrib/bmake/dir.c | 6 +-
contrib/bmake/for.c | 28 +-
contrib/bmake/hash.c | 30 +-
contrib/bmake/hash.h | 16 +-
contrib/bmake/job.c | 860 ++++++++++-----------
contrib/bmake/job.h | 116 +--
contrib/bmake/main.c | 152 ++--
contrib/bmake/make.1 | 11 +-
contrib/bmake/make.c | 173 ++---
contrib/bmake/make.h | 20 +-
contrib/bmake/make_malloc.c | 6 +-
contrib/bmake/meta.c | 24 +-
contrib/bmake/meta.h | 4 +-
contrib/bmake/mk/ChangeLog | 40 +
contrib/bmake/mk/FILES | 29 +-
contrib/bmake/mk/auto.obj.mk | 4 +-
contrib/bmake/mk/dirdeps2dplibs.mk | 35 +
contrib/bmake/mk/gendirdeps.mk | 21 +-
contrib/bmake/mk/install-mk | 4 +-
contrib/bmake/mk/lib.mk | 4 +-
contrib/bmake/mk/libs.mk | 4 +-
contrib/bmake/mk/meta.autodep.mk | 55 +-
contrib/bmake/mk/meta2deps.py | 23 +-
contrib/bmake/mk/meta2deps.sh | 16 +-
contrib/bmake/mk/mkopt.sh | 9 +-
contrib/bmake/mk/newlog.sh | 64 +-
contrib/bmake/mk/progs.mk | 4 +-
contrib/bmake/mk/setopts.sh | 20 +-
contrib/bmake/mk/sys.mk | 3 +-
contrib/bmake/parse.c | 90 ++-
contrib/bmake/suff.c | 64 +-
contrib/bmake/targ.c | 9 +-
contrib/bmake/trace.c | 12 +-
contrib/bmake/unit-tests/Makefile | 35 +-
contrib/bmake/unit-tests/archive.exp | 4 +-
contrib/bmake/unit-tests/check-expect.lua | 190 +++++
contrib/bmake/unit-tests/cmd-errors-jobs.exp | 6 +
contrib/bmake/unit-tests/cond-func-empty.exp | 3 +-
contrib/bmake/unit-tests/cond-func-empty.mk | 3 +-
contrib/bmake/unit-tests/cond-late.exp | 2 +-
contrib/bmake/unit-tests/dep-op-missing.exp | 2 +-
contrib/bmake/unit-tests/deptgt-suffixes.exp | 1 +
contrib/bmake/unit-tests/directive-for-errors.exp | 2 +-
contrib/bmake/unit-tests/directive-for-errors.mk | 7 +-
contrib/bmake/unit-tests/directive-for-null.exp | 2 +-
contrib/bmake/unit-tests/gnode-submake.exp | 2 +-
contrib/bmake/unit-tests/job-output.exp | 13 +
contrib/bmake/unit-tests/job-output.mk | 41 +
contrib/bmake/unit-tests/objdir-writable.exp | 2 +-
contrib/bmake/unit-tests/opt-debug-graph1.exp | 3 +-
contrib/bmake/unit-tests/opt-debug-graph2.exp | 3 +-
contrib/bmake/unit-tests/opt-debug-graph3.exp | 3 +-
contrib/bmake/unit-tests/opt-debug-jobs.exp | 20 +-
contrib/bmake/unit-tests/opt-file.exp | 2 +-
contrib/bmake/unit-tests/opt-jobs-internal.exp | 33 +-
contrib/bmake/unit-tests/opt-jobs-internal.mk | 70 +-
contrib/bmake/unit-tests/opt-jobs.mk | 2 +-
contrib/bmake/unit-tests/opt-touch-jobs.mk | 4 +-
contrib/bmake/unit-tests/opt-tracefile.exp | 16 +-
contrib/bmake/unit-tests/opt-tracefile.mk | 5 +-
contrib/bmake/unit-tests/sh-errctl.exp | 14 +-
contrib/bmake/unit-tests/shell-csh.mk | 6 +-
contrib/bmake/unit-tests/shell-ksh.exp | 11 +-
contrib/bmake/unit-tests/shell-ksh.mk | 42 +-
contrib/bmake/unit-tests/suff-main-several.exp | 3 +-
contrib/bmake/unit-tests/suff-transform-debug.exp | 3 +-
contrib/bmake/unit-tests/var-op-expand.exp | 14 +-
contrib/bmake/unit-tests/var-op-expand.mk | 11 +-
contrib/bmake/unit-tests/var-recursive.exp | 9 +-
contrib/bmake/unit-tests/varmod-assign.exp | 3 +
contrib/bmake/unit-tests/varmod-ifelse.exp | 9 +
contrib/bmake/unit-tests/varmod-ifelse.mk | 9 +-
contrib/bmake/unit-tests/varmod-mtime.exp | 4 +-
contrib/bmake/unit-tests/varmod-mtime.mk | 6 +-
.../bmake/unit-tests/varname-dot-make-level.exp | 1 +
contrib/bmake/unit-tests/varname-dot-makeflags.mk | 2 +-
contrib/bmake/unit-tests/varname-dot-newline.exp | 6 +-
.../bmake/unit-tests/varname-make_stack_trace.exp | 40 +
.../bmake/unit-tests/varname-make_stack_trace.mk | 37 +
contrib/bmake/unit-tests/varname.exp | 17 +-
contrib/bmake/unit-tests/varname.mk | 68 +-
contrib/bmake/unit-tests/varparse-errors.mk | 4 +-
contrib/bmake/var.c | 108 ++-
usr.bin/bmake/Makefile.config | 2 +-
usr.bin/bmake/unit-tests/Makefile | 35 +-
92 files changed, 1870 insertions(+), 1178 deletions(-)
diff --git a/contrib/bmake/ChangeLog b/contrib/bmake/ChangeLog
index 1ec90b7bccc8..0a5eced2d439 100644
--- a/contrib/bmake/ChangeLog
+++ b/contrib/bmake/ChangeLog
@@ -1,3 +1,88 @@
+2025-06-18 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250618
+ Merge with NetBSD make, pick up
+ o parse.c: in a warning without location information,
+ print the stack trace
+
+2025-06-15 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250615
+ Merge with NetBSD make, pick up
+ o add on-demand inter-process stack traces
+ o job.c,meta.c: do not discard empty lines in the output of a command
+ o job.c: add job prefix if necessary in non-default filtered mode
+ o parse.c,var.c: skip inter-process stack trace when
+ MAKE_STACK_TRACE=no
+
+2025-06-12 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250612
+ Merge with NetBSD make, pick up
+ o use a common style for unexpected error messages
+ o parse.c: add program name to stack traces from sub-makes
+ add quotes to "in directory" line in stack traces
+ o var.c: check variable names for invalid characters when there
+ are no modifiers to apply. This detects and warns about gmake
+ syntax like: $(addprefix -I, $(LIST))
+
+2025-06-09 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250606
+ Merge with NetBSD make, pick up
+ o main.c: fix bug in handling of output of children in jobs mode
+
+2025-05-28 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250528
+ Merge with NetBSD make, pick up
+ o show contents of MAKEFLAGS in the stack trace.
+ o main.c: delay warning about bogus -J flag, if we end up in
+ compat mode before the call to InitMaxJobs, the warning isn't
+ necessary.
+
+2025-05-25 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250525
+ Merge with NetBSD make, pick up
+ o main.c: set .CURDIR earlier so it can be reported in some errors.
+
+2025-05-20 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250520
+ Merge with NetBSD make, pick up
+ o rename variables, remove now-redundant comments
+ o job.c: clean up building the shell commands in parallel mode
+ remove timeout for polling in parallel mode
+ o main.c: clean up error message for malformed internal -J option
+
+2025-05-11 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250511
+ Merge with NetBSD make, pick up
+ o job.c: rename token pool variables to be more descriptive
+ move ContinueJobs further up, to eliminate a forward declaration
+ error out if writing to an internal pipe fails
+ clean up constant names and function names
+ use uniform debug log messages for the token pool
+ in the debug log, replace magic numbers with identifiers
+ o main.c: clean up error message for malformed internal -J option
+ o make.c: replace bitset in trace output with descriptive node
+ attributes
+ o targ.c: add end marker for -dg1, -dg2 and -dg3 debug log
+ o var.c: fix order of error messages in the ":?" modifier
+
+2025-04-25 Simon J Gerraty <sjg@beast.crufty.net>
+
+ * VERSION (_MAKE_VERSION): 20250424
+ Merge with NetBSD make, pick up
+ o cleanup; replace unsigned int with just unsigned
+ Inline the TMPPAT macro, as it is only needed in a single place
+ o move struct Job from job.h to job.c
+ o job.c: group the code for handling the job token pool
+ avoid excessive values of -j
+ o make.c: fix grammar in debug log message
+
2025-04-14 Simon J Gerraty <sjg@beast.crufty.net>
* VERSION (_MAKE_VERSION): 20250414
diff --git a/contrib/bmake/FILES b/contrib/bmake/FILES
index 553f3211f29c..8bed07d546a3 100644
--- a/contrib/bmake/FILES
+++ b/contrib/bmake/FILES
@@ -76,6 +76,7 @@ unit-tests/archive-suffix.exp
unit-tests/archive-suffix.mk
unit-tests/archive.exp
unit-tests/archive.mk
+unit-tests/check-expect.lua
unit-tests/cmd-errors-jobs.exp
unit-tests/cmd-errors-jobs.mk
unit-tests/cmd-errors-lint.exp
@@ -410,6 +411,8 @@ unit-tests/job-output-long-lines.exp
unit-tests/job-output-long-lines.mk
unit-tests/job-output-null.exp
unit-tests/job-output-null.mk
+unit-tests/job-output.exp
+unit-tests/job-output.mk
unit-tests/jobs-empty-commands-error.exp
unit-tests/jobs-empty-commands-error.mk
unit-tests/jobs-empty-commands.exp
@@ -859,6 +862,8 @@ unit-tests/varname-make_print_var_on_error-jobs.exp
unit-tests/varname-make_print_var_on_error-jobs.mk
unit-tests/varname-make_print_var_on_error.exp
unit-tests/varname-make_print_var_on_error.mk
+unit-tests/varname-make_stack_trace.exp
+unit-tests/varname-make_stack_trace.mk
unit-tests/varname-makefile.exp
unit-tests/varname-makefile.mk
unit-tests/varname-makeflags.exp
diff --git a/contrib/bmake/VERSION b/contrib/bmake/VERSION
index 4e4949c5fd3e..1467403891f1 100644
--- a/contrib/bmake/VERSION
+++ b/contrib/bmake/VERSION
@@ -1,2 +1,2 @@
# keep this compatible with sh and make
-_MAKE_VERSION=20250414
+_MAKE_VERSION=20250618
diff --git a/contrib/bmake/bmake.1 b/contrib/bmake/bmake.1
index 9e9f2d03a450..92ed9e201ea5 100644
--- a/contrib/bmake/bmake.1
+++ b/contrib/bmake/bmake.1
@@ -1,4 +1,4 @@
-.\" $NetBSD: make.1,v 1.384 2025/04/04 18:36:47 sjg Exp $
+.\" $NetBSD: make.1,v 1.385 2025/06/13 03:51:18 rillig Exp $
.\"
.\" Copyright (c) 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" from: @(#)make.1 8.4 (Berkeley) 3/19/94
.\"
-.Dd April 4, 2025
+.Dd June 12, 2025
.Dt BMAKE 1
.Os
.Sh NAME
@@ -2688,6 +2688,7 @@ uses the following environment variables, if they exist:
.Ev MAKEOBJDIR ,
.Ev MAKEOBJDIRPREFIX ,
.Ev MAKESYSPATH ,
+.Ev MAKE_STACK_TRACE ,
.Ev PWD ,
and
.Ev TMPDIR .
@@ -2707,6 +2708,12 @@ very early and the
target is used to reset
.Sq Va .OBJDIR ,
there may be unexpected side effects.
+.Pp
+If the
+.Ev MAKE_STACK_TRACE
+environment variable is set to
+.Dq yes ,
+any stack traces include the call chain of the parent processes.
.Sh FILES
.Bl -tag -width /usr/share/mk -compact
.It .depend
diff --git a/contrib/bmake/bmake.cat1 b/contrib/bmake/bmake.cat1
index e1340e1c78e0..667c80898def 100644
--- a/contrib/bmake/bmake.cat1
+++ b/contrib/bmake/bmake.cat1
@@ -1728,7 +1728,7 @@ SSPPEECCIIAALL TTAARRGGEETTSS
EENNVVIIRROONNMMEENNTT
bbmmaakkee uses the following environment variables, if they exist: MACHINE,
MACHINE_ARCH, MAKE, MAKEFLAGS, MAKEOBJDIR, MAKEOBJDIRPREFIX, MAKESYSPATH,
- PWD, and TMPDIR.
+ MAKE_STACK_TRACE, PWD, and TMPDIR.
MAKEOBJDIRPREFIX and MAKEOBJDIR should be set in the environment or on
the command line to bbmmaakkee and not as makefile variables; see the
@@ -1736,6 +1736,9 @@ EENNVVIIRROONNMMEENNTT
via makefile variables but unless done very early and the `..OOBBJJDDIIRR'
target is used to reset `_._O_B_J_D_I_R', there may be unexpected side effects.
+ If the MAKE_STACK_TRACE environment variable is set to "yes", any stack
+ traces include the call chain of the parent processes.
+
FFIILLEESS
.depend list of dependencies
makefile first default makefile if no makefile is specified on the
@@ -1828,4 +1831,4 @@ BBUUGGSS
attempt to suppress a cascade of unnecessary errors, can result in a
seemingly unexplained `*** Error code 6'
-FreeBSD 14.2-RELEASE-p1 April 4, 2025 FreeBSD 14.2-RELEASE-p1
+FreeBSD 14.2-RELEASE-p1 June 12, 2025 FreeBSD 14.2-RELEASE-p1
diff --git a/contrib/bmake/compat.c b/contrib/bmake/compat.c
index 0da929e35b82..7a51a99be4ba 100644
--- a/contrib/bmake/compat.c
+++ b/contrib/bmake/compat.c
@@ -1,4 +1,4 @@
-/* $NetBSD: compat.c,v 1.262 2025/01/19 10:57:10 rillig Exp $ */
+/* $NetBSD: compat.c,v 1.267 2025/06/13 03:51:18 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -90,13 +90,16 @@
#include "make.h"
#include "dir.h"
#include "job.h"
+#ifdef USE_META
+# include "meta.h"
+#endif
#include "metachar.h"
#include "pathnames.h"
/* "@(#)compat.c 8.2 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: compat.c,v 1.262 2025/01/19 10:57:10 rillig Exp $");
+MAKE_RCSID("$NetBSD: compat.c,v 1.267 2025/06/13 03:51:18 rillig Exp $");
-static GNode *curTarg = NULL;
+static GNode *curTarg;
static pid_t compatChild;
static int compatSigno;
@@ -107,7 +110,7 @@ static int compatSigno;
static void
CompatDeleteTarget(GNode *gn)
{
- if (gn != NULL && !GNode_IsPrecious(gn) &&
+ if (!GNode_IsPrecious(gn) &&
(gn->type & OP_PHONY) == 0) {
const char *file = GNode_VarTarget(gn);
if (!opts.noExecute && unlink_file(file) == 0)
@@ -127,11 +130,9 @@ CompatDeleteTarget(GNode *gn)
static void
CompatInterrupt(int signo)
{
- CompatDeleteTarget(curTarg);
-
- if (curTarg != NULL && !GNode_IsPrecious(curTarg)) {
- /* Run .INTERRUPT only if hit with interrupt signal. */
- if (signo == SIGINT) {
+ if (curTarg != NULL) {
+ CompatDeleteTarget(curTarg);
+ if (signo == SIGINT && !GNode_IsPrecious(curTarg)) {
GNode *gn = Targ_FindNode(".INTERRUPT");
if (gn != NULL)
Compat_Make(gn, gn);
@@ -309,8 +310,6 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
cmd++;
}
- while (ch_isspace(*cmd))
- cmd++;
if (cmd[0] == '\0')
goto register_command;
@@ -337,7 +336,7 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
if (Cmd_Argv(cmd, cmd_len, shargv, 5,
cmd_file, sizeof(cmd_file),
- (errCheck && shellErrFlag != NULL),
+ errCheck && shellErrFlag != NULL,
DEBUG(SHELL)) < 0)
Fatal("cannot run \"%s\"", cmd);
av = shargv;
@@ -356,6 +355,7 @@ Compat_RunCommand(const char *cmdp, GNode *gn, StringListNode *ln)
#endif
Var_ReexportVars(gn);
+ Var_ExportStackTrace(gn->name, cmd);
compatChild = Compat_Spawn(av);
free(mav);
@@ -730,7 +730,7 @@ InitSignals(void)
}
void
-Compat_MakeAll(GNodeList *targs)
+Compat_MakeAll(GNodeList *targets)
{
GNode *errorNode = NULL;
@@ -753,10 +753,10 @@ Compat_MakeAll(GNodeList *targs)
* Expand .USE nodes right now, because they can modify the structure
* of the tree.
*/
- Make_ExpandUse(targs);
+ Make_ExpandUse(targets);
- while (!Lst_IsEmpty(targs)) {
- GNode *gn = Lst_Dequeue(targs);
+ while (!Lst_IsEmpty(targets)) {
+ GNode *gn = Lst_Dequeue(targets);
Compat_Make(gn, gn);
if (gn->made == UPTODATE) {
diff --git a/contrib/bmake/cond.c b/contrib/bmake/cond.c
index 31fe21c4c8b6..f83163cbb50e 100644
--- a/contrib/bmake/cond.c
+++ b/contrib/bmake/cond.c
@@ -1,4 +1,4 @@
-/* $NetBSD: cond.c,v 1.372 2025/04/10 21:41:35 rillig Exp $ */
+/* $NetBSD: cond.c,v 1.373 2025/04/22 19:28:50 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -91,7 +91,7 @@
#include "dir.h"
/* "@(#)cond.c 8.2 (Berkeley) 1/2/94" */
-MAKE_RCSID("$NetBSD: cond.c,v 1.372 2025/04/10 21:41:35 rillig Exp $");
+MAKE_RCSID("$NetBSD: cond.c,v 1.373 2025/04/22 19:28:50 rillig Exp $");
/*
* Conditional expressions conform to this grammar:
@@ -166,7 +166,7 @@ typedef struct CondParser {
static CondResult CondParser_Or(CondParser *, bool);
-unsigned int cond_depth = 0; /* current .if nesting level */
+unsigned cond_depth = 0; /* current .if nesting level */
/* Names for ComparisonOp. */
static const char opname[][3] = { "<", "<=", ">", ">=", "==", "!=" };
@@ -1028,7 +1028,7 @@ Cond_EvalLine(const char *line)
} IfState;
static enum IfState *cond_states = NULL;
- static unsigned int cond_states_cap = 128;
+ static unsigned cond_states_cap = 128;
bool plain;
bool (*evalBare)(const char *);
@@ -1221,7 +1221,7 @@ found_variable:
void
Cond_EndFile(void)
{
- unsigned int open_conds = cond_depth - CurFile_CondMinDepth();
+ unsigned open_conds = cond_depth - CurFile_CondMinDepth();
if (open_conds != 0) {
Parse_Error(PARSE_FATAL, "%u open conditional%s",
diff --git a/contrib/bmake/dir.c b/contrib/bmake/dir.c
index 106b475bda2a..217fd04e162b 100644
--- a/contrib/bmake/dir.c
+++ b/contrib/bmake/dir.c
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.296 2025/04/11 17:21:31 rillig Exp $ */
+/* $NetBSD: dir.c,v 1.297 2025/06/12 18:51:05 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -132,7 +132,7 @@
#include "job.h"
/* "@(#)dir.c 8.2 (Berkeley) 1/2/94" */
-MAKE_RCSID("$NetBSD: dir.c,v 1.296 2025/04/11 17:21:31 rillig Exp $");
+MAKE_RCSID("$NetBSD: dir.c,v 1.297 2025/06/12 18:51:05 rillig Exp $");
/*
* A search path is a list of CachedDir structures. A CachedDir has in it the
@@ -492,7 +492,7 @@ Dir_InitDot(void)
dir = SearchPath_Add(NULL, ".");
if (dir == NULL) {
- Error("Cannot open `.' (%s)", strerror(errno));
+ Error("Cannot open \".\": %s", strerror(errno));
exit(2); /* Not 1 so -q can distinguish error */
}
diff --git a/contrib/bmake/for.c b/contrib/bmake/for.c
index 2aa1398b1c4c..438fb4e84de0 100644
--- a/contrib/bmake/for.c
+++ b/contrib/bmake/for.c
@@ -1,4 +1,4 @@
-/* $NetBSD: for.c,v 1.184 2025/04/11 18:08:17 rillig Exp $ */
+/* $NetBSD: for.c,v 1.185 2025/04/22 19:28:50 rillig Exp $ */
/*
* Copyright (c) 1992, The Regents of the University of California.
@@ -58,14 +58,14 @@
#include "make.h"
/* "@(#)for.c 8.1 (Berkeley) 6/6/93" */
-MAKE_RCSID("$NetBSD: for.c,v 1.184 2025/04/11 18:08:17 rillig Exp $");
+MAKE_RCSID("$NetBSD: for.c,v 1.185 2025/04/22 19:28:50 rillig Exp $");
typedef struct ForLoop {
Vector /* of 'char *' */ vars; /* Iteration variables */
SubstringWords items; /* Substitution items */
Buffer body; /* Unexpanded body of the loop */
- unsigned int nextItem; /* Where to continue iterating */
+ unsigned nextItem; /* Where to continue iterating */
} ForLoop;
@@ -330,7 +330,7 @@ ExprLen(const char *s, const char *e)
* by ApplyModifier_Defined.
*/
static void
-AddEscaped(Buffer *cmds, Substring item, char endc)
+AddEscaped(Buffer *body, Substring item, char endc)
{
const char *p;
char ch;
@@ -344,18 +344,18 @@ AddEscaped(Buffer *cmds, Substring item, char endc)
* XXX: Should a '\' be added here?
* See directive-for-escape.mk, ExprLen.
*/
- Buf_AddBytes(cmds, p, 1 + len);
+ Buf_AddBytes(body, p, 1 + len);
p += 1 + len;
continue;
}
- Buf_AddByte(cmds, '\\');
+ Buf_AddByte(body, '\\');
} else if (ch == ':' || ch == '\\' || ch == endc)
- Buf_AddByte(cmds, '\\');
+ Buf_AddByte(body, '\\');
else if (ch == '\n') {
Parse_Error(PARSE_FATAL, "newline in .for value");
ch = ' '; /* prevent newline injection */
}
- Buf_AddByte(cmds, ch);
+ Buf_AddByte(body, ch);
p++;
}
}
@@ -365,7 +365,7 @@ AddEscaped(Buffer *cmds, Substring item, char endc)
* expression like ${i} or ${i:...} or $(i) or $(i:...) with ":Uvalue".
*/
static void
-ForLoop_SubstVarLong(ForLoop *f, unsigned int firstItem, Buffer *body,
+ForLoop_SubstVarLong(ForLoop *f, unsigned firstItem, Buffer *body,
const char **pp, char endc, const char **inout_mark)
{
size_t i;
@@ -400,7 +400,7 @@ ForLoop_SubstVarLong(ForLoop *f, unsigned int firstItem, Buffer *body,
* expressions like $i with their ${:U...} expansion.
*/
static void
-ForLoop_SubstVarShort(ForLoop *f, unsigned int firstItem, Buffer *body,
+ForLoop_SubstVarShort(ForLoop *f, unsigned firstItem, Buffer *body,
const char *p, const char **inout_mark)
{
char ch = *p;
@@ -444,7 +444,7 @@ found:
* See unit-tests/directive-for-escape.mk.
*/
static void
-ForLoop_SubstBody(ForLoop *f, unsigned int firstItem, Buffer *body)
+ForLoop_SubstBody(ForLoop *f, unsigned firstItem, Buffer *body)
{
const char *p, *end;
const char *mark; /* where the last substitution left off */
@@ -479,8 +479,8 @@ For_NextIteration(ForLoop *f, Buffer *body)
if (f->nextItem == f->items.len)
return false;
- f->nextItem += (unsigned int)f->vars.len;
- ForLoop_SubstBody(f, f->nextItem - (unsigned int)f->vars.len, body);
+ f->nextItem += (unsigned)f->vars.len;
+ ForLoop_SubstBody(f, f->nextItem - (unsigned)f->vars.len, body);
if (DEBUG(FOR)) {
char *details = ForLoop_Details(f);
debug_printf("For: loop body with %s:\n%s",
@@ -494,7 +494,7 @@ For_NextIteration(ForLoop *f, Buffer *body)
void
For_Break(ForLoop *f)
{
- f->nextItem = (unsigned int)f->items.len;
+ f->nextItem = (unsigned)f->items.len;
}
/* Run the .for loop, imitating the actions of an include file. */
diff --git a/contrib/bmake/hash.c b/contrib/bmake/hash.c
index e84ef412bdef..663378626b89 100644
--- a/contrib/bmake/hash.c
+++ b/contrib/bmake/hash.c
@@ -1,4 +1,4 @@
-/* $NetBSD: hash.c,v 1.79 2024/07/07 09:37:00 rillig Exp $ */
+/* $NetBSD: hash.c,v 1.80 2025/04/22 19:28:50 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -74,7 +74,7 @@
#include "make.h"
/* "@(#)hash.c 8.1 (Berkeley) 6/6/93" */
-MAKE_RCSID("$NetBSD: hash.c,v 1.79 2024/07/07 09:37:00 rillig Exp $");
+MAKE_RCSID("$NetBSD: hash.c,v 1.80 2025/04/22 19:28:50 rillig Exp $");
/*
* The ratio of # entries to # buckets at which we rebuild the table to
@@ -83,10 +83,10 @@ MAKE_RCSID("$NetBSD: hash.c,v 1.79 2024/07/07 09:37:00 rillig Exp $");
#define rebuildLimit 3
/* This hash function matches Gosling's Emacs and java.lang.String. */
-static unsigned int
+static unsigned
Hash_String(const char *key, const char **out_keyEnd)
{
- unsigned int h;
+ unsigned h;
const char *p;
h = 0;
@@ -98,10 +98,10 @@ Hash_String(const char *key, const char **out_keyEnd)
}
/* This hash function matches Gosling's Emacs and java.lang.String. */
-unsigned int
+unsigned
Hash_Substring(Substring key)
{
- unsigned int h;
+ unsigned h;
const char *p;
h = 0;
@@ -111,7 +111,7 @@ Hash_Substring(Substring key)
}
static HashEntry *
-HashTable_Find(HashTable *t, Substring key, unsigned int h)
+HashTable_Find(HashTable *t, Substring key, unsigned h)
{
HashEntry *he;
size_t keyLen = Substring_Length(key);
@@ -135,7 +135,7 @@ HashTable_Find(HashTable *t, Substring key, unsigned int h)
void
HashTable_Init(HashTable *t)
{
- unsigned int n = 16, i;
+ unsigned n = 16, i;
HashEntry **buckets = bmake_malloc(sizeof *buckets * n);
for (i = 0; i < n; i++)
buckets[i] = NULL;
@@ -176,7 +176,7 @@ HashEntry *
HashTable_FindEntry(HashTable *t, const char *key)
{
const char *keyEnd;
- unsigned int h = Hash_String(key, &keyEnd);
+ unsigned h = Hash_String(key, &keyEnd);
return HashTable_Find(t, Substring_Init(key, keyEnd), h);
}
@@ -193,7 +193,7 @@ HashTable_FindValue(HashTable *t, const char *key)
* or return NULL.
*/
void *
-HashTable_FindValueBySubstringHash(HashTable *t, Substring key, unsigned int h)
+HashTable_FindValueBySubstringHash(HashTable *t, Substring key, unsigned h)
{
HashEntry *he = HashTable_Find(t, key, h);
return he != NULL ? he->value : NULL;
@@ -220,10 +220,10 @@ HashTable_MaxChain(const HashTable *t)
static void
HashTable_Enlarge(HashTable *t)
{
- unsigned int oldSize = t->bucketsSize;
+ unsigned oldSize = t->bucketsSize;
HashEntry **oldBuckets = t->buckets;
- unsigned int newSize = 2 * oldSize;
- unsigned int newMask = newSize - 1;
+ unsigned newSize = 2 * oldSize;
+ unsigned newMask = newSize - 1;
HashEntry **newBuckets = bmake_malloc(sizeof *newBuckets * newSize);
size_t i;
@@ -257,7 +257,7 @@ HashEntry *
HashTable_CreateEntry(HashTable *t, const char *key, bool *out_isNew)
{
const char *keyEnd;
- unsigned int h = Hash_String(key, &keyEnd);
+ unsigned h = Hash_String(key, &keyEnd);
HashEntry *he = HashTable_Find(t, Substring_Init(key, keyEnd), h);
if (he != NULL) {
@@ -313,7 +313,7 @@ HashIter_Next(HashIter *hi)
HashTable *t = hi->table;
HashEntry *he = hi->entry;
HashEntry **buckets = t->buckets;
- unsigned int bucketsSize = t->bucketsSize;
+ unsigned bucketsSize = t->bucketsSize;
if (he != NULL)
he = he->next; /* skip the most recently returned entry */
diff --git a/contrib/bmake/hash.h b/contrib/bmake/hash.h
index d6f9d03fb3ab..d9cf708dbd91 100644
--- a/contrib/bmake/hash.h
+++ b/contrib/bmake/hash.h
@@ -1,4 +1,4 @@
-/* $NetBSD: hash.h,v 1.51 2024/07/07 09:37:00 rillig Exp $ */
+/* $NetBSD: hash.h,v 1.52 2025/04/22 19:28:50 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -82,22 +82,22 @@ typedef struct HashEntry {
struct HashEntry *next; /* Used to link together all the entries
* associated with the same bucket. */
void *value;
- unsigned int hash; /* hash value of the key */
+ unsigned hash; /* hash value of the key */
char key[1]; /* key string, variable length */
} HashEntry;
/* The hash table containing the entries. */
typedef struct HashTable {
HashEntry **buckets;
- unsigned int bucketsSize;
- unsigned int numEntries;
- unsigned int bucketsMask; /* Used to select the bucket for a hash. */
+ unsigned bucketsSize;
+ unsigned numEntries;
+ unsigned bucketsMask; /* Used to select the bucket for a hash. */
} HashTable;
/* State of an iteration over all entries in a table. */
typedef struct HashIter {
HashTable *table; /* Table being searched. */
- unsigned int nextBucket; /* Next bucket to check (after current). */
+ unsigned nextBucket; /* Next bucket to check (after current). */
HashEntry *entry; /* Next entry to check in current bucket. */
} HashIter;
@@ -131,8 +131,8 @@ void HashTable_Init(HashTable *);
void HashTable_Done(HashTable *);
HashEntry *HashTable_FindEntry(HashTable *, const char *) MAKE_ATTR_USE;
void *HashTable_FindValue(HashTable *, const char *) MAKE_ATTR_USE;
-unsigned int Hash_Substring(Substring) MAKE_ATTR_USE;
-void *HashTable_FindValueBySubstringHash(HashTable *, Substring, unsigned int)
+unsigned Hash_Substring(Substring) MAKE_ATTR_USE;
+void *HashTable_FindValueBySubstringHash(HashTable *, Substring, unsigned)
MAKE_ATTR_USE;
HashEntry *HashTable_CreateEntry(HashTable *, const char *, bool *);
void HashTable_Set(HashTable *, const char *, void *);
diff --git a/contrib/bmake/job.c b/contrib/bmake/job.c
index 2e6f44f722f2..582870088f2d 100644
--- a/contrib/bmake/job.c
+++ b/contrib/bmake/job.c
@@ -1,4 +1,4 @@
-/* $NetBSD: job.c,v 1.492 2025/04/12 13:00:21 rillig Exp $ */
+/* $NetBSD: job.c,v 1.516 2025/06/13 06:13:19 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -73,45 +73,29 @@
* Create child processes and collect their output.
*
* Interface:
- * Job_Init Called to initialize this module. In addition,
- * the .BEGIN target is made, including all of its
- * dependencies before this function returns.
- * Hence, the makefiles must have been parsed
- * before this function is called.
+ * Job_Init Initialize this module and make the .BEGIN target.
*
* Job_End Clean up any memory used.
*
- * Job_Make Start the creation of the given target.
+ * Job_Make Start making the given target.
*
* Job_CatchChildren
- * Check for and handle the termination of any
- * children. This must be called reasonably
- * frequently to keep the whole make going at
- * a decent clip, since job table entries aren't
- * removed until their process is caught this way.
+ * Handle the termination of any children.
*
* Job_CatchOutput
- * Print any output our children have produced.
- * Should also be called fairly frequently to
- * keep the user informed of what's going on.
- * If no output is waiting, it will block for
- * a time given by the SEL_* constants, below,
- * or until output is ready.
+ * Print any output the child processes have produced.
*
* Job_ParseShell Given a special dependency line with target '.SHELL',
* define the shell that is used for the creation
* commands in jobs mode.
*
- * Job_Finish Make the .END target. Should only be called when the
+ * Job_Finish Make the .END target. Must only be called when the
* job table is empty.
*
- * Job_AbortAll Abort all currently running jobs. Do not handle
- * output or do anything for the jobs, just kill them.
- * Should only be called in an emergency.
+ * Job_AbortAll Kill all currently running jobs, in an emergency.
*
* Job_CheckCommands
- * Verify that the commands for a target are
- * ok. Provide them if necessary and possible.
+ * Add fallback commands to a target, if necessary.
*
* Job_Touch Update a target without really updating it.
*
@@ -123,7 +107,6 @@
#endif
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/file.h>
#include <sys/time.h>
#include "wait.h"
@@ -147,11 +130,111 @@
#include "make.h"
#include "dir.h"
#include "job.h"
+#ifdef USE_META
+# include "meta.h"
+#endif
#include "pathnames.h"
#include "trace.h"
/* "@(#)job.c 8.2 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: job.c,v 1.492 2025/04/12 13:00:21 rillig Exp $");
+MAKE_RCSID("$NetBSD: job.c,v 1.516 2025/06/13 06:13:19 rillig Exp $");
+
+
+#ifdef USE_SELECT
+/*
+ * Emulate poll() in terms of select(). This is not a complete
+ * emulation but it is sufficient for make's purposes.
+ */
+
+#define poll emul_poll
+#define pollfd emul_pollfd
+
+struct emul_pollfd {
+ int fd;
+ short events;
+ short revents;
+};
+
+#define POLLIN 0x0001
+#define POLLOUT 0x0004
+
+int emul_poll(struct pollfd *, int, int);
+#endif
+
+struct pollfd;
+
+
+enum JobStatus {
+ JOB_ST_FREE, /* Job is available */
+ JOB_ST_SET_UP, /* Job is allocated but otherwise invalid */
+ JOB_ST_RUNNING, /* Job is running, pid valid */
+ JOB_ST_FINISHED /* Job is done (i.e. after SIGCHLD) */
+};
+
+static const char JobStatus_Name[][9] = {
+ "free",
+ "set-up",
+ "running",
+ "finished",
+};
+
+/*
+ * A Job manages the shell commands that are run to create a single target.
+ * Each job is run in a separate subprocess by a shell. Several jobs can run
+ * in parallel.
+ *
+ * The shell commands for the target are written to a temporary file,
+ * then the shell is run with the temporary file as stdin, and the output
+ * of that shell is captured via a pipe.
+ *
+ * When a job is finished, Make_Update updates all parents of the node
+ * that was just remade, marking them as ready to be made next if all
+ * other dependencies are finished as well.
+ */
+struct Job {
+ /* The process ID of the shell running the commands */
+ int pid;
+
+ /* The target the child is making */
+ GNode *node;
+
+ /*
+ * If one of the shell commands is "...", all following commands are
+ * delayed until the .END node is made. This list node points to the
+ * first of these commands, if any.
+ */
+ StringListNode *tailCmds;
+
+ /* This is where the shell commands go. */
+ FILE *cmdFILE;
+
+ int exit_status; /* from wait4() in signal handler */
+
+ enum JobStatus status;
+
+ bool suspended;
+
+ /* Ignore non-zero exits */
+ bool ignerr;
+ /* Output the command before or instead of running it. */
+ bool echo;
+ /* Target is a special one. */
+ bool special;
+
+ int inPipe; /* Pipe for reading output from job */
+ int outPipe; /* Pipe for writing control commands */
+ struct pollfd *inPollfd; /* pollfd associated with inPipe */
+
+#define JOB_BUFSIZE 1024
+ /* Buffer for storing the output of the job, line by line. */
+ char outBuf[JOB_BUFSIZE + 1];
+ size_t outBufLen;
+
+#ifdef USE_META
+ struct BuildMon bm;
+#endif
+};
+
/*
* A shell defines how the commands are run. All commands for a target are
@@ -280,6 +363,8 @@ static enum { /* Why is the make aborting? */
} aborting = ABORT_NONE;
#define JOB_TOKENS "+EI+" /* Token to requeue for each abort state */
+static const char aborting_name[][6] = { "NONE", "ERROR", "INTR", "WAIT" };
+
/* Tracks the number of tokens currently "out" to build jobs. */
int jobTokensRunning = 0;
@@ -442,11 +527,12 @@ static void watchfd(Job *);
static void clearfd(Job *);
static char *targPrefix = NULL; /* To identify a job change in the output. */
-static Job tokenWaitJob; /* token wait pseudo-job */
+
+static Job tokenPoolJob; /* token wait pseudo-job */
static Job childExitJob; /* child exit pseudo-job */
-#define CHILD_EXIT "."
-#define DO_JOB_RESUME "R"
+#define CEJ_CHILD_EXITED '.'
+#define CEJ_RESUME_JOBS 'R'
enum {
npseudojobs = 2 /* number of pseudo-jobs */
@@ -457,7 +543,6 @@ static volatile sig_atomic_t caught_sigchld;
static void CollectOutput(Job *, bool);
static void JobInterrupt(bool, int) MAKE_ATTR_DEAD;
-static void JobRestartJobs(void);
static void JobSigReset(void);
static void
@@ -493,17 +578,38 @@ Job_FlagsToString(const Job *job, char *buf, size_t bufsize)
job->special ? 'S' : '-');
}
+#ifdef USE_META
+struct BuildMon *
+Job_BuildMon(Job *job)
+{
+ return &job->bm;
+}
+#endif
+
+GNode *
+Job_Node(Job *job)
+{
+ return job->node;
+}
+
*** 5506 LINES SKIPPED ***