[Mesa-dev] [PATCH] Mesa: Fix a race in the build

Dan Nicholson dbn.lists at gmail.com
Wed Jun 13 05:13:41 PDT 2012


On Tue, Jun 12, 2012 at 3:52 PM, Mike Frysinger <vapier at chromium.org> wrote:
> On Tue, Jun 12, 2012 at 6:47 PM, Dan Nicholson <dbn.lists at gmail.com> wrote:
>>
>> On 6/12/12, Stéphane Marchesin <marcheu at chromium.org> wrote:
>> > From: Mike Frysinger <vapier at chromium.org>
>> >
>> > The intent of the message above it is right (we need to build those
>> > dependencies in that order) but the implementation is wrong, as it
>> > can be executed in any order. To enforce the order, invoke make
>> > multiple times.
>> > ---
>> >  src/mesa/Makefile |    8 ++++++--
>> >  1 files changed, 6 insertions(+), 2 deletions(-)
>> >
>> > diff --git a/src/mesa/Makefile b/src/mesa/Makefile
>> > index b0b461f..c436890 100644
>> > --- a/src/mesa/Makefile
>> > +++ b/src/mesa/Makefile
>> > @@ -33,8 +33,12 @@ MESA_CXXFLAGS := $(LLVM_CFLAGS) $(CXXFLAGS)
>> >       $(CC) -c -o $@ $< $(MESA_CPPFLAGS) $(MESA_CFLAGS)
>> >
>> >  # Default: build dependencies, then asm_subdirs, GLSL built-in lib,
>> > -# then convenience libs (.a) and finally the device drivers:
>> > -default: $(DEPENDS) asm_subdirs $(MESA_LIBS) driver_subdirs
>> > +# then convenience libs (.a) and finally the device drivers.
>> > +# To ensure ordering, we have to invoke make each time:
>> > +default: $(DEPENDS)
>> > +     $(MAKE) asm_subdirs
>> > +     $(MAKE) $(MESA_LIBS)
>> > +     $(MAKE) driver_subdirs
>> >
>> >  .PHONY: main/git_sha1.h.tmp
>> >  main/git_sha1.h.tmp:
>>
>> The alternative that's more correct is to encode the dependencies in
>> the right locations. I.e., make $(DEPENDS) a prereq for asm_subdirs,
>> asm_subdirs as prereq for $(MESA_LIBS), etc. That enforces the order
>> in the correct place and allows you to do something like "make
>> driver_dirs" and have it work correctly. Some of that is already
>> there, and it would be useful to know which part is racing. I suppose
>> if no one is going to do that work, though...
>
>
> the trouble is that w/out GNU make, you can't declare a dependency as
> order-only.  so by having $(MESA_LIBS) depend on asm_subdirs (which is a
> PHONY target), things end up getting regenerated all the time.

Right, PHONY asm_subdirs does break that. Looking back into this now,
I'm surprised it's broken. This did work for a long time. The reason
is because MESA_LIBS will not be built until asm_subdirs is completed.
This is because MESA_OBJECTS and MESA_GALLIUM_OBJECTS contain
MESA_ASM_FILES, which are what's produced by descending through
asm_subdirs. So, make will have to wait for asm_subdirs to complete
before it can try to link libmesa.a or libgallium.a. I suspect what's
broken this now is prefixing all the sources in sources.mak with
$(SRCDIR). At least, I'd really like to see an actual error.

FWIW, mesa does require GNU make in many other parts of the build. And
if it get's changed to anything it will be automake where you could
handle these issues in a reasonable way with automake conditionals or
libtool convenience libraries. If things can't be made to work as I've
suggested above, though, your serialization patch makes sense.

--
Dan


More information about the mesa-dev mailing list