Module Name: src
Committed By: rillig
Date: Mon Nov 23 14:47:12 UTC 2020
Modified Files:
src/usr.bin/make: suff.c
src/usr.bin/make/unit-tests: suff-transform-endless.exp
suff-transform-endless.mk suff-transform-select.exp
suff-transform-select.mk
Log Message:
make(1): fix endless loop when resolving circular suffix rules
To generate a diff of this commit:
cvs rdiff -u -r1.305 -r1.306 src/usr.bin/make/suff.c
cvs rdiff -u -r1.2 -r1.3 \
src/usr.bin/make/unit-tests/suff-transform-endless.exp \
src/usr.bin/make/unit-tests/suff-transform-select.exp \
src/usr.bin/make/unit-tests/suff-transform-select.mk
cvs rdiff -u -r1.3 -r1.4 \
src/usr.bin/make/unit-tests/suff-transform-endless.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/suff.c
diff -u src/usr.bin/make/suff.c:1.305 src/usr.bin/make/suff.c:1.306
--- src/usr.bin/make/suff.c:1.305 Mon Nov 23 14:04:28 2020
+++ src/usr.bin/make/suff.c Mon Nov 23 14:47:12 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: suff.c,v 1.305 2020/11/23 14:04:28 rillig Exp $ */
+/* $NetBSD: suff.c,v 1.306 2020/11/23 14:47:12 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990, 1993
@@ -114,7 +114,7 @@
#include "dir.h"
/* "@(#)suff.c 8.4 (Berkeley) 3/21/94" */
-MAKE_RCSID("$NetBSD: suff.c,v 1.305 2020/11/23 14:04:28 rillig Exp $");
+MAKE_RCSID("$NetBSD: suff.c,v 1.306 2020/11/23 14:47:12 rillig Exp $");
#define SUFF_DEBUG0(text) DEBUG0(SUFF, text)
#define SUFF_DEBUG1(fmt, arg1) DEBUG1(SUFF, fmt, arg1)
@@ -1060,6 +1060,9 @@ RemoveCandidate(CandidateList *srcs)
static Candidate *
FindThem(CandidateList *srcs, CandidateSearcher *cs)
{
+ HashTable seen;
+
+ HashTable_Init(&seen);
while (!Lst_IsEmpty(srcs)) {
Candidate *src = Lst_Dequeue(srcs);
@@ -1074,6 +1077,8 @@ FindThem(CandidateList *srcs, CandidateS
* graph for it or the file actually exists.
*/
if (Targ_FindNode(src->file) != NULL) {
+ found:
+ HashTable_Done(&seen);
SUFF_DEBUG0("got it\n");
return src;
}
@@ -1082,17 +1087,28 @@ FindThem(CandidateList *srcs, CandidateS
char *file = Dir_FindFile(src->file, src->suff->searchPath);
if (file != NULL) {
free(file);
- SUFF_DEBUG0("got it\n");
- return src;
+ goto found;
}
}
SUFF_DEBUG0("not there\n");
- CandidateList_AddCandidatesFor(srcs, src);
+ {
+ Boolean isNew;
+
+ HashTable_CreateEntry(&seen, src->file, &isNew);
+ if (isNew)
+ CandidateList_AddCandidatesFor(srcs, src);
+ else {
+ DEBUG1(SUFF, "FindThem: skipping duplicate \"%s\"\n",
+ src->file);
+ }
+ }
+
CandidateSearcher_Add(cs, src);
}
+ HashTable_Done(&seen);
return NULL;
}
Index: src/usr.bin/make/unit-tests/suff-transform-endless.exp
diff -u src/usr.bin/make/unit-tests/suff-transform-endless.exp:1.2 src/usr.bin/make/unit-tests/suff-transform-endless.exp:1.3
--- src/usr.bin/make/unit-tests/suff-transform-endless.exp:1.2 Mon Nov 23 14:13:39 2020
+++ src/usr.bin/make/unit-tests/suff-transform-endless.exp Mon Nov 23 14:47:12 2020
@@ -17,7 +17,27 @@ inserting ".f" (4) at end of list
defining transformation from `.f' to `.e'
inserting ".f" (4) at end of list
inserting ".e" (3) at end of list
-make: "suff-transform-endless.mk" line 38: prevent endless loop
-
-make: stopped in unit-tests
-exit status 1
+transformation .e complete
+transformation .e.f complete
+transformation .f.e complete
+Wildcard expanding "all"...
+SuffFindDeps "all"
+ No known suffix on all. Using .NULL suffix
+adding suffix rules
+ trying all.e...not there
+ trying all.d...not there
+ trying all.f...not there
+ trying all.c...not there
+ trying all.e...not there
+FindThem: skipping duplicate "all.e"
+Wildcard expanding "issue6.f"...suffix is ".f"...
+SuffFindDeps "issue6.f"
+ trying issue6.e...not there
+ trying issue6.d...not there
+ trying issue6.f...got it
+ applying .f -> .e to "issue6.e"
+ applying .e -> .f to "issue6.f"
+suffix is ".e"...
+make: Graph cycles through issue6.f
+`all' not remade because of errors.
+exit status 0
Index: src/usr.bin/make/unit-tests/suff-transform-select.exp
diff -u src/usr.bin/make/unit-tests/suff-transform-select.exp:1.2 src/usr.bin/make/unit-tests/suff-transform-select.exp:1.3
--- src/usr.bin/make/unit-tests/suff-transform-select.exp:1.2 Mon Nov 23 14:13:39 2020
+++ src/usr.bin/make/unit-tests/suff-transform-select.exp Mon Nov 23 14:47:12 2020
@@ -21,7 +21,24 @@ inserting ".e" (3) at end of list
transformation .e complete
transformation .e.f complete
transformation .f.e complete
-make: "suff-transform-select.mk" line 30: prevent endless loop
-
-make: stopped in unit-tests
-exit status 1
+Wildcard expanding "all"...
+SuffFindDeps "all"
+ No known suffix on all. Using .NULL suffix
+adding suffix rules
+ trying all.e...not there
+ trying all.d...not there
+ trying all.f...not there
+ trying all.c...not there
+ trying all.e...not there
+FindThem: skipping duplicate "all.e"
+Wildcard expanding "issue10.e"...suffix is ".e"...
+SuffFindDeps "issue10.e"
+ trying issue10.d...got it
+suffix is ".d"...
+SuffFindDeps "issue10.d"
+ trying issue10.c...not there
+suffix is ".d"...
+: 'Making issue10.d out of nothing.'
+make: don't know how to make issue10.e (continuing)
+`all' not remade because of errors.
+exit status 0
Index: src/usr.bin/make/unit-tests/suff-transform-select.mk
diff -u src/usr.bin/make/unit-tests/suff-transform-select.mk:1.2 src/usr.bin/make/unit-tests/suff-transform-select.mk:1.3
--- src/usr.bin/make/unit-tests/suff-transform-select.mk:1.2 Mon Nov 23 14:13:39 2020
+++ src/usr.bin/make/unit-tests/suff-transform-select.mk Mon Nov 23 14:47:12 2020
@@ -1,4 +1,4 @@
-# $NetBSD: suff-transform-select.mk,v 1.2 2020/11/23 14:13:39 rillig Exp $
+# $NetBSD: suff-transform-select.mk,v 1.3 2020/11/23 14:47:12 rillig Exp $
#
# https://gnats.netbsd.org/49086, issue 10:
# Explicit dependencies affect transformation rule selection.
@@ -27,4 +27,5 @@ issue10.d issue10.f:
# XXX: see suff-bug-endless, which must be fixed first.
#.MAKEFLAGS: -dg1
-.error prevent endless loop
+
+# Before 24-11-2020, resolving all.e ran into an endless loop.
Index: src/usr.bin/make/unit-tests/suff-transform-endless.mk
diff -u src/usr.bin/make/unit-tests/suff-transform-endless.mk:1.3 src/usr.bin/make/unit-tests/suff-transform-endless.mk:1.4
--- src/usr.bin/make/unit-tests/suff-transform-endless.mk:1.3 Mon Nov 23 14:13:39 2020
+++ src/usr.bin/make/unit-tests/suff-transform-endless.mk Mon Nov 23 14:47:12 2020
@@ -1,4 +1,4 @@
-# $NetBSD: suff-transform-endless.mk,v 1.3 2020/11/23 14:13:39 rillig Exp $
+# $NetBSD: suff-transform-endless.mk,v 1.4 2020/11/23 14:47:12 rillig Exp $
# https://gnats.netbsd.org/49086, issue 6:
# Transformation search can end up in an infinite loop.
@@ -35,4 +35,5 @@ all: issue6.f
# XXX: Found 'all' as '(not found)'
# XXX: trying all.e, all.e, all.f, all.e, all.e, repeatedly.
#.MAKEFLAGS: -dg1
-.error prevent endless loop
+
+# Before 24-11-2020, resolving all.e ran into an endless loop.