Module Name: src Committed By: rillig Date: Sat Mar 29 21:30:48 UTC 2025
Modified Files: src/usr.bin/make: make.h parse.c var.c src/usr.bin/make/unit-tests: varparse-errors.exp varparse-errors.mk Log Message: make: in a stack trace with details and includes, list the current file To generate a diff of this commit: cvs rdiff -u -r1.350 -r1.351 src/usr.bin/make/make.h cvs rdiff -u -r1.738 -r1.739 src/usr.bin/make/parse.c cvs rdiff -u -r1.1151 -r1.1152 src/usr.bin/make/var.c cvs rdiff -u -r1.17 -r1.18 src/usr.bin/make/unit-tests/varparse-errors.exp cvs rdiff -u -r1.20 -r1.21 src/usr.bin/make/unit-tests/varparse-errors.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/make.h diff -u src/usr.bin/make/make.h:1.350 src/usr.bin/make/make.h:1.351 --- src/usr.bin/make/make.h:1.350 Fri Mar 7 06:50:34 2025 +++ src/usr.bin/make/make.h Sat Mar 29 21:30:47 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: make.h,v 1.350 2025/03/07 06:50:34 rillig Exp $ */ +/* $NetBSD: make.h,v 1.351 2025/03/29 21:30:47 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -1055,7 +1055,7 @@ void Global_Append(const char *, const c void Global_Delete(const char *); void Global_Set_ReadOnly(const char *, const char *); -void EvalStack_PrintDetails(void); +bool EvalStack_PrintDetails(void) MAKE_ATTR_USE; /* util.c */ typedef void (*SignalProc)(int); Index: src/usr.bin/make/parse.c diff -u src/usr.bin/make/parse.c:1.738 src/usr.bin/make/parse.c:1.739 --- src/usr.bin/make/parse.c:1.738 Tue Jan 14 21:34:09 2025 +++ src/usr.bin/make/parse.c Sat Mar 29 21:30:47 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.738 2025/01/14 21:34:09 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.739 2025/03/29 21:30:47 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -105,7 +105,7 @@ #include "pathnames.h" /* "@(#)parse.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: parse.c,v 1.738 2025/01/14 21:34:09 rillig Exp $"); +MAKE_RCSID("$NetBSD: parse.c,v 1.739 2025/03/29 21:30:47 rillig Exp $"); /* Detects a multiple-inclusion guard in a makefile. */ typedef enum { @@ -395,14 +395,15 @@ PrintStackTrace(bool includingInnermost) const IncludedFile *entries; size_t i, n; - EvalStack_PrintDetails(); + bool hasDetails = EvalStack_PrintDetails(); n = includes.len; if (n == 0) return; entries = GetInclude(0); - if (!includingInnermost && entries[n - 1].forLoop == NULL) + if (!includingInnermost && !(hasDetails && n > 1) + && entries[n - 1].forLoop == NULL) n--; /* already in the diagnostic */ for (i = n; i-- > 0;) { Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.1151 src/usr.bin/make/var.c:1.1152 --- src/usr.bin/make/var.c:1.1151 Sat Mar 29 19:08:52 2025 +++ src/usr.bin/make/var.c Sat Mar 29 21:30:47 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.1151 2025/03/29 19:08:52 rillig Exp $ */ +/* $NetBSD: var.c,v 1.1152 2025/03/29 21:30:47 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -128,7 +128,7 @@ #include "metachar.h" /* "@(#)var.c 8.3 (Berkeley) 3/19/94" */ -MAKE_RCSID("$NetBSD: var.c,v 1.1151 2025/03/29 19:08:52 rillig Exp $"); +MAKE_RCSID("$NetBSD: var.c,v 1.1152 2025/03/29 21:30:47 rillig Exp $"); /* * Variables are defined using one of the VAR=value assignments. Their @@ -370,7 +370,7 @@ EvalStack_Pop(void) evalStack.len--; } -void +bool EvalStack_PrintDetails(void) { size_t i; @@ -397,6 +397,7 @@ EvalStack_PrintDetails(void) value != NULL ? "\" with value \"" : "", value != NULL ? value : ""); } + return evalStack.len > 0; } static Var * Index: src/usr.bin/make/unit-tests/varparse-errors.exp diff -u src/usr.bin/make/unit-tests/varparse-errors.exp:1.17 src/usr.bin/make/unit-tests/varparse-errors.exp:1.18 --- src/usr.bin/make/unit-tests/varparse-errors.exp:1.17 Sat Mar 29 19:08:53 2025 +++ src/usr.bin/make/unit-tests/varparse-errors.exp Sat Mar 29 21:30:47 2025 @@ -40,6 +40,13 @@ make: "varparse-errors.mk" line 105: Unc while evaluating "${:U:gmtime" with value "<timestamp>" make: "varparse-errors.mk" line 107: Unclosed expression, expecting '}' for modifier "localtime" while evaluating "${:U:localtime" with value "<timestamp>" +make: "varparse-errors.tmp" line 1: Unknown modifier ":Z" + while evaluating "${:Z}" with value "" + while evaluating variable "INDIRECT" with value "${:Z}" + while evaluating variable "VALUE" with value "${INDIRECT}" + in varparse-errors.tmp:1 + in varparse-errors.mk:126 +make: "varparse-errors.tmp" line 1: make: Fatal errors encountered -- cannot continue make: stopped in unit-tests exit status 1 Index: src/usr.bin/make/unit-tests/varparse-errors.mk diff -u src/usr.bin/make/unit-tests/varparse-errors.mk:1.20 src/usr.bin/make/unit-tests/varparse-errors.mk:1.21 --- src/usr.bin/make/unit-tests/varparse-errors.mk:1.20 Sat Mar 29 19:08:53 2025 +++ src/usr.bin/make/unit-tests/varparse-errors.mk Sat Mar 29 21:30:48 2025 @@ -1,4 +1,4 @@ -# $NetBSD: varparse-errors.mk,v 1.20 2025/03/29 19:08:53 rillig Exp $ +# $NetBSD: varparse-errors.mk,v 1.21 2025/03/29 21:30:48 rillig Exp $ # Tests for parsing and evaluating all kinds of expressions. # @@ -105,3 +105,23 @@ UNCLOSED:= ${:U:_ UNCLOSED:= ${:U:gmtime # expect+1: Unclosed expression, expecting '}' for modifier "localtime" UNCLOSED:= ${:U:localtime + + +# In a stack trace that has both evaluation details and included files, list +# the current file twice: Once in the first line and once in the call +# hierarchy. While this is redundant, omitting the current file from the +# call hierarchy is more confusing, as the '.include' line does not contain +# the faulty expression. +# +# expect: make: "varparse-errors.tmp" line 1: Unknown modifier ":Z" +# expect: while evaluating "${:Z}" with value "" +# expect: while evaluating variable "INDIRECT" with value "${:Z}" +# expect: while evaluating variable "VALUE" with value "${INDIRECT}" +# expect: in varparse-errors.tmp:1 +# expect: in varparse-errors.mk:126 +_!= echo '.info $${VALUE}' > varparse-errors.tmp +VALUE= ${INDIRECT} +INDIRECT= ${:Z} +# The "./" is necessary to skip the directory cache. +.include "./varparse-errors.tmp" +_!= rm -f varparse-errors.tmp