Module Name:    src
Committed By:   rillig
Date:           Sun Aug 25 20:44:31 UTC 2024

Modified Files:
        src/usr.bin/make: main.c make.h var.c
        src/usr.bin/make/unit-tests: var-recursive.exp var-recursive.mk

Log Message:
make: add more context to error message about recursive variables


To generate a diff of this commit:
cvs rdiff -u -r1.632 -r1.633 src/usr.bin/make/main.c
cvs rdiff -u -r1.344 -r1.345 src/usr.bin/make/make.h
cvs rdiff -u -r1.1136 -r1.1137 src/usr.bin/make/var.c
cvs rdiff -u -r1.9 -r1.10 src/usr.bin/make/unit-tests/var-recursive.exp
cvs rdiff -u -r1.6 -r1.7 src/usr.bin/make/unit-tests/var-recursive.mk

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/main.c
diff -u src/usr.bin/make/main.c:1.632 src/usr.bin/make/main.c:1.633
--- src/usr.bin/make/main.c:1.632	Thu Jul 11 20:09:16 2024
+++ src/usr.bin/make/main.c	Sun Aug 25 20:44:31 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.632 2024/07/11 20:09:16 sjg Exp $	*/
+/*	$NetBSD: main.c,v 1.633 2024/08/25 20:44:31 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -111,7 +111,7 @@
 #include "trace.h"
 
 /*	"@(#)main.c	8.3 (Berkeley) 3/19/94"	*/
-MAKE_RCSID("$NetBSD: main.c,v 1.632 2024/07/11 20:09:16 sjg Exp $");
+MAKE_RCSID("$NetBSD: main.c,v 1.633 2024/08/25 20:44:31 rillig Exp $");
 #if defined(MAKE_NATIVE)
 __COPYRIGHT("@(#) Copyright (c) 1988, 1989, 1990, 1993 "
 	    "The Regents of the University of California.  "
@@ -1859,6 +1859,13 @@ Error(const char *fmt, ...)
 	main_errors++;
 }
 
+void
+WaitForJobs(void)
+{
+	if (jobsRunning)
+		Job_Wait();
+}
+
 /*
  * Wait for any running jobs to finish, then produce an error message,
  * finally exit immediately.
@@ -1871,8 +1878,7 @@ Fatal(const char *fmt, ...)
 {
 	va_list ap;
 
-	if (jobsRunning)
-		Job_Wait();
+	WaitForJobs();
 
 	(void)fflush(stdout);
 	fprintf(stderr, "%s: ", progname);

Index: src/usr.bin/make/make.h
diff -u src/usr.bin/make/make.h:1.344 src/usr.bin/make/make.h:1.345
--- src/usr.bin/make/make.h:1.344	Thu Jul 11 20:09:16 2024
+++ src/usr.bin/make/make.h	Sun Aug 25 20:44:31 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: make.h,v 1.344 2024/07/11 20:09:16 sjg Exp $	*/
+/*	$NetBSD: make.h,v 1.345 2024/08/25 20:44:31 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -864,6 +864,7 @@ char *getTmpdir(void) MAKE_ATTR_USE;
 bool ParseBoolean(const char *, bool) MAKE_ATTR_USE;
 const char *cached_realpath(const char *, char *);
 bool GetBooleanExpr(const char *, bool);
+void WaitForJobs(void);
 
 /* parse.c */
 extern int parseErrors;

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.1136 src/usr.bin/make/var.c:1.1137
--- src/usr.bin/make/var.c:1.1136	Sat Jul 20 08:54:19 2024
+++ src/usr.bin/make/var.c	Sun Aug 25 20:44:31 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1136 2024/07/20 08:54:19 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1137 2024/08/25 20:44:31 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -126,9 +126,10 @@
 #include "dir.h"
 #include "job.h"
 #include "metachar.h"
+#include "trace.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1136 2024/07/20 08:54:19 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1137 2024/08/25 20:44:31 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -4576,7 +4577,12 @@ Var_Parse(const char **pp, GNode *scope,
 			fprintf(stderr, "In a command near ");
 			PrintLocation(stderr, false, scope);
 		}
-		Fatal("Variable %s is recursive.", v->name.str);
+		WaitForJobs();
+		Parse_Error(PARSE_FATAL, "Variable %s is recursive.",
+		    v->name.str);
+		PrintOnError(NULL, "\n");
+		Trace_Log(MAKEERROR, NULL);
+		exit(2);	/* Not 1 so -q can distinguish error */
 	}
 
 	/*

Index: src/usr.bin/make/unit-tests/var-recursive.exp
diff -u src/usr.bin/make/unit-tests/var-recursive.exp:1.9 src/usr.bin/make/unit-tests/var-recursive.exp:1.10
--- src/usr.bin/make/unit-tests/var-recursive.exp:1.9	Thu Jul  4 20:18:40 2024
+++ src/usr.bin/make/unit-tests/var-recursive.exp	Sun Aug 25 20:44:31 2024
@@ -1,22 +1,23 @@
 make: "var-recursive.mk" line 21: still there
-make: Variable DIRECT is recursive.
-	in var-recursive.mk:22
+make: "var-recursive.mk" line 23: while evaluating variable "DIRECT" with value "${DIRECT}": Variable DIRECT is recursive.
 	in directory <curdir>
 
 make: stopped in unit-tests
-make: Variable INDIRECT1 is recursive.
-	in var-recursive.mk:29
+sub-exit status 2
+make: "var-recursive.mk" line 31: while evaluating variable "INDIRECT1" with value "${INDIRECT2}": while evaluating variable "INDIRECT2" with value "${INDIRECT1}": Variable INDIRECT1 is recursive.
 	in directory <curdir>
 
 make: stopped in unit-tests
-make: "var-recursive.mk" line 37: ok
-make: Variable V is recursive.
-	in var-recursive.mk:45
+sub-exit status 2
+make: "var-recursive.mk" line 39: ok
+make: "var-recursive.mk" line 48: while evaluating variable "V" with value "$V": Variable V is recursive.
 	in directory <curdir>
 
 make: stopped in unit-tests
+sub-exit status 2
 : OK
-In a command near "var-recursive.mk" line 57: make[1]: Variable VAR is recursive.
+In a command near "var-recursive.mk" line 60: make[1]: in target "target": while evaluating variable "VAR" with value "${VAR}": Variable VAR is recursive.
 
 make: stopped making "target" in unit-tests
+sub-exit status 2
 exit status 0

Index: src/usr.bin/make/unit-tests/var-recursive.mk
diff -u src/usr.bin/make/unit-tests/var-recursive.mk:1.6 src/usr.bin/make/unit-tests/var-recursive.mk:1.7
--- src/usr.bin/make/unit-tests/var-recursive.mk:1.6	Sun Nov 19 21:47:52 2023
+++ src/usr.bin/make/unit-tests/var-recursive.mk	Sun Aug 25 20:44:31 2024
@@ -1,4 +1,4 @@
-# $NetBSD: var-recursive.mk,v 1.6 2023/11/19 21:47:52 rillig Exp $
+# $NetBSD: var-recursive.mk,v 1.7 2024/08/25 20:44:31 rillig Exp $
 #
 # Tests for expressions that refer to themselves and thus
 # cannot be evaluated.
@@ -11,7 +11,7 @@ TEST?=	# none
 .if ${TEST} == ""
 all:
 .for test in ${TESTS}
-	@${.MAKE} -f ${MAKEFILE} TEST=${test} || :
+	@${.MAKE} -f ${MAKEFILE} TEST=${test} || echo "sub-exit status $$?"
 .endfor
 
 .elif ${TEST} == direct
@@ -19,6 +19,7 @@ all:
 DIRECT=	${DIRECT}	# Defining a recursive variable is not yet an error.
 # expect+1: still there
 .  info still there	# Therefore this line is printed.
+# expect+1: while evaluating variable "DIRECT" with value "${DIRECT}": Variable DIRECT is recursive.
 .  info ${DIRECT}	# But expanding the variable is an error.
 
 .elif ${TEST} == indirect
@@ -26,6 +27,7 @@ DIRECT=	${DIRECT}	# Defining a recursive
 # The chain of variables that refer to each other may be long.
 INDIRECT1=	${INDIRECT2}
 INDIRECT2=	${INDIRECT1}
+# expect+1: while evaluating variable "INDIRECT1" with value "${INDIRECT2}": while evaluating variable "INDIRECT2" with value "${INDIRECT1}": Variable INDIRECT1 is recursive.
 .  info ${INDIRECT1}
 
 .elif ${TEST} == conditional
@@ -42,6 +44,7 @@ CONDITIONAL=	${1:?ok:${CONDITIONAL}}
 # which takes a different code path in Var_Parse for parsing the variable
 # name.  Ensure that these are checked as well.
 V=	$V
+# expect+1: while evaluating variable "V" with value "$V": Variable V is recursive.
 .  info $V
 
 .elif ${TEST} == target

Reply via email to