On Mon, 2018-12-03 at 13:36 +0100, Marcin Kasperski wrote:
> > > I tried using the following snippet:
> > > 
> > >     OUTPUT/something :
> > >           mkdir -p OUTPUT
> > >           $(file > $@, something)
> > > (…)
> > 
> > That's the defined behaviour.
> > All variables are evaluated and all functions called before any
> > commands are run.
> > It's the result of that evaluation that is the text of the commands
> > to be run, after all.
> 
> 1. The fact that second line is evaluated, and has it's functions
> called before first line is run, is not that obvious.
> 2. The behaviour of this very example is extremely confusing.
> 3. … and it makes $(file) almost useless in recipes (it can't be used
> to append something to file generated by command, it can't be used to
> read file generated by command, it can't be coordinated with anything
> done by recipe in general)
> 
> Abstractly speaking: $(file) is syntactically similar to make
> functions, but in fact it has absolutely different behaviour (other
> make functions are mostly idempotent and functional, $(file) is all
> about side effects). So handling it in the same way is not
> necessarily
> good idea. In particular $(file >) doesn't calculate and return
> anything, it's not the function and will never be.

This is incorrect.  file is treated exactly like every other function. 
It does expand: it expands to the empty string.  It is certainly not
the only function which is all about side-effects.  There are other
functions that work the same way: eval, info, and the conditionals
(sometimes).  shell is all about side-effects.  Etc.

Having file behave differently than all the other expansions would be
confusing and isn't justified IMO.

See my response in Savannah for ways to deal with file expansion rules.


_______________________________________________
Bug-make mailing list
Bug-make@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-make

Reply via email to