On Sat, 2022-05-21 at 19:06 +0200, Alejandro Colomar wrote:
> By "once all children are complete" you are implying the "existence"
> of the children (which make(1) doesn't really check, but one can
> think of it as if it did).

Perhaps that's the confusion.  Make doesn't care about files at all per
se: it treats the filesystem as a key/value store where the key is the
pathname and the value is the mod time.  It will look up each target in
that store (filesystem) and if it doesn't exist it gets a special
"oldest" timestamp so that the recipe is run.  After the recipe is run
make gives the node a special "newest" timestamp so targets that list
it as a prerequisite are out of date.  It's not an error (to make) if
the key (pathname) still doesn't exist after the recipe runs.

Make really only cares about its internal graph.  The filesystem is
just a place to keep target state in between invocations of make (and
of course, a way for other tools to let make know that something
changed), since make doesn't have its own database.

Having make complain for any non-phony target that didn't actually
create its target would violate POSIX, and probably cause hundreds of
thousands of makefiles out there to throw complaints where people
forgot or didn't want to bother with using .PHONY (not all makefiles
were written for GNU make, and .PHONY is a GNU make feature).

Reply via email to