bug-make
[Top][All Lists]
Advanced

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

Re: Problem with parallel build


From: Eli Zaretskii
Subject: Re: Problem with parallel build
Date: Thu, 21 Oct 2010 23:57:36 +0200

> Date: Thu, 21 Oct 2010 15:04:20 -0400
> From: Mike Shal <address@hidden>
> Cc: address@hidden
> 
> I don't see why Michael's example should fail, but I can reproduce the
> behavior with 3.81 and 3.82.

It fails because, depending on the timing, app1.o may or may not exist
when Make comes to check it.  Here's the relevant portion of "make -d"
output:

  - Considering target file `app1.o'.
  - Still updating file `app1.o'.
    Finished prerequisites of target file `app1'.
   The prerequisites of `app1' are being made.
  -Live child 0x652d40 (lib.a) PID 1894
  -Live child 0x651590 (app1.o) PID 1893
  -Reaping winning child 0x652d40 PID 1894
  -Removing child 0x652d40 PID 1894 from chain.
  -Released token for child 0x652d40 (lib.a).
  -Live child 0x651590 (app1.o) PID 1893
  +Live child 0x652d60 (lib.a) PID 1948
  +Reaping winning child 0x652d60 PID 1948
  +Removing child 0x652d60 PID 1948 from chain.
   Considering target file `app1'.
      Considering target file `app1.c'.
      File `app1.c' was considered already.
     Considering target file `lib.a'.
     File `lib.a' was considered already.
  - Considering target file `app1.o'.
  - Still updating file `app1.o'.
  - Finished prerequisites of target file `app1'.
  -The prerequisites of `app1' are being made.
  -Live child 0x651590 (app1.o) PID 1893
  -Reaping winning child 0x651590 PID 1893
  -Removing child 0x651590 PID 1893 from chain.
  -Considering target file `app1'.
  -  Considering target file `lib.a'.
  -  File `lib.a' was considered already.
  - Considering target file `app1.o'.
  - File `app1.o' was considered already.
  + Pruning file `app1.o'.
    Finished prerequisites of target file `app1'.
  - Prerequisite `app1.o' is newer than target `app1'.      <<<<<<<<<<<<
  + Prerequisite `app1.o' of target `app1' does not exist.  <<<<<<<<<<<<

I think Make doesn't really use the rule that was supposed to be used
to rebuild app1.  It uses some builtin rule instead.  To see that, try
"make -j2 -r", and you will see this (remember: app1.o does not exist
at this point):

  Updating goal targets....
  Considering target file `app1'.
   Looking for an implicit rule for `app1'.
   Trying pattern rule with stem `1'.
   Trying implicit prerequisite `app1.o'.
   Trying pattern rule with stem `1'.
   Trying implicit prerequisite `app1.o'.
   Looking for a rule with intermediate file `app1.o'.
    Avoiding implicit rule recursion.
    Trying pattern rule with stem `app1'.
    Trying implicit prerequisite `src/app1.c'.
    Trying pattern rule with stem `app1'.
    Trying implicit prerequisite `src/app1.c'.
    Looking for a rule with intermediate file `src/app1.c'.
     Avoiding implicit rule recursion.
     Avoiding implicit rule recursion.
   No implicit rule found for `app1'.            <<<<<<<<<<<<<<<
   Finished prerequisites of target file `app1'.
  No need to remake target `app1'.               <<<<<<<<<<<<<<<
  make: Nothing to be done for `app1'.

As you see, either it doesn't realize that app1 depends on lib.a, or
that lib.a depends on lib.h via a.o and b.o.



reply via email to

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