tech-toolchain archive

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

Re: question

On Tue, Jun 07, 2011 at 04:48:57PM +0000, David Holland wrote:
> The problem is that historically this syntax has been used to
> explicitly mean both things. To make both work correctly, the syntax
> needs to be extended.
> My vote would be to make this form mean "a AND b" and establish some
> different form for the "a OR b" mode, for several reasons.
> Note first that the typical usage of the AND form is stuff like
>    foo.h foo.c: foo.y
>            yacc -d foo.y
> whereas the typical usage of the OR form is stuff like
>    $(OBJS): $(.TARGET:.o=.c)
>            gcc -c $<

    $(OBJS): $(HDRS) $${@:.o=.c}
             cc -o $@ ${@:.o=.c}
(Although I did have to fix SVR4 make to not error suffix translations on 
dependencies - it didn't like the second ':'!)
> The first kind of rule is fully portable to (and from) traditional
> make, whereas the latter is frequently not -- in traditional make you
> can write rules like this as long as they use only $@ in the recipe,
> such as "$(DIRS):; mkdir $@", but to the best of my knowledge
> computing the RHS of the dependency based on the LHS has only ever
> worked in BSD make. That's reason #1.
> Reason #2: most rules of the second form can at essentially zero cost
> be rewritten as
>    .for O in $(OBJS)
>    $(O): $(O:.o=.c)
>            gcc -c $(O:.o=.c)
>    .endfor
> whereas there is no simple rewrite for the AND form. So there may not
> even be any real need for a new syntax, and even if there is, many
> cases can be rewritten to maximize compatibility by not using it.
> Reason #3, and perhaps most important: if the traditional syntax gets
> the AND interpretation, usages that intended the OR form will fail up
> front: things won't be created and builds will fail more or less
> promptly and deterministically. However, the other way around (as
> we're seeing right now) you get difficult to diagnose race conditions
> that once in a long while cause bizarre behavior.

I believe that the 'traditional' syntax is the OR one, ie (as in netbsd's
make and gmake):
    foo bar: dependencies
is shorthand for:
    foo: dependencies
    bar: dependencies

The fact that the command only get run once when they generate both files
is a side effect of the internal workings.

In any case what you call the 'OR' behaviour is much more common.

The 'yacc' problem can (sort of) be solved by:

foo.h:  foo.y
        # generate foo.h and foo.yac.c

foo.c: foo.h
        cp foo.yac.c $@

Which works unless some heathen deletes foo.yac.c but leaves foo.h


David Laight:

Home | Main Index | Thread Index | Old Index