Blob Blame Raw
diff -up Python-3.2a1/Makefile.pre.in.parallel-grammar Python-3.2a1/Makefile.pre.in
--- Python-3.2a1/Makefile.pre.in.parallel-grammar	2010-08-20 15:09:13.613527156 -0400
+++ Python-3.2a1/Makefile.pre.in	2010-08-20 15:10:31.428135355 -0400
@@ -222,6 +222,7 @@ IO_OBJS=	\
 
 ##########################################################################
 # Grammar
+GRAMMAR_STAMP=	$(srcdir)/grammar-stamp
 GRAMMAR_H=	$(srcdir)/Include/graminit.h
 GRAMMAR_C=	$(srcdir)/Python/graminit.c
 GRAMMAR_INPUT=	$(srcdir)/Grammar/Grammar
@@ -557,9 +558,24 @@ Modules/python.o: $(srcdir)/Modules/pyth
 
 $(IO_OBJS): $(IO_H)
 
-$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
+# GNU "make" interprets rules with two dependents as two copies of the rule.
+#
+# In a parallel build this can lead to pgen being run twice, once for each of
+# GRAMMAR_H and GRAMMAR_C, leading to race conditions in which the compiler
+# reads a partially-overwritten copy of one of these files, leading to syntax
+# errors (or linker errors if the fragment happens to be syntactically valid C)
+#
+# See http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html
+# for more information
+#
+# Introduce ".grammar-stamp" as a contrived single output from PGEN to avoid
+# this:
+$(GRAMMAR_H) $(GRAMMAR_C): $(GRAMMAR_STAMP)
+
+$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT)
 		-@$(INSTALL) -d Include
 		-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
+		touch $(GRAMMAR_STAMP)
 
 $(PGEN):	$(PGENOBJS)
 		$(CC) $(OPT) $(PY_LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN)