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