annotate repoint @ 54:21e050f82be4

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