On Sun, May 28, 2023 at 04:44:37PM +0200, Omar Polo wrote: > On 2023/05/28 13:16:34 +0200, Marc Espie <marc.espie.open...@gmail.com> wrote: > > 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) > > It would indeed be nice to have a "post-mortem" message with the > Makefiles that couldn't be opened. it would have saved me some > headaches in the past with ports that have too tight permissions. > > Diff below reads fine to me, just one question inline, but it doesn't > seem to catch all the situations, consider: > > % mkdir /tmp/foo && cd /tmp/foo > /tmp/foo > % touch Makefile > % chmod 000 Makefile > % make > make: no target to make. > % make all > make: don't know how to make all > Stop in /tmp/foo > Makefile(s) that couldn't be read: Makefile > > a bare `make' don't print the nice error message, trying with a target > instead does.
Like I said, yeah, there are more error cases that warrant errors. We got to be careful, because make has got some default behavior built-in, so we should only print things if stuff gets erroring out. > > 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 > > [...] > > +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)); > > + } > > Why the stat? Can't we just check errno for EACCES instead? EACCES > is also returned when search permission is denied for a component of > the path prefix, which would be a difference but maybe a nice one? You're right, checking errno makes more sense and would catch more cases. Actually, the only errno that's "normal" in our case is ENOENT. Anything else is suspicious.