automake
[Top][All Lists]
Advanced

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

Re: Parallel build bug?


From: Ralf Wildenhues
Subject: Re: Parallel build bug?
Date: Thu, 28 Jan 2010 06:48:42 +0100
User-agent: Mutt/1.5.20 (2009-10-28)

Hello Joakim,

* Joakim Tjernlund wrote on Wed, Jan 27, 2010 at 03:05:26PM CET:
>  make -s -j6 all install
> ends up with a:
>  mv: cannot stat `.deps/libeq_mib_if_a-eq_mib_equipment.Tpo': No such file or 
> directory
>  make[1]: *** [libeq_mib_if_a-eq_mib_equipment.o] Error 1
>  make[1]: *** Waiting for unfinished jobs....
> appears to me that there is some
> dependency missing so that both targets is run in parallel.
> Is this expected behaviour or a bug?

This is a known but not well-documented bug/limitation in the makefiles
created by Automake: With parallel make, you cannot explicitly list
more than one of the recursive targets on the command line.

Note that there is a GNU make-specific way to avoid this bug, which is
used for example in the gnulib module gnumakefile, that one can
otherwise use in a toplevel build directory GNUmakefile like this:
set ALL_RECURSIVE_TARGETS to all of your own recursive targets,

  include Makefile
  ...

  # Tell version 3.79 and up of GNU make to not build goals in this
  # directory in parallel, in case someone tries to build multiple
  # targets, and one of them can cause a recursive target to be invoked.

  # Only set this if Automake doesn't provide it.
  AM_RECURSIVE_TARGETS ?= $(RECURSIVE_TARGETS:-recursive=) \
    $(RECURSIVE_CLEAN_TARGETS:-recursive=) \
    dist distcheck tags ctags

  ALL_RECURSIVE_TARGETS += $(AM_RECURSIVE_TARGETS)

  ifneq ($(word 2, $(MAKECMDGOALS)), )
  ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), )
  .NOTPARALLEL:
  endif
  endif


I don't know of an easy way to portably avoid the issue that does not
incur unnecessary work, and does not totally kill concurrency in the
toplevel; e.g., if automake added a dependency
  install: all

that would let `make install' walk each makefile twice, unnecessarily.
If we just put
  .NOTPARALLEL:

in the toplevel Makefile, then all toplevel work would happen
serialized.

Another GNU make-specific way to avoid it could be to use order-only
prerequisites.

Cheers,
Ralf




reply via email to

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