| --- misc/Python-2.6.1/Makefile.pre.in.fix-parallel-make 2010-07-22 15:01:39.567996932 -0400 |
| +++ misc/build/Python-2.6.1/Makefile.pre.in 2010-07-22 15:47:02.437998509 -0400 |
| @@ -207,6 +207,7 @@ SIGNAL_OBJS= @SIGNAL_OBJS@ |
| |
| ########################################################################## |
| # Grammar |
| +GRAMMAR_STAMP= $(srcdir)/grammar-stamp |
| GRAMMAR_H= $(srcdir)/Include/graminit.h |
| GRAMMAR_C= $(srcdir)/Python/graminit.c |
| GRAMMAR_INPUT= $(srcdir)/Grammar/Grammar |
| @@ -530,10 +531,24 @@ Modules/getpath.o: $(srcdir)/Modules/get |
| Modules/python.o: $(srcdir)/Modules/python.c |
| $(MAINCC) -c $(PY_CFLAGS) -o $@ $(srcdir)/Modules/python.c |
| |
| +# 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_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT) |
| +$(GRAMMAR_STAMP): $(PGEN) $(GRAMMAR_INPUT) |
| -@$(INSTALL) -d Include |
| -$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C) |
| + touch $(GRAMMAR_STAMP) |
| |
| $(PGEN): $(PGENOBJS) |
| $(CC) $(OPT) $(LDFLAGS) $(PGENOBJS) $(LIBS) -o $(PGEN) |