Description: generated code multiple outputs
 Fix one point of parallel building breakage.
Author: Obey Arthur Liu <arthur@milliways.fr>
Last-Update: 2009-12-28
--- a/libsrc/plugin/Makefile.am
+++ b/libsrc/plugin/Makefile.am
@@ -93,15 +93,45 @@
 	export_gate_virtuoso.c import_gate_virtuoso.c import_gate_virtuoso.h \
 	export_plugin_lang25.c import_plugin_lang25.c import_plugin_lang25.h
 
-$(generated_code): .generated
+# This is still wrong:
+# <http://www.gnu.org/software/hello/manual/automake/Multiple-Outputs.html>
+#$(generated_code): .generated
+#
+#.generated: Makefile.am gen_all_gates.sh gen_gate.sh gate_virtuoso.h plugin_lang25.h plugin_msdtc.h
+#	cd $(top_srcdir)/libsrc/plugin; ./gen_all_gates.sh
+#	-rm -rf tmp
+#	touch .generated
+
+# This is correct:
+generated_code-stamp: Makefile gen_all_gates.sh gen_gate.sh gate_virtuoso.h plugin_lang25.h plugin_msdtc.h
+	echo "GENCODE=+= stamp"
+	@rm -f generated_code-temp
+	@touch generated_code-temp
+	@cd $(top_srcdir)/libsrc/plugin; ./gen_all_gates.sh
+	@rm -rf tmp
+	@mv -f generated_code-temp $@
 
-.generated: Makefile.am gen_all_gates.sh gen_gate.sh gate_virtuoso.h plugin_lang25.h plugin_msdtc.h
-	cd $(top_srcdir)/libsrc/plugin; ./gen_all_gates.sh
-	-rm -rf tmp
-	touch .generated
+$(generated_code): generated_code-stamp
+	## Recover from the removal of $@
+	@if test -f $@; then :; else \
+		trap 'rm -rf generated_code-lock generated_code-stamp' 1 2 13 15; \
+		if mkdir generated_code-lock 2>/dev/null; then \
+	## This code is being executed by the first process.
+	rm -f generated_code-stamp; \
+		echo "GENCODE=+= stamp"; \
+		$(MAKE) $(AM_MAKEFLAGS) generated_code-stamp; \
+		rmdir generated_code-lock; \
+		else \
+	## This code is being executed by the follower processes.
+	## Wait until the first process is done.
+		while test -d generated_code-lock; do sleep 1; echo "//+//"; done; \
+	## Succeed if and only if the first process succeeded.
+		test -f generated_code-stamp; exit $$?; \
+		fi; \
+	fi
 
 BUILT_SOURCES	= $(generated_code)
-DISTCLEANFILES	= $(generated_code) .generated
+DISTCLEANFILES	= $(generated_code) generated_code-stamp generated_code-lock generated_code-temp
 
 
 # ----------------------------------------------------------------------
