On Sun, May 28, 2023 at 04:44:37PM +0200, Omar Polo wrote:
> On 2023/05/28 13:16:34 +0200, Marc Espie <[email protected]> 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.