How come it only reran the rule once the second time?
All three targets were invalid.


On Fri, Apr 12, 2013 at 6:41 AM, Reinier Post <reinp...@win.tue.nl> wrote:

> On Thu Apr 11 12:47:56 2013, psm...@gnu.org (Paul Smith) wrote:
> > On Thu, 2013-04-11 at 12:14 +0200, Reinier Post wrote:
> > > > It's just a shorthand for writing a lot of identical rules; it does
> NOT
> > > > mean that a single invocation if the rule will generate all three
> > > > targets, which is what you are expecting.
> > >
> > > Incidentally: other workflow/inference languages can express this
> > > distinction perfectly and still allow the resulting specifications to
> > > be analyzed for proper termination (e.g. safe Petri nets, Datalog);
> > > I'd love to know of an alternative to make that is based on such a
> > > language, but it seems too much to ask for make to be extended
> > > in this way.
> >
> > I'm not sure exactly what you mean by "this distinction", but GNU make
> > already supports multi-target generators with pattern rules, as
> > mentioned in the part of the email you clipped.  So the basic
> > infrastructure exists.  There were proof-of-concept patches floating
> > around to support it for explicit rules as well.
>
> Hmm, indeed:
>
> | /tmp % cat Makefile
> | %.1:; echo $*.1 for $@ > $@
> | %.e.1 %.f.1:; echo $*.1 for $@ > $@
> | %.c.1 %.d.1:; for f in $*.c.1 $*.d.1; do echo $$f for $@ > $$f; done
> | %.ab.2: %.a.1 %.b.1; cat $+ > $@
> | %.cd.2: %.c.1 %.d.1; cat $+ > $@
> | %.ef.2: %.e.1 %.f.1; cat $+ > $@
> | /tmp % make -rR stage.ab.2 stage.cd.2 stage.ef.2
> | echo stage.a.1 for stage.a.1 > stage.a.1
> | echo stage.b.1 for stage.b.1 > stage.b.1
> | cat stage.a.1 stage.b.1 > stage.ab.2
> | for f in stage.c.1 stage.d.1; do echo $f for stage.d.1 > $f; done
> | cat stage.c.1 stage.d.1 > stage.cd.2
> | echo stage.1 for stage.f.1 > stage.f.1
> | cat stage.e.1 stage.f.1 > stage.ef.2
> | cat: stage.e.1: No such file or directory
> | make: *** [stage.ef.2] Error 1
> | rm stage.a.1 stage.b.1 stage.c.1
> | /tmp %
>
> I didn't realise make would skip the creation of stage.e.1;
> yet this is documented very clearly:
>
>   http://www.gnu.org/software/make/manual/html_node/Pattern-Intro.html
>
> I thought this was just describing an optimization;
> I didn't realize it would actually affect the build process.
>
> Why does it work this way?  What is a possible use case?
> I use symbolic intermediate targets a lot, but my targets
> in pattern rules are always real files.
> Or is it just intended as an optimization to avoid a stat() call?
>
> (I tried cvs annotate to find this out,
>  but this documentation text is in r1.1 already.)
>
> In any case, it may be useful to also be able to state that
> a multi-target pattern rule only makes its actual target.
>
> With :: we can already have alternative rules for the same targets.
> Considering these features together, the rule selection and execution
> mechanism becomes difficult to understand; a formal model might help.
>
> > Really the trickiest part is the user interface (makefile syntax): it
> > must be backward-compatible with existing makefiles, or at least be sure
> > to break virtually none of them.
>
> --
> Reinier Post
>
> _______________________________________________
> Bug-make mailing list
> Bug-make@gnu.org
> https://lists.gnu.org/mailman/listinfo/bug-make
>
_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to