[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-4.7] docs/build: Work around apparent bug with multi-target rules

On 25/04/16 14:35, Ian Jackson wrote:
> Andrew Cooper writes ("[PATCH for-4.7] docs/build: Work around apparent bug 
> with multi-target rules"):
>> The `make` manual documents that a rule of the form
>>   target1 target2: prereq
>>      recipe
>> is equivilent to
>>   target1: prereq
>>      recipe
>>   target2: prereq
>>      recipe
>> This is correct if only target1 or target2 is wanted, but is not the
>> case if both target1 and target2 are wanted to be rebuilt in the
>> same pass.  In such a case, executing the recipe to generate target1
>> causes the entire rule to be considered complete, short circuiting
>> the search to regenerate target2.
> This is not a bug in make.  From the manual I have here (wheezy):
>      Suppose you would like to vary the prerequisites according to the
>    target, much as the variable `$@' allows you to vary the commands.
>    You cannot do this with multiple targets in an ordinary rule, but
>    you can do it with a "static pattern rule".  *Note Static Pattern
>    Rules: Static Pattern.

But we don't want to vary the prerequisite with the target.  We want the
single (Patterned) prerequisite to cause a regeneration of each three of
the (Patterned) targets using the same recipe, as the $@ and $< are
sufficiently expressive for our needs.

i.e. I only chose to do it like that originally to avoid copy&pasting
the recipe.

> and (from `Pattern Intro'):
>      Pattern rules may have more than one target.  Unlike normal
>    rules, this does not act as many different rules with the same
>    prerequisites and commands.  If a pattern rule has multiple
>    targets, `make' knows that the rule's commands are responsible for
>    making all of the targets.  The commands are executed only once to
>    make all the targets.

This is the bit of documentation that I missed.  IMO, this is at least a
documentation bug, and that the multi-target documentation should
warning that multi-target pattern rules behave differently.

`make' knows, does it...  How can that possibly be the sensible choice? 
There is no automatic variable which encompasses multiple targets, and
using $* still requires you to hand-code the non-stem parts of the
targets.  This smells like a bug which was documented around.

> So this is a bug in the Makefile.  Your patch looks like a right
> approach to me.  A static pattern rule would be the other option.

However, a static pattern rule wouldn't avoid the repetition of the recipe.

> Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>

Thanks.  I will see about adjusting the commit message, but the patch
itself doesn't need to change.


Xen-devel mailing list



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.