comparison vext @ 122:9efd2d15cd58 vext

Switch to Vext, move repos to a REPOS subdir (entirely managed by Vext)
author Chris Cannam
date Fri, 29 Sep 2017 09:21:06 +0100
parents
children fc093b176444
comparison
equal deleted inserted replaced
121:08f7d7cdf1df 122:9efd2d15cd58
1 #!/bin/bash
2
3 # Disable shellcheck warnings for useless-use-of-cat. UUOC is good
4 # practice, not bad: clearer, safer, less error-prone.
5 # shellcheck disable=SC2002
6
7 sml="$VEXT_SML"
8
9 set -eu
10
11 mydir=$(dirname "$0")
12 program="$mydir/vext.sml"
13
14 hasher=
15 local_install=
16 if [ -w "$mydir" ]; then
17 if echo | sha256sum >/dev/null 2>&1 ; then
18 hasher=sha256sum
19 local_install=true
20 elif echo | shasum >/dev/null 2>&1 ; then
21 hasher=shasum
22 local_install=true
23 else
24 echo "WARNING: sha256sum or shasum program not found" 1>&2
25 fi
26 fi
27
28 if [ -n "$local_install" ]; then
29 hash=$(echo "$sml" | cat "$program" - | $hasher | cut -c1-16)
30 gen_sml=$mydir/.vext-$hash.sml
31 gen_out=$mydir/.vext-$hash.bin
32 trap 'rm -f $gen_sml' 0
33 else
34 gen_sml=$(mktemp /tmp/vext-XXXXXXXX.sml)
35 gen_out=$(mktemp /tmp/vext-XXXXXXXX.bin)
36 trap 'rm -f $gen_sml $gen_out' 0
37 fi
38
39 if [ -x "$gen_out" ]; then
40 exec "$gen_out" "$@"
41 fi
42
43 # We need one of Poly/ML, SML/NJ, or MLton. Since we're running a
44 # single-file SML program as if it were a script, our order of
45 # preference is based on startup speed, except in the local_install
46 # case where we retain a persistent binary.
47
48 if [ -z "$sml" ]; then
49 if [ -n "$local_install" ] && mlton 2>&1 | grep -q 'MLton'; then
50 sml="mlton"
51 elif sml -h 2>&1 | grep -q 'Standard ML of New Jersey'; then
52 sml="smlnj"
53 # We would prefer Poly/ML to SML/NJ, except that Poly v5.7 has a
54 # nasty bug that occasionally causes it to deadlock on startup.
55 # That appears to be fixed in their repo, so we could promote it
56 # up the order again at some point in future
57 elif echo | poly -v 2>/dev/null | grep -q 'Poly/ML'; then
58 sml="poly"
59 elif mlton 2>&1 | grep -q 'MLton'; then
60 sml="mlton"
61 else cat 1>&2 <<EOF
62
63 ERROR: No supported SML compiler or interpreter found
64 EOF
65 cat 1>&2 <<EOF
66
67 The Vext external source code manager needs a Standard ML (SML)
68 compiler or interpreter to run.
69
70 Please ensure you have one of the following SML implementations
71 installed and present in your PATH, and try again.
72
73 1. Standard ML of New Jersey
74 - often found in a distribution package called: smlnj
75 - executable name: sml
76
77 2. Poly/ML
78 - often found in a distribution package called: polyml
79 - executable name: poly
80
81 3. MLton
82 - often found in a distribution package called: mlton
83 - executable name: mlton
84
85 EOF
86 exit 2
87 fi
88 fi
89
90 arglist=""
91 for arg in "$@"; do
92 if [ -n "$arglist" ]; then arglist="$arglist,"; fi
93 if echo "$arg" | grep -q '[^a-z]' ; then
94 arglist="$arglist\"usage\""
95 else
96 arglist="$arglist\"$arg\""
97 fi
98 done
99
100 case "$sml" in
101 poly)
102 if [ -n "$local_install" ] && polyc --help >/dev/null 2>&1 ; then
103 if [ ! -x "$gen_out" ]; then
104 polyc -o "$gen_out" "$program"
105 fi
106 "$gen_out" "$@"
107 else
108 echo 'use "'"$program"'"; vext ['"$arglist"'];' |
109 poly -q --error-exit
110 fi ;;
111 mlton)
112 if [ ! -x "$gen_out" ]; then
113 echo "[Precompiling Vext binary...]" 1>&2
114 echo "val _ = main ()" | cat "$program" - > "$gen_sml"
115 mlton -output "$gen_out" "$gen_sml"
116 fi
117 "$gen_out" "$@" ;;
118 smlnj)
119 cat "$program" | (
120 cat <<EOF
121 val smlrun__cp =
122 let val x = !Control.Print.out in
123 Control.Print.out := { say = fn _ => (), flush = fn () => () };
124 x
125 end;
126 val smlrun__prev = ref "";
127 Control.Print.out := {
128 say = fn s =>
129 (if String.isSubstring " Error" s
130 then (Control.Print.out := smlrun__cp;
131 (#say smlrun__cp) (!smlrun__prev);
132 (#say smlrun__cp) s)
133 else (smlrun__prev := s; ())),
134 flush = fn s => ()
135 };
136 EOF
137 cat -
138 cat <<EOF
139 val _ = vext [$arglist];
140 val _ = OS.Process.exit (OS.Process.success);
141 EOF
142 ) > "$gen_sml"
143 CM_VERBOSE=false sml "$gen_sml" ;;
144 *)
145 echo "ERROR: Unknown SML implementation name: $sml" 1>&2;
146 exit 2 ;;
147 esac
148