help-make
[Top][All Lists]
Advanced

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

Re: best practice for serialization of dependencies of a target


From: Kaz Kylheku
Subject: Re: best practice for serialization of dependencies of a target
Date: Sun, 26 Jun 2022 11:32:53 -0700
User-agent: Roundcube Webmail/1.4.13

On 2022-06-25 18:20, Bruno Haible wrote:
> Hi,
> 
> When I have a Makefile rule
> 
> target: $(DEPS1) $(DEPS2)
>       command1
> 
> it is guaranteed that $(DEPS1) and $(DEPS2) will be done, including their
> dependencies, before command1 is started.
> However, with -j, $(DEPS1) and $(DEPS2) are being made in parallel. If this
> is not desired, I can transform this rule to
> 
> target: $(DEPS1)
>       test -z "$(DEPS2)" || $(MAKE) $(DEPS2)
>       command1

By the way, if parallelism is not desired, mention this special target
somewhere in the Makefile:

  .NOTPARALLEL:

Then -j is ignored.

> 
> or (equivalently?)
> 
> target: $(DEPS1)
>       $(MAKE) target2

Whether equivalent or not, resorting to a re-execution of make
is ugly. We'd like to avoid it.

> target2: $(DEPS2)
>       command1
> .PHONY: target2

If there is an order among the DEPS1 and DEPS2 dependencies,
you have to express it to Make!

Here is a small Makefile:

DEPS1 := d1a d1b d1c
DEPS2 := d2a d2b d2c

all: $(DEPS1) $(DEPS2)
        @echo making $@ from $(DEPS1) and $(DEPS2)

%:
        @echo making $@

# Uncomment!
# $(DEPS1): $(DEPS2)


If you run it with "make -j", you can see perturbation of the
order of the "making d1a" messages. Often, targets from the
DEPS1 group are made before some from the DEPS2.

But if you uncomment the indicated line, that is prevented.
Now when you run "make -j", the order is perturbed within
the two groups, but DEPS2 are all done before DEPS1.

Cheers ....



reply via email to

[Prev in Thread] Current Thread [Next in Thread]