[Top][All Lists]

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

Re: Infinite loop bug with parallel make

From: Sebastian Pipping
Subject: Re: Infinite loop bug with parallel make
Date: Sat, 23 Feb 2013 00:24:11 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130113 Thunderbird/17.0.2

On 22.02.2013 03:31, Ian Lynagh wrote:
> Hi all,
> The attached Makefile causes an infinite loop with parallel make when
> using make 3.81 (on amd64/Linux):
>     $ make setup
>     touch B.hs A.hs
>     sleep 2
>     touch B.hi B.dyn_hi
>     sleep 2
>     touch B.o B.dyn_o
>     sleep 2
>     touch A.dyn_hi
>     sleep 2
>     touch A.o A.dyn_o
>     $ make so
>     true 1 B.hi B.o
>     false 1
>     make: *** [so] Error 1
>     $ make so -j2
>     true 1 B.hi B.o
>     [doesn't terminate]

I was able to reproduce that behavior GNU Make version 3.81-r2 found in
Gentoo Linux.

When I turn the last call into

  $ make so -j2 --debug

it keeps looping

  " File `so' does not exist."

> I can't reproduce it with 3.82, but I don't know for sure whether it's
> fixed or whether it's just luck that it doesn't get tickled.
> However, even if it is fixed in 3.82, that doesn't really help me right
> now as I would really like my build system to work with the make that
> people have installed, and 3.81 is still very common.

I cannot reproduce it with 3.82, either.

> Is anyone able to explain what causes the bug, so that I can try to
> alter the build system to avoid it, please?

My understanding is that the trouble comes from rules that

 * are not declared phony but still

 * do not update the timestamps of their targets .

A solution could be to

 a) Add a line

      .PHONY: so A.dyn_o A.hi Aa.o B.hi A.hs

    so that all deep dependencies of target "so" ..


   .. are marked phony or

 b) add lines

      <tab>touch $@

    to all pattern rules and a new rule to update A.o

      <tab>touch $@

    to make sure timestamps are updated as expected.

With either approach, the looping stops with 3.81-r2 for me.  I do not
mean to say that the unmodified Makefile GNU make should loop, I am not
sure about that.  However, the Makefile does have its part.

As a last resort (meaning if you cannot do changes like those mentioned
above to your Makefile for sonme reason), you could make the Makefile
require GNU make 3.82 or later:

  minimum_version := 3.82
  recent_enough := $(filter $(minimum_version),$(firstword \
      $(sort $(MAKE_VERSION) $(minimum_version))))

  ifeq ($(recent_enough),)
    $(error GNU Make $(minimum_version) or later is minimum_versioned)

That's an adapted version of an idea from

> Also, is there a way to tell make not to treat any file as intermediate?
> I think that it's possible that this would work around the problem.
> If that's not possible, then if I can make a list of all files that the
> build system might build then adding
>     list of all files : | exists
>     exists:
>         touch $@
> would do it, right?
> Although then, if the build system didn't actually find a rule for a
> file in the list, then the dependency on exists would make it think
> that it could build it; is there any way to avoid that?

I do not understand that part, sorry.  Please elaborate more.



reply via email to

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