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
-
-.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 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_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
# ----------------------------------------------------------------------