Module Name:    src
Committed By:   rillig
Date:           Thu Dec 10 22:17:37 UTC 2020

Modified Files:
        src/usr.bin/make: job.c

Log Message:
make(1): split Job.errOnOrEcho into separate fields

They have never been related.  Furthermore, Job.errOn is really tricky
to reach at all.  To do that, one has to define a custom shell and set
hasErrCtl=true.  The manual page has an example for that, but it's
probably not use in practice, just like the possibility to use the C
shell for all commands.


To generate a diff of this commit:
cvs rdiff -u -r1.357 -r1.358 src/usr.bin/make/job.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/make/job.c
diff -u src/usr.bin/make/job.c:1.357 src/usr.bin/make/job.c:1.358
--- src/usr.bin/make/job.c:1.357	Thu Dec 10 21:41:35 2020
+++ src/usr.bin/make/job.c	Thu Dec 10 22:17:37 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: job.c,v 1.357 2020/12/10 21:41:35 rillig Exp $	*/
+/*	$NetBSD: job.c,v 1.358 2020/12/10 22:17:37 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -143,7 +143,7 @@
 #include "trace.h"
 
 /*	"@(#)job.c	8.2 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: job.c,v 1.357 2020/12/10 21:41:35 rillig Exp $");
+MAKE_RCSID("$NetBSD: job.c,v 1.358 2020/12/10 22:17:37 rillig Exp $");
 
 /*
  * A shell defines how the commands are run.  All commands for a target are
@@ -198,8 +198,8 @@ typedef struct Shell {
 
 	Boolean hasErrCtl;	/* set if can control error checking for
 				 * individual commands */
-	/* XXX: split into errOn and echoCmd */
-	const char *errOnOrEcho; /* template to turn on error checking */
+	const char *errOn;	/* template to turn on error checking */
+	const char *echoCmd;
 	/*
 	 * template to turn off error checking
 	 * XXX: split into errOff and execIgnore
@@ -307,7 +307,8 @@ static Shell shells[] = {
 	"",			/* .noPrint */
 	0,			/* .noPrintLen */
 	FALSE,			/* .hasErrCtl */
-	"echo \"%s\"\n",	/* .errOnOrEcho */
+	"",			/* .errOn */
+	"echo \"%s\"\n",	/* .echoCmd */
 	"%s\n",			/* .errOffOrExecIgnore */
 	"{ %s \n} || exit $?\n", /* .errExit */
 	"'\n'",			/* .newline */
@@ -328,7 +329,8 @@ static Shell shells[] = {
 	"",			/* .noPrint */
 	0,			/* .noPrintLen */
 	FALSE,			/* .hasErrCtl */
-	"echo \"%s\"\n",	/* .errOnOrEcho */
+	"",			/* .errOn */
+	"echo \"%s\"\n",	/* .echoCmd */
 	"%s\n",			/* .errOffOrExecIgnore */
 	"{ %s \n} || exit $?\n", /* .errExit */
 	"'\n'",			/* .newline */
@@ -351,7 +353,8 @@ static Shell shells[] = {
 	"set +v",		/* .noPrint */
 	6,			/* .noPrintLen */
 	FALSE,			/* .hasErrCtl */
-	"echo \"%s\"\n",	/* .errOnOrEcho */
+	"",			/* .errOn */
+	"echo \"%s\"\n",	/* .echoCmd */
 	"%s\n",			/* .errOffOrExecIgnore */
 	"{ %s \n} || exit $?\n", /* .errExit */
 	"'\n'",			/* .newline */
@@ -372,7 +375,8 @@ static Shell shells[] = {
 	"unset verbose",	/* .noPrint */
 	13,			/* .noPrintLen */
 	FALSE,			/* .hasErrCtl */
-	"echo \"%s\"\n",	/* .errOnOrEcho */
+	"",			/* .errOn */
+	"echo \"%s\"\n",	/* .echoCmd */
 	/* XXX: Mismatch between errOn and execIgnore */
 	"csh -c \"%s || exit 0\"\n", /* .errOffOrExecIgnore */
 	"",			/* .errExit */
@@ -787,11 +791,11 @@ JobPrintSpecialsEchoCtl(Job *job, RunFla
 	if (job->echo && inout_runFlags->echo) {
 		if (shell->hasEchoCtl)
 			JobPrintln(job, shell->echoOff);
-		JobPrintf(job, shell->errOnOrEcho, escCmd);
+		JobPrintf(job, shell->echoCmd, escCmd);
 		inout_runFlags->echo = FALSE;
 	} else {
 		if (inout_runFlags->echo)
-			JobPrintf(job, shell->errOnOrEcho, escCmd);
+			JobPrintf(job, shell->echoCmd, escCmd);
 	}
 	*inout_cmdTemplate = shell->errOffOrExecIgnore;
 
@@ -820,22 +824,19 @@ JobPrintSpecials(Job *const job, const c
 }
 
 /*
- * Put out another command for the given job. If the command starts with an
- * '@' or a '-' we process it specially. In the former case, so long as the
- * -s and -n flags weren't given to make, we stick a shell-specific echoOff
- * command in the script. In the latter, we ignore errors for the entire job,
- * unless the shell has error control.
- *
- * If the command is just "..." we take all future commands for this job to
- * be commands to be executed once the entire graph has been made and return
- * non-zero to signal that the end of the commands was reached. These commands
- * are later attached to the .END node and executed by Job_End when all things
- * are done.
+ * Put out another command for the given job.
  *
- * Side Effects:
- *	If the command begins with a '-' and the shell has no error control,
- *	the JOB_IGNERR flag is set in the job descriptor.
- *	numCommands is incremented if the command is actually printed.
+ * If the command starts with '@' and neither the -s nor the -n flag was
+ * given to make, we stick a shell-specific echoOff command in the script.
+ *
+ * If the command starts with '-' and the shell has no error control (none
+ * of the predefined shells has that), we ignore errors for the entire job.
+ * XXX: Why ignore errors for the entire job?
+ * XXX: Even ignore errors for the commands before this command?
+ *
+ * If the command is just "...", all further commands for this job will be
+ * executed once the entire graph has been made. These commands are later
+ * attached to the .END node and executed by Job_End when all things are done.
  */
 static void
 JobPrintCommand(Job *job, char *cmd)
@@ -906,8 +907,7 @@ JobPrintCommand(Job *job, char *cmd)
 			if (job->echo && runFlags.echo) {
 				if (shell->hasEchoCtl)
 					JobPrintln(job, shell->echoOff);
-				JobPrintf(job, shell->errOnOrEcho,
-				    escCmd);
+				JobPrintf(job, shell->echoCmd, escCmd);
 				runFlags.echo = FALSE;
 			}
 			/*
@@ -941,7 +941,7 @@ JobPrintCommand(Job *job, char *cmd)
 			JobPrintln(job, shell->echoOff);
 			runFlags.echo = FALSE;
 		}
-		JobPrintln(job, shell->errOnOrEcho);
+		JobPrintln(job, shell->errOn);
 	}
 	if (!runFlags.echo && shell->hasEchoCtl)
 		JobPrintln(job, shell->echoOn);
@@ -2351,7 +2351,10 @@ Job_ParseShell(char *line)
 			} else if (strncmp(arg, "newline=", 8) == 0) {
 				newShell.newline = arg + 8;
 			} else if (strncmp(arg, "check=", 6) == 0) {
-				newShell.errOnOrEcho = arg + 6;
+				newShell.errOn = arg + 6;
+				/* Before 2020-12-10, these two variables
+				 * used to be a single variable. */
+				newShell.echoCmd = arg + 6;
 			} else if (strncmp(arg, "ignore=", 7) == 0) {
 				newShell.errOffOrExecIgnore = arg + 7;
 			} else if (strncmp(arg, "errout=", 7) == 0) {
@@ -2439,8 +2442,8 @@ Job_ParseShell(char *line)
 		shell->hasEchoCtl = TRUE;
 
 	if (!shell->hasErrCtl) {
-		if (shell->errOnOrEcho == NULL)
-			shell->errOnOrEcho = "";
+		if (shell->echoCmd == NULL)
+			shell->echoCmd = "";
 		if (shell->errOffOrExecIgnore == NULL)
 			shell->errOffOrExecIgnore = "%s\n";
 	}

Reply via email to