Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 10 Jan 2026 21:34:06 +0000
From:      Simon J. Gerraty <sjg@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: a9319c35e816 - stable/14 - Merge bmake-20250308
Message-ID:  <6962c5ce.25ba1.72603123@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch stable/14 has been updated by sjg:

URL: https://cgit.FreeBSD.org/src/commit/?id=a9319c35e816e0fab5de5d6b6e814667a14d3e7a

commit a9319c35e816e0fab5de5d6b6e814667a14d3e7a
Author:     Simon J. Gerraty <sjg@FreeBSD.org>
AuthorDate: 2025-03-19 21:06:16 +0000
Commit:     Simon J. Gerraty <sjg@FreeBSD.org>
CommitDate: 2026-01-10 21:33:12 +0000

    Merge bmake-20250308
    
    (cherry picked from commit d9a65c5de1c9f30ae71ce0be8fb88be9d20d216d)
---
 contrib/bmake/ChangeLog           |  17 +++
 contrib/bmake/Makefile            |   8 +-
 contrib/bmake/VERSION             |   2 +-
 contrib/bmake/bmake.cat1          |   2 +-
 contrib/bmake/bsd.after-import.mk |  39 ++++--
 contrib/bmake/job.c               | 251 +++++++++++++-------------------------
 contrib/bmake/main.c              |  22 +---
 contrib/bmake/make.h              |   3 +-
 contrib/bmake/mk/ChangeLog        |  13 ++
 contrib/bmake/mk/install-mk       |   6 +-
 contrib/bmake/mk/jobs.mk          |   6 +-
 contrib/bmake/mk/meta.autodep.mk  |  20 ++-
 contrib/bmake/mk/meta.stage.mk    |  29 ++++-
 contrib/bmake/mk/sys.vars.mk      |   7 +-
 contrib/bmake/os.sh               |  10 +-
 usr.bin/bmake/Makefile            | 104 ++++++++--------
 usr.bin/bmake/Makefile.config     |   4 +-
 usr.bin/bmake/unit-tests/Makefile |   2 +-
 18 files changed, 265 insertions(+), 280 deletions(-)

diff --git a/contrib/bmake/ChangeLog b/contrib/bmake/ChangeLog
index 212b0fcfaacb..15a58e2a0924 100644
--- a/contrib/bmake/ChangeLog
+++ b/contrib/bmake/ChangeLog
@@ -1,3 +1,20 @@
+2025-03-08  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* bsd.after-import.mk: by default generate makefiles
+	closer to BSD style.
+
+	* VERSION (_MAKE_VERSION): 20250308
+	Merge with NetBSD make, pick up
+	o clean up comments and code for parallel mode
+	o job.c: avoid SIGPIPE for children, call Job_Wait befor abort.
+
+2025-02-27  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* VERSION (_MAKE_VERSION): 20250225
+	Merge with NetBSD make, pick up
+	o job.c: reliably remove targets on interrupt,
+	by passing signal to children first.
+
 2025-01-25  Simon J Gerraty  <sjg@beast.crufty.net>
 
 	* VERSION (_MAKE_VERSION): 20250125
diff --git a/contrib/bmake/Makefile b/contrib/bmake/Makefile
index 939b71c5e12c..ba2b2e742d35 100644
--- a/contrib/bmake/Makefile
+++ b/contrib/bmake/Makefile
@@ -1,4 +1,4 @@
-#	$Id: Makefile,v 1.132 2024/09/22 19:56:26 sjg Exp $
+#	$Id: Makefile,v 1.133 2025/03/08 20:12:56 sjg Exp $
 
 PROG = bmake
 
@@ -65,7 +65,7 @@ COPTS.main.c += "-D$x=\"${$x}\""
 USE_FILEMON ?= no
 .if ${USE_FILEMON:tl} != "no"
 .PATH:	${srcdir}/filemon
-SRCS+=	filemon_${USE_FILEMON}.c
+SRCS += filemon_${USE_FILEMON}.c
 COPTS.meta.c += -DUSE_FILEMON -DUSE_FILEMON_${USE_FILEMON:tu}
 COPTS.job.c += ${COPTS.meta.c}
 
@@ -134,7 +134,7 @@ SYMLINKS += ${PROG_NAME} ${BINDIR}/${PROG}
 .endif
 .endif
 
-EXTRACT_MAN=no
+EXTRACT_MAN = no
 # end-delete1
 
 .if make(obj) || make(clean)
@@ -182,7 +182,7 @@ SED_CMDS.${MAN} += -e 's/^\.Nx/NetBSD/'
 ${MAN}:	${SRCS.${MAN}} _GENFILES_USE
 
 all man beforeinstall: ${MAN}
-_mfromdir=.
+_mfromdir = .
 .endif
 .endif				# MK_GEN_MAN
 
diff --git a/contrib/bmake/VERSION b/contrib/bmake/VERSION
index 9d1a987f65d6..d26469e64381 100644
--- a/contrib/bmake/VERSION
+++ b/contrib/bmake/VERSION
@@ -1,2 +1,2 @@
 # keep this compatible with sh and make
-_MAKE_VERSION=20250125
+_MAKE_VERSION=20250308
diff --git a/contrib/bmake/bmake.cat1 b/contrib/bmake/bmake.cat1
index 8a1909e684ed..7e6f25524a05 100644
--- a/contrib/bmake/bmake.cat1
+++ b/contrib/bmake/bmake.cat1
@@ -1793,4 +1793,4 @@ BBUUGGSS
      attempt to suppress a cascade of unnecessary errors, can result in a
      seemingly unexplained `*** Error code 6'
 
-FreeBSD 14.1-RELEASE-p5        November 14, 2024       FreeBSD 14.1-RELEASE-p5
+FreeBSD 14.1-RELEASE-p7        November 14, 2024       FreeBSD 14.1-RELEASE-p7
diff --git a/contrib/bmake/bsd.after-import.mk b/contrib/bmake/bsd.after-import.mk
index f2948b855753..74811e98f979 100644
--- a/contrib/bmake/bsd.after-import.mk
+++ b/contrib/bmake/bsd.after-import.mk
@@ -1,4 +1,4 @@
-# $Id: bsd.after-import.mk,v 1.19 2024/09/21 22:44:55 sjg Exp $
+# $Id: bsd.after-import.mk,v 1.22 2025/03/09 02:56:42 sjg Exp $
 
 # This makefile is for use when integrating bmake into a BSD build
 # system.  Use this makefile after importing bmake.
@@ -9,6 +9,7 @@
 # The goal is to allow the benefits of autoconf without
 # the overhead of running configure.
 
+.MAIN: all
 all: _makefile _utmakefile
 all: after-import
 
@@ -64,6 +65,18 @@ MAKEFILE_SED = 	sed -e '/^MACHINE/d' \
 	-e '/^\..*include  *</ { s,<\([a-z]\),<bsd.\1,;/autoconf/d; }' \
 	-e 's,${SRCTOP},$${SRCTOP},g'
 
+.ifdef WITH_SPACE_ASSIGN
+.space := ${x x:L:S/x//Wg}
+.else
+.space =
+# this line noise achieves the equivalent of negating
+# /^(.if|.elif|#)|==/
+#
+MAKEFILE_SED += \
+	-e '/^\.[e ]*l*if/!{/^\#/!{/==/!s,^\([^[:space:]][^=]*\)[[:space:]][[:space:]]*\([!?:+]*=\),\1\2,;};}' \
+
+.endif
+
 # These are the simple files we want to capture
 configured_files= config.h Makefile.config unit-tests/Makefile.config
 
@@ -86,37 +99,41 @@ after-import: bootstrap ${MAKEFILE}
 	@(echo '# This is a generated file, do NOT edit!'; \
 	echo '# See ${_this:S,${SRCTOP}/,,}'; \
 	echo '#'; ${ECHO_TAG} '# $$${HOST_OS}$$'; echo; \
-	echo 'SRCTOP?= $${.CURDIR:${${.CURDIR}/$f:L:H:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; echo; \
+	echo 'SRCTOP${.space}?= $${.CURDIR:${${.CURDIR}/$f:L:H:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; echo; \
 	${MAKEFILE_SED} ${HOST_OS}/$f ) > ${.CURDIR}/$f
 .endfor
 
+.if make(all)
+_makefile _utmakefile: bootstrap ${MAKEFILE}
+.endif
+
 # this needs the most work
-_makefile:	bootstrap ${MAKEFILE}
+_makefile:
 	@echo Generating ${.CURDIR}/Makefile
 	@(echo '# This is a generated file, do NOT edit!'; \
 	echo '# See ${_this:S,${SRCTOP}/,,}'; \
 	echo '#'; ${ECHO_TAG} '# $$${HOST_OS}$$'; \
-	echo; echo 'SRCTOP?= $${.CURDIR:${.CURDIR:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; \
+	echo; echo 'SRCTOP${.space}?= $${.CURDIR:${.CURDIR:S,${SRCTOP}/,,:C,[^/]+,H,g:S,/,:,g}}'; \
 	echo; echo '# look here first for config.h'; \
-	echo 'CFLAGS+= -I$${.CURDIR}'; echo; \
+	echo 'CFLAGS${.space}+= -I$${.CURDIR}'; echo; \
 	echo '# for after-import'; \
-	echo 'CLEANDIRS+= ${HOST_OS}'; \
-	echo 'CLEANFILES+= bootstrap'; echo; \
+	echo 'CLEANDIRS${.space}+= ${HOST_OS}'; \
+	echo 'CLEANFILES${.space}+= bootstrap'; echo; \
 	${MAKEFILE_SED} \
 	${1 2:L:@n@-e '/start-delete$n/,/end-delete$n/d'@} \
 	${BMAKE_SRC}/Makefile; \
 	echo; echo '# override some simple things'; \
-	echo 'BINDIR= /usr/bin'; \
-	echo 'MANDIR= ${MANDIR:U/usr/share/man}'; \
+	echo 'BINDIR${.space}= /usr/bin'; \
+	echo 'MANDIR${.space}= ${MANDIR:U/usr/share/man}'; \
 	echo; echo '# make sure we get this'; \
-	echo 'CFLAGS+= $${COPTS.$${.IMPSRC:T}}'; \
+	echo 'CFLAGS${.space}+= $${COPTS.$${.IMPSRC:T}}'; \
 	echo; echo 'after-import: ${_this:S,${SRCTOP},\${SRCTOP},}'; \
 	echo '	cd $${.CURDIR} && $${.MAKE} -f ${_this:S,${SRCTOP},\${SRCTOP},}'; \
 	echo ) > ${.TARGET}
 	@cmp -s ${.TARGET} ${.CURDIR}/Makefile || \
 	    mv ${.TARGET} ${.CURDIR}/Makefile
 
-_utmakefile: bootstrap ${MAKEFILE}
+_utmakefile:
 	@echo Generating ${.CURDIR}/unit-tests/Makefile
 	@mkdir -p ${.CURDIR}/unit-tests
 	@(echo '# This is a generated file, do NOT edit!'; \
diff --git a/contrib/bmake/job.c b/contrib/bmake/job.c
index bd85e6d95fb8..d06b1570ba85 100644
--- a/contrib/bmake/job.c
+++ b/contrib/bmake/job.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.c,v 1.485 2025/01/19 10:57:10 rillig Exp $	*/
+/*	$NetBSD: job.c,v 1.489 2025/03/08 20:15:03 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -102,10 +102,7 @@
  *			define the shell that is used for the creation
  *			commands in jobs mode.
  *
- *	Job_Finish	Perform any final processing which needs doing.
- *			This includes the execution of any commands
- *			which have been/were attached to the .END
- *			target. It should only be called when the
+ *	Job_Finish	Make the .END target. Should only be called when the
  *			job table is empty.
  *
  *	Job_AbortAll	Abort all currently running jobs. Do not handle
@@ -154,7 +151,7 @@
 #include "trace.h"
 
 /*	"@(#)job.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: job.c,v 1.485 2025/01/19 10:57:10 rillig Exp $");
+MAKE_RCSID("$NetBSD: job.c,v 1.489 2025/03/08 20:15:03 rillig Exp $");
 
 /*
  * A shell defines how the commands are run.  All commands for a target are
@@ -689,7 +686,7 @@ JobPassSig_suspend(int signo)
 	act.sa_flags = 0;
 	(void)sigaction(signo, &act, NULL);
 
-	DEBUG1(JOB, "JobPassSig passing signal %d to self.\n", signo);
+	DEBUG1(JOB, "JobPassSig_suspend passing signal %d to self.\n", signo);
 
 	(void)kill(getpid(), signo);
 
@@ -1251,8 +1248,16 @@ JobFinish (Job *job, WAIT_T status)
 	if (return_job_token)
 		Job_TokenReturn();
 
-	if (aborting == ABORT_ERROR && jobTokensRunning == 0)
-		Finish(job_errors);
+	if (aborting == ABORT_ERROR && jobTokensRunning == 0) {
+		if (shouldDieQuietly(NULL, -1)) {
+			/*
+			 * TODO: better clean up properly, to avoid killing
+			 *  child processes by SIGPIPE.
+			 */
+			exit(2);
+		}
+		Fatal("%d error%s", job_errors, job_errors == 1 ? "" : "s");
+	}
 }
 
 static void
@@ -1962,27 +1967,14 @@ JobRun(GNode *targ)
 	}
 }
 
-/*
- * Handle the exit of a child. Called from Make_Make.
- *
- * The job descriptor is removed from the list of children.
- *
- * Notes:
- *	We do waits, blocking or not, according to the wisdom of our
- *	caller, until there are no more children to report. For each
- *	job, call JobFinish to finish things off.
- */
 void
 Job_CatchChildren(void)
 {
-	int pid;		/* pid of dead child */
-	WAIT_T status;		/* Exit/termination status */
+	int pid;
+	WAIT_T status;
 
-	/* Don't even bother if we know there's no one around. */
 	if (jobTokensRunning == 0)
 		return;
-
-	/* Have we received SIGCHLD since last call? */
 	if (caught_sigchld == 0)
 		return;
 	caught_sigchld = 0;
@@ -2001,21 +1993,19 @@ Job_CatchChildren(void)
 void
 JobReapChild(pid_t pid, WAIT_T status, bool isJobs)
 {
-	Job *job;		/* job descriptor for dead child */
+	Job *job;
 
-	/* Don't even bother if we know there's no one around. */
 	if (jobTokensRunning == 0)
 		return;
 
 	job = JobFindPid(pid, JOB_ST_RUNNING, isJobs);
 	if (job == NULL) {
-		if (isJobs) {
-			if (!lurking_children)
-				Error("Child (%d) status %x not in table?",
-				    pid, status);
-		}
-		return;		/* not ours */
+		if (isJobs && !lurking_children)
+			Error("Child (%d) status %x not in table?",
+			    pid, status);
+		return;
 	}
+
 	if (WIFSTOPPED(status)) {
 		DEBUG2(JOB, "Process %d (%s) stopped.\n",
 		    job->pid, job->node->name);
@@ -2047,12 +2037,6 @@ JobReapChild(pid_t pid, WAIT_T status, bool isJobs)
 	JobFinish(job, status);
 }
 
-/*
- * Catch the output from our children, if we're using pipes do so. Otherwise
- * just block time until we get a signal(most likely a SIGCHLD) since there's
- * no point in just spinning when there's nothing to do and the reaping of a
- * child can wait for a while.
- */
 void
 Job_CatchOutput(void)
 {
@@ -2062,7 +2046,7 @@ Job_CatchOutput(void)
 
 	(void)fflush(stdout);
 
-	/* The first fd in the list is the job token pipe */
+	/* Skip the first fd in the list, as it is the job token pipe. */
 	do {
 		nready = poll(fds + 1 - wantToken, fdsLen - 1 + wantToken,
 		    POLL_MSEC);
@@ -2073,13 +2057,12 @@ Job_CatchOutput(void)
 
 	if (nready > 0 && readyfd(&childExitJob)) {
 		char token = 0;
-		ssize_t count;
-		count = read(childExitJob.inPipe, &token, 1);
+		ssize_t count = read(childExitJob.inPipe, &token, 1);
 		if (count == 1) {
 			if (token == DO_JOB_RESUME[0])
 				/*
 				 * Complete relay requested from our SIGCONT
-				 * handler
+				 * handler.
 				 */
 				JobRestartJobs();
 		} else if (count == 0)
@@ -2160,10 +2143,7 @@ Shell_Init(void)
 	}
 }
 
-/*
- * Return the string literal that is used in the current command shell
- * to produce a newline character.
- */
+/* Return the shell string literal that results in a newline character. */
 const char *
 Shell_GetNewline(void)
 {
@@ -2192,12 +2172,11 @@ AddSig(int sig, SignalProc handler)
 	}
 }
 
-/* Initialize the process module. */
 void
 Job_Init(void)
 {
 	Job_SetPrefix();
-	/* Allocate space for all the job info */
+
 	job_table = bmake_malloc((size_t)opts.maxJobs * sizeof *job_table);
 	memset(job_table, 0, (size_t)opts.maxJobs * sizeof *job_table);
 	job_table_end = job_table + opts.maxJobs;
@@ -2214,8 +2193,8 @@ Job_Init(void)
 
 
 	/*
-	 * There is a non-zero chance that we already have children.
-	 * eg after 'make -f- <<EOF'
+	 * There is a non-zero chance that we already have children,
+	 * e.g. after 'make -f- <<EOF'.
 	 * Since their termination causes a 'Child (pid) not in table'
 	 * message, Collect the status of any that are already dead, and
 	 * suppress the error message if there are any undead ones.
@@ -2237,7 +2216,6 @@ Job_Init(void)
 	JobCreatePipe(&childExitJob, 3);
 
 	{
-		/* Preallocate enough for the maximum number of jobs. */
 		size_t nfds = (npseudojobs + (size_t)opts.maxJobs) *
 			      nfds_per_job();
 		fds = bmake_malloc(sizeof *fds * nfds);
@@ -2249,24 +2227,19 @@ Job_Init(void)
 	watchfd(&childExitJob);
 
 	sigemptyset(&caught_signals);
-	/* Install a SIGCHLD handler. */
 	(void)bmake_signal(SIGCHLD, JobChildSig);
 	sigaddset(&caught_signals, SIGCHLD);
 
-	/*
-	 * Catch the four signals that POSIX specifies if they aren't ignored.
-	 * JobPassSig will take care of calling JobInterrupt if appropriate.
-	 */
+	/* Handle the signals specified by POSIX. */
 	AddSig(SIGINT, JobPassSig_int);
 	AddSig(SIGHUP, JobPassSig_term);
 	AddSig(SIGTERM, JobPassSig_term);
 	AddSig(SIGQUIT, JobPassSig_term);
 
 	/*
-	 * There are additional signals that need to be caught and passed if
-	 * either the export system wants to be told directly of signals or if
-	 * we're giving each job its own process group (since then it won't get
-	 * signals from the terminal driver as we own the terminal)
+	 * These signals need to be passed to the jobs, as each job has its
+	 * own process group and thus the terminal driver doesn't forward the
+	 * signals itself.
 	 */
 	AddSig(SIGTSTP, JobPassSig_suspend);
 	AddSig(SIGTTOU, JobPassSig_suspend);
@@ -2275,10 +2248,7 @@ Job_Init(void)
 	AddSig(SIGCONT, JobContinueSig);
 
 	(void)Job_RunTarget(".BEGIN", NULL);
-	/*
-	 * Create the .END node now, even though no code in the unit tests
-	 * depends on it.  See also Targ_GetEndNode in Compat_MakeAll.
-	 */
+	/* Create the .END node, see Targ_GetEndNode in Compat_MakeAll. */
 	(void)Targ_GetEndNode();
 }
 
@@ -2304,7 +2274,6 @@ JobSigReset(void)
 	(void)bmake_signal(SIGCHLD, SIG_DFL);
 }
 
-/* Find a shell in 'shells' given its name, or return NULL. */
 static Shell *
 FindShellByName(const char *name)
 {
@@ -2326,40 +2295,35 @@ FindShellByName(const char *name)
  *	line		The shell spec
  *
  * Results:
- *	false if the specification was incorrect.
- *
- * Side Effects:
- *	'shell' points to a Shell structure (either predefined or
- *	created from the shell spec), shellPath is the full path of the
- *	shell described by 'shell', while shellName is just the
- *	final component of shellPath.
+ *	Returns false if the specification was incorrect.
+ *	If successful, 'shell' is usable, shellPath is the full path of the
+ *	shell described by 'shell', and shellName is the final component of
+ *	shellPath.
  *
  * Notes:
- *	A shell specification consists of a .SHELL target, with dependency
- *	operator, followed by a series of blank-separated words. Double
- *	quotes can be used to use blanks in words. A backslash escapes
+ *	A shell specification has the form ".SHELL: keyword=value...". Double
+ *	quotes can be used to enclose blanks in words. A backslash escapes
  *	anything (most notably a double-quote and a space) and
- *	provides the functionality it does in C. Each word consists of
- *	keyword and value separated by an equal sign. There should be no
- *	unnecessary spaces in the word. The keywords are as follows:
+ *	provides the usual escape sequences from C. There should be no
+ *	unnecessary spaces in the word. The keywords are:
  *	    name	Name of shell.
  *	    path	Location of shell.
  *	    quiet	Command to turn off echoing.
  *	    echo	Command to turn echoing on
- *	    filter	Result of turning off echoing that shouldn't be
- *			printed.
- *	    echoFlag	Flag to turn echoing on at the start
- *	    errFlag	Flag to turn error checking on at the start
- *	    hasErrCtl	True if shell has error checking control
- *	    newline	String literal to represent a newline char
- *	    check	Command to turn on error checking if hasErrCtl
- *			is true or template of command to echo a command
- *			for which error checking is off if hasErrCtl is
- *			false.
- *	    ignore	Command to turn off error checking if hasErrCtl
- *			is true or template of command to execute a
- *			command so as to ignore any errors it returns if
- *			hasErrCtl is false.
+ *	    filter	The output from the shell command that turns off
+ *			echoing, to be filtered from the final output.
+ *	    echoFlag	Flag to turn echoing on at the start.
+ *	    errFlag	Flag to turn error checking on at the start.
+ *	    hasErrCtl	True if the shell has error checking control.
+ *	    newline	String literal to represent a newline character.
+ *	    check	If hasErrCtl is true: The command to turn on error
+ *			checking. If hasErrCtl is false: The template for a
+ *			shell command that echoes a command for which error
+ *			checking is off.
+ *	    ignore	If hasErrCtl is true: The command to turn off error
+ *			checking. If hasErrCtl is false: The template for a
+ *			shell command that executes a command so as to ignore
+ *			any errors it returns.
  */
 bool
 Job_ParseShell(char *line)
@@ -2380,7 +2344,6 @@ Job_ParseShell(char *line)
 
 	memset(&newShell, 0, sizeof newShell);
 
-	/* Parse the specification by keyword. */
 	wordsList = Str_Words(line, true);
 	words = wordsList.words;
 	argc = wordsList.len;
@@ -2444,12 +2407,6 @@ Job_ParseShell(char *line)
 	}
 
 	if (path == NULL) {
-		/*
-		 * If no path was given, the user wants one of the
-		 * pre-defined shells, yes? So we find the one s/he wants
-		 * with the help of FindShellByName and set things up the
-		 * right way. shellPath will be set up by Shell_Init.
-		 */
 		if (newShell.name == NULL) {
 			Parse_Error(PARSE_FATAL,
 			    "Neither path nor name specified");
@@ -2465,10 +2422,6 @@ Job_ParseShell(char *line)
 			shell = sh;
 			shellName = newShell.name;
 			if (shellPath != NULL) {
-				/*
-				 * Shell_Init has already been called!
-				 * Do it again.
-				 */
 				free(shellPath);
 				shellPath = NULL;
 				Shell_Init();
@@ -2491,7 +2444,7 @@ Job_ParseShell(char *line)
 			shell = bmake_malloc(sizeof *shell);
 			*shell = newShell;
 		}
-		/* this will take care of shellErrFlag */
+		/* This will take care of shellErrFlag. */
 		Shell_Init();
 	}
 
@@ -2506,7 +2459,7 @@ Job_ParseShell(char *line)
 	}
 
 	/*
-	 * Do not free up the words themselves, since they might be in use
+	 * Do not free up the words themselves, since they may be in use
 	 * by the shell specification.
 	 */
 	free(words);
@@ -2514,36 +2467,22 @@ Job_ParseShell(char *line)
 }
 
 /*
- * Handle the receipt of an interrupt.
- *
- * All children are killed. Another job will be started if the .INTERRUPT
- * target is defined.
- *
- * Input:
- *	runINTERRUPT	Non-zero if commands for the .INTERRUPT target
- *			should be executed
- *	signo		signal received
+ * After receiving an interrupt signal, terminate all child processes and if
+ * necessary make the .INTERRUPT target.
  */
 static void
 JobInterrupt(bool runINTERRUPT, int signo)
 {
-	Job *job;		/* job descriptor in that element */
-	GNode *interrupt;	/* the node describing the .INTERRUPT target */
+	Job *job;
+	GNode *interrupt;
 	sigset_t mask;
-	GNode *gn;
 
 	aborting = ABORT_INTERRUPT;
 
 	JobSigLock(&mask);
 
 	for (job = job_table; job < job_table_end; job++) {
-		if (job->status != JOB_ST_RUNNING)
-			continue;
-
-		gn = job->node;
-
-		JobDeleteTarget(gn);
-		if (job->pid != 0) {
+		if (job->status == JOB_ST_RUNNING && job->pid != 0) {
 			DEBUG2(JOB,
 			    "JobInterrupt passing signal %d to child %d.\n",
 			    signo, job->pid);
@@ -2551,6 +2490,14 @@ JobInterrupt(bool runINTERRUPT, int signo)
 		}
 	}
 
+	for (job = job_table; job < job_table_end; job++) {
+		if (job->status == JOB_ST_RUNNING && job->pid != 0) {
+			int status;
+			(void)waitpid(job->pid, &status, 0);
+			JobDeleteTarget(job->node);
+		}
+	}
+
 	JobSigUnlock(&mask);
 
 	if (runINTERRUPT && !opts.touch) {
@@ -2564,11 +2511,7 @@ JobInterrupt(bool runINTERRUPT, int signo)
 	exit(signo);		/* XXX: why signo? */
 }
 
-/*
- * Do the final processing, i.e. run the commands attached to the .END target.
- *
- * Return the number of errors reported.
- */
+/* Make the .END target, returning the number of job-related errors. */
 int
 Job_Finish(void)
 {
@@ -2584,7 +2527,6 @@ Job_Finish(void)
 }
 
 #ifdef CLEANUP
-/* Clean up any memory used by the jobs module. */
 void
 Job_End(void)
 {
@@ -2592,14 +2534,11 @@ Job_End(void)
 }
 #endif
 
-/*
- * Waits for all running jobs to finish and returns.
- * Sets 'aborting' to ABORT_WAIT to prevent other jobs from starting.
- */
+/* Waits for all running jobs to finish. */
 void
 Job_Wait(void)
 {
-	aborting = ABORT_WAIT;
+	aborting = ABORT_WAIT;	/* Prevent other jobs from starting. */
 	while (jobTokensRunning != 0) {
 		Job_CatchOutput();
 	}
@@ -2610,14 +2549,12 @@ Job_Wait(void)
  * Abort all currently running jobs without handling output or anything.
  * This function is to be called only in the event of a major error.
  * Most definitely NOT to be called from JobInterrupt.
- *
- * All children are killed, not just the firstborn.
  */
 void
 Job_AbortAll(void)
 {
-	Job *job;		/* the job descriptor in that element */
-	WAIT_T foo;
+	Job *job;
+	WAIT_T status;
 
 	aborting = ABORT_ERROR;
 
@@ -2625,25 +2562,18 @@ Job_AbortAll(void)
 		for (job = job_table; job < job_table_end; job++) {
 			if (job->status != JOB_ST_RUNNING)
 				continue;
-			/*
-			 * kill the child process with increasingly drastic
-			 * signals to make darn sure it's dead.
-			 */
 			KILLPG(job->pid, SIGINT);
 			KILLPG(job->pid, SIGKILL);
 		}
 	}
 
-	/*
-	 * Catch as many children as want to report in at first, then give up
-	 */
-	while (waitpid((pid_t)-1, &foo, WNOHANG) > 0)
+	while (waitpid((pid_t)-1, &status, WNOHANG) > 0)
 		continue;
 }
 
 /*
  * Tries to restart stopped jobs if there are slots available.
- * Called in process context in response to a SIGCONT.
+ * Called in response to a SIGCONT.
  */
 static void
 JobRestartJobs(void)
@@ -2708,10 +2638,6 @@ clearfd(Job *job)
 	fdsLen--;
 #if defined(USE_FILEMON) && !defined(USE_FILEMON_DEV)
 	if (useMeta) {
-		/*
-		 * Sanity check: there should be two fds per job, so the job's
-		 * pollfd number should be even.
-		 */
 		assert(nfds_per_job() == 2);
 		if (i % 2 != 0)
 			Punt("odd-numbered fd with meta");
@@ -2756,7 +2682,7 @@ JobTokenAdd(void)
 		tok = '+';		/* no error token */
 	}
 
-	/* If we are depositing an error token flush everything else */
+	/* If we are depositing an error token, flush everything else. */
 	while (tok != '+' && read(tokenWaitJob.inPipe, &tok1, 1) == 1)
 		continue;
 
@@ -2766,7 +2692,6 @@ JobTokenAdd(void)
 		continue;
 }
 
-/* Get a temp file */
 int
 Job_TempFile(const char *pattern, char *tfile, size_t tfile_sz)
 {
@@ -2782,7 +2707,7 @@ Job_TempFile(const char *pattern, char *tfile, size_t tfile_sz)
 	return fd;
 }
 
-/* Prep the job token pipe in the root make process. */
+/* Prepare the job token pipe in the root make process. */
 void
 Job_ServerStart(int max_tokens, int jp_0, int jp_1)
 {
@@ -2790,7 +2715,6 @@ Job_ServerStart(int max_tokens, int jp_0, int jp_1)
 	char jobarg[64];
 
 	if (jp_0 >= 0 && jp_1 >= 0) {
-		/* Pipe passed in from parent */
 		tokenWaitJob.inPipe = jp_0;
 		tokenWaitJob.outPipe = jp_1;
 		(void)fcntl(jp_0, F_SETFD, FD_CLOEXEC);
@@ -2832,7 +2756,7 @@ Job_TokenReturn(void)
 /*
  * Attempt to withdraw a token from the pool.
  *
- * If pool is empty, set wantToken so that we wake up when a token is
+ * If the pool is empty, set wantToken so that we wake up when a token is
  * released.
  *
  * Returns true if a token was withdrawn, and false if the pool is currently
@@ -2871,8 +2795,10 @@ Job_TokenWithdraw(void)
 		while (write(tokenWaitJob.outPipe, &tok, 1) == -1 &&
 		       errno == EAGAIN)
 			continue;
-		if (shouldDieQuietly(NULL, 1))
-			exit(6);	/* we aborted */
+		if (shouldDieQuietly(NULL, 1)) {
+			Job_Wait();
+			exit(6);
+		}
 		Fatal("A failure has been detected "
 		      "in another branch of the parallel make");
 	}
@@ -2888,12 +2814,7 @@ Job_TokenWithdraw(void)
 	return true;
 }
 
-/*
- * Run the named target if found. If a filename is specified, then set that
- * to the sources.
- *
- * Exits if the target fails.
- */
+/* Make the named target if found, exit if the target fails. */
 bool
 Job_RunTarget(const char *target, const char *fname)
 {
diff --git a/contrib/bmake/main.c b/contrib/bmake/main.c
index 0b48b2d59389..9577fb41ee7b 100644
--- a/contrib/bmake/main.c
+++ b/contrib/bmake/main.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.638 2025/01/19 12:59:39 rillig Exp $	*/
+/*	$NetBSD: main.c,v 1.639 2025/03/07 06:50:34 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -83,9 +83,6 @@
  *	Fatal		Print an error message and exit.
  *
  *	Punt		Abort all jobs and exit with a message.
- *
- *	Finish		Finish things up by printing the number of errors
- *			that occurred, and exit.
  */
 
 #include <sys/types.h>
@@ -111,7 +108,7 @@
 #include "trace.h"
 
 /*	"@(#)main.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: main.c,v 1.638 2025/01/19 12:59:39 rillig Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.639 2025/03/07 06:50:34 rillig Exp $");
 #if defined(MAKE_NATIVE)
 __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
 	    "The Regents of the University of California.  "
@@ -1783,7 +1780,7 @@ Cmd_Exec(const char *cmd, char **error)
 	int pipefds[2];
 	int cpid;		/* Child PID */
 	int pid;		/* PID from wait() */
-	int status;		/* command exit status */
+	WAIT_T status;		/* command exit status */
 	Buffer buf;		/* buffer to store the result */
 	ssize_t bytes_read;
 	char *output;
@@ -1962,19 +1959,6 @@ DieHorribly(void)
 	exit(2);		/* Not 1 so -q can distinguish error */
 }
 
-/*
- * Called when aborting due to errors in child shell to signal abnormal exit.
- * The program exits.
- * Errors is the number of errors encountered in Make_Make.
- */
-void
-Finish(int errs)
-{
-	if (shouldDieQuietly(NULL, -1))
-		exit(2);
-	Fatal("%d error%s", errs, errs == 1 ? "" : "s");
-}
-
 int
 unlink_file(const char *file)
 {
diff --git a/contrib/bmake/make.h b/contrib/bmake/make.h
index 05714ddfd151..33df57c58198 100644
--- a/contrib/bmake/make.h
+++ b/contrib/bmake/make.h
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.h,v 1.349 2025/01/19 10:57:10 rillig Exp $	*/
+/*	$NetBSD: make.h,v 1.350 2025/03/07 06:50:34 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -889,7 +889,6 @@ void Error(const char *, ...) MAKE_ATTR_PRINTFLIKE(1, 2);
 void Fatal(const char *, ...) MAKE_ATTR_PRINTFLIKE(1, 2) MAKE_ATTR_DEAD;
 void Punt(const char *, ...) MAKE_ATTR_PRINTFLIKE(1, 2) MAKE_ATTR_DEAD;
 void DieHorribly(void) MAKE_ATTR_DEAD;
-void Finish(int) MAKE_ATTR_DEAD;
 int unlink_file(const char *) MAKE_ATTR_USE;
 void execDie(const char *, const char *);
 char *getTmpdir(void) MAKE_ATTR_USE;
diff --git a/contrib/bmake/mk/ChangeLog b/contrib/bmake/mk/ChangeLog
index 4274d9d3483b..99f4b05be61c 100644
--- a/contrib/bmake/mk/ChangeLog
+++ b/contrib/bmake/mk/ChangeLog
@@ -1,3 +1,16 @@
+2025-03-14  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* install-mk (MK_VERSION): 20250314
+
+	* meta.stage.mk: StageFiles --subdir: preserve the dir part of
+	each file under $dest 
+
+2025-03-12  Simon J Gerraty  <sjg@beast.crufty.net>
+
+	* meta.autodep.mk: do a better job of handling MAKESYSPATH in
+	GENDIRDEPS_ENV.  If we have MAKE_VERSION >= 20230123 we can just
+	use .SYSPATH, otherwise it is a bit more complicated.
+
 2025-01-10  Simon J Gerraty  <sjg@beast.crufty.net>
 
 	* rust.mk: use RUST_LIBS and RUST_PROGS
diff --git a/contrib/bmake/mk/install-mk b/contrib/bmake/mk/install-mk
index b455832b7726..d765fbba2251 100644
--- a/contrib/bmake/mk/install-mk
+++ b/contrib/bmake/mk/install-mk
@@ -59,9 +59,9 @@
 #       Simon J. Gerraty <sjg@crufty.net>
 
 # RCSid:
-#	$Id: install-mk,v 1.262 2025/01/05 01:16:19 sjg Exp $
+#	$Id: install-mk,v 1.263 2025/03/14 20:29:35 sjg Exp $
 #
-#	@(#) Copyright (c) 1994-2024 Simon J. Gerraty
+#	@(#) Copyright (c) 1994-2025 Simon J. Gerraty
 #
 #	This file is provided in the hope that it will
 #	be of use.  There is absolutely NO WARRANTY.
@@ -74,7 +74,7 @@
 #	sjg@crufty.net
 #
 
-MK_VERSION=20250101
+MK_VERSION=20250314
 OWNER=
 GROUP=
 MODE=444
diff --git a/contrib/bmake/mk/jobs.mk b/contrib/bmake/mk/jobs.mk
index f39f1eb178ae..e304e16a9c56 100644
--- a/contrib/bmake/mk/jobs.mk
+++ b/contrib/bmake/mk/jobs.mk
@@ -1,8 +1,8 @@
 # SPDX-License-Identifier: BSD-2-Clause
 #
-# $Id: jobs.mk,v 1.17 2024/02/17 17:26:57 sjg Exp $
+# $Id: jobs.mk,v 1.19 2025/02/03 21:18:44 sjg Exp $
 #
-#	@(#) Copyright (c) 2012-2023, Simon J. Gerraty
+#	@(#) Copyright (c) 2012-2025, Simon J. Gerraty
 #
 #	This file is provided in the hope that it will
 #	be of use.  There is absolutely NO WARRANTY.
@@ -68,7 +68,7 @@ NEWLOG_SH := ${(type newlog.sh) 2> /dev/null:L:sh:M/*}
 .endif
 .endif
 .if !empty(NEWLOG_SH) && exists(${NEWLOG_SH})
-NEWLOG := sh ${NEWLOG_SH}
+NEWLOG := ${.SHELL:Ush} ${NEWLOG_SH}
 JOB_NEWLOG_ARGS ?= -S -n ${JOB_LOG_GENS}
 .else
 NEWLOG = :
diff --git a/contrib/bmake/mk/meta.autodep.mk b/contrib/bmake/mk/meta.autodep.mk
index 55f2d66e56aa..b94891b1b93f 100644
--- a/contrib/bmake/mk/meta.autodep.mk
+++ b/contrib/bmake/mk/meta.autodep.mk
@@ -1,9 +1,9 @@
 # SPDX-License-Identifier: BSD-2-Clause
 #
-# $Id: meta.autodep.mk,v 1.63 2024/04/24 18:56:41 sjg Exp $
+# $Id: meta.autodep.mk,v 1.65 2025/03/14 20:28:42 sjg Exp $
 
 #
-#	@(#) Copyright (c) 2010, Simon J. Gerraty
+#	@(#) Copyright (c) 2010-2025, Simon J. Gerraty
 #
 #	This file is provided in the hope that it will
 #	be of use.  There is absolutely NO WARRANTY.
@@ -281,14 +281,26 @@ META_FILES := ${META_XTRAS:U:O:u} ${META_FILES:U:T:O:u:${META_FILE_FILTER:ts:}}
 .export META_FILES
 .endif
 
+_this_dir := ${_PARSEDIR}
+.if ${MAKE_VERSION} < 20230123
 # we might have .../ in MAKESYSPATH
-_makesyspath:= ${_PARSEDIR}
+_makesyspath := ${MAKESYSPATH:U${_this_dir}}
+.if ${.MAKEFLAGS:M-m} != ""
+_makesyspath := ${.MAKEFLAGS:S,-m ,-m,gW:M-m*:S,-m, ,:ts:}:${_makesyspath}
+.endif
+_makesyspath := ${_makesyspath:C,\.\.\./[^:]*,${_this_dir},}
+GENDIRDEPS_ENV += MAKESYSPATH=${_makesyspath}
+.else
+# add this if not already there
+.SYSPATH: ${_this_dir}
+GENDIRDEPS_ENV += MAKESYSPATH=${.SYSPATH:ts:}
+.endif
+
 ${_DEPENDFILE}: ${_depend} ${.PARSEDIR}/gendirdeps.mk  ${META2DEPS} $${.MAKE.META.CREATED}
 	@echo Checking $@: ${.OODATE:T:[1..8]}
 	@(cd . && ${GENDIRDEPS_ENV} \
 	SKIP_GENDIRDEPS='${SKIP_GENDIRDEPS:O:u}' \
 	DPADD='${FORCE_DPADD:O:u}' ${_gendirdeps_mutex} \
-	MAKESYSPATH=${_makesyspath} \
 	${.MAKE} -f gendirdeps.mk RELDIR=${RELDIR} _DEPENDFILE=${_DEPENDFILE})
 	@test -s $@ && touch $@; :
 .endif
diff --git a/contrib/bmake/mk/meta.stage.mk b/contrib/bmake/mk/meta.stage.mk
index 345df6aae16b..97e4dce83e5d 100644
--- a/contrib/bmake/mk/meta.stage.mk
+++ b/contrib/bmake/mk/meta.stage.mk
@@ -1,8 +1,8 @@
 # SPDX-License-Identifier: BSD-2-Clause
 #
-# $Id: meta.stage.mk,v 1.69 2024/02/17 17:26:57 sjg Exp $
+# $Id: meta.stage.mk,v 1.71 2025/03/14 20:28:42 sjg Exp $
 #
*** 374 LINES SKIPPED ***


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6962c5ce.25ba1.72603123>