summaryrefslogtreecommitdiff
path: root/Build/source/texk/web2c/web2c-sh.in
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
committerKarl Berry <karl@freefriends.org>2021-02-25 19:22:25 +0000
commitad547a6b5986815fda458221149728d9d9ab1d87 (patch)
tree16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/web2c/web2c-sh.in
parent947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff)
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/web2c-sh.in')
-rw-r--r--Build/source/texk/web2c/web2c-sh.in67
1 files changed, 67 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/web2c-sh.in b/Build/source/texk/web2c/web2c-sh.in
new file mode 100644
index 00000000000..beab55e08a2
--- /dev/null
+++ b/Build/source/texk/web2c/web2c-sh.in
@@ -0,0 +1,67 @@
+#! @SHELL@
+# web2c-sh: shell script to invoke ${srcdir}/web2c/convert.
+#
+# Copyright (C) 2009-2014 Peter Breitenlohner <tex-live@tug.org>
+#
+# This file is free software; the copyright holder
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+#
+# Convert creates several files, e.g., FOO.c and FOO.h from FOO.p.
+# The naive rule
+# FOO.c FOO.h: FOO.p $(web2c_depend)
+# srcdir=$(srcdir) $(SHELL) $(srcdir)/web2c/convert FOO
+# could run 'convert FOO' twice in parallel and fail. To avoid this
+# and yet recover from removal of FOO.c and/or FOO.h, we use an auxiliary
+# stamp file FOO-web2c and the two rules
+# FOO.c FOO.h: FOO-web2c
+# $(SHELL) ./web2c-sh $@ FOO
+# FOO-web2c: FOO.p $(web2c_depend)
+# $(SHELL) ./web2c-sh $@ FOO
+# Compare Automake manual (info Automake) 27.9: Multiple Outputs
+#
+srcdir=@srcdir@; export srcdir
+target=$1
+base=$2
+
+do_convert () {
+ echo timestamp >$stamp.tmp
+ if $AM_V_P; then
+ echo "@SHELL@ $srcdir/web2c/convert $base"
+ @SHELL@ $srcdir/web2c/convert $base || exit 1
+ else
+ echo " WEB2C " $base
+ @SHELL@ $srcdir/web2c/convert $base >$base.out 2>&1; rc=$?
+ test $rc -eq 0 || { cat $base.out; exit $rc; }
+ rm -f $base.out
+ fi
+ mv -f $stamp.tmp $stamp
+}
+
+stamp=$base-web2c
+case $target in
+ $stamp)
+ # Normal build.
+ rm -f $stamp.tmp
+ do_convert
+ ;;
+ *)
+ # Recover from removal of $target
+ test -f $target && exit 0
+ trap "rm -rf $stamp $stamp.lock" 1 2 13 15
+ if mkdir $stamp.lock 2>/dev/null; then
+ # Code executed by the first process.
+ rm -f $stamp $stamp.tmp
+ do_convert
+ rmdir $stamp.lock
+ else
+ # Code executed by the follower processes.
+ # Wait until the first process is done.
+ while test -d $stamp.lock; do sleep 1; done
+ # Succeed if and only if the first process succeeded.
+ test -f $stamp; exit $?
+ fi
+ ;;
+esac
+
+exit 0