Turns out that, due to the search rules we use, make
is mostly silent in case it couldn't read a Makefile
The following patch lets it track the makefilenames that
do exist, but that it wasn't able to open, so that
a post-mortem can include these.
Not sure if other use-cases could also use the post-mortem
The tweak to ReadMakefiles is to avoid pushing the same
path name twice.
Using Lst_Pop ensures this diagnostic only ever occurs once,
in case we find other places we might want to stick this.
(and realizing that, I should probably add comments in both
places instead of explaining this through email)
Index: engine.c
===================================================================
RCS file: /cvs/src/usr.bin/make/engine.c,v
retrieving revision 1.70
diff -u -p -r1.70 engine.c
--- engine.c 25 Oct 2021 19:54:29 -0000 1.70
+++ engine.c 28 May 2023 11:12:48 -0000
@@ -84,6 +84,7 @@
#include "extern.h"
#include "lst.h"
#include "timestamp.h"
+#include "main.h"
#include "make.h"
#include "pathnames.h"
#include "error.h"
@@ -210,6 +211,7 @@ node_failure(GNode *gn)
fflush(stdout);
else {
print_errors();
+ dump_unreadable();
Punt(NULL);
}
}
Index: main.c
===================================================================
RCS file: /cvs/src/usr.bin/make/main.c,v
retrieving revision 1.129
diff -u -p -r1.129 main.c
--- main.c 17 Jan 2023 13:03:22 -0000 1.129
+++ main.c 28 May 2023 11:12:48 -0000
@@ -87,6 +87,8 @@ bool ignoreErrors; /* -i flag */
bool beSilent; /* -s flag */
bool dumpData; /* -p flag */
+static LIST unreadable;
+
struct dirs {
char *current;
char *object;
@@ -826,6 +828,40 @@ main(int argc, char **argv)
return 0;
}
+void
+dump_unreadable(void)
+{
+ char *fname;
+
+ if (Lst_IsEmpty(&unreadable))
+ return;
+
+ fprintf(stderr, "Makefile(s) that couldn't be read: ");
+
+ while ((fname = Lst_Pop(&unreadable))) {
+ fprintf(stderr, "%s ", fname);
+ free(fname);
+ }
+ fprintf(stderr, "\n");
+}
+
+static FILE *
+open_makefile(const char *fname)
+{
+ FILE *stream;
+ struct stat buffer;
+
+ stream = fopen(fname, "r");
+ if (stream != NULL)
+ return stream;
+
+ if (stat(fname, &buffer) == 0) {
+ Lst_AtEnd(&unreadable, strdup(fname));
+ }
+
+ return NULL;
+}
+
/*-
* ReadMakefile --
* Open and parse the given makefile.
@@ -848,14 +884,14 @@ ReadMakefile(void *p, void *q)
Var_Set("MAKEFILE", "");
Parse_File(estrdup("(stdin)"), stdin);
} else {
- if ((stream = fopen(fname, "r")) != NULL)
+ if ((stream = open_makefile(fname)) != NULL)
goto found;
/* if we've chdir'd, rebuild the path name */
if (d->current != d->object && *fname != '/') {
char *path;
path = Str_concat(d->current, fname, '/');
- if ((stream = fopen(path, "r")) == NULL)
+ if ((stream = open_makefile(path)) == NULL)
free(path);
else {
fname = path;
@@ -866,7 +902,11 @@ ReadMakefile(void *p, void *q)
name = Dir_FindFile(fname, userIncludePath);
if (!name)
name = Dir_FindFile(fname, systemIncludePath);
- if (!name || !(stream = fopen(name, "r")))
+ if (!name)
+ return false;
+ if (strcmp(name, fname) == 0)
+ return false;
+ if ((stream = open_makefile(name)) == NULL)
return false;
fname = name;
/*
Index: main.h
===================================================================
RCS file: /cvs/src/usr.bin/make/main.h,v
retrieving revision 1.6
diff -u -p -r1.6 main.h
--- main.h 13 Jan 2020 14:51:50 -0000 1.6
+++ main.h 28 May 2023 11:12:48 -0000
@@ -41,4 +41,8 @@ extern Lst create;
/* set_notparallel(): used to influence running mode from parse.c */
extern void set_notparallel(void);
+/* dump_unreadable: in case of some errors, dump makefile names
+ * we found but are unable to read.
+ */
+extern void dump_unreadable(void);
#endif