annotate vext.ps1 @ 74:42cc6dfc0026

Artifacts
author Chris Cannam
date Thu, 08 Feb 2018 12:37:47 +0000
parents 2d3e1d1f99c0
children
rev   line source
Chris@70 1 <#
Chris@70 2
Chris@70 3 .SYNOPSIS
Chris@70 4 A simple manager for third-party source code dependencies.
Chris@70 5 Run "vext help" for more documentation.
Chris@70 6
Chris@70 7 #>
Chris@70 8
Chris@70 9 Set-StrictMode -Version 2.0
Chris@70 10 $ErrorActionPreference = "Stop"
Chris@70 11
Chris@70 12 $sml = $env:VEXT_SML
Chris@70 13
Chris@70 14 $mydir = Split-Path $MyInvocation.MyCommand.Path -Parent
Chris@70 15 $program = "$mydir/vext.sml"
Chris@70 16
Chris@70 17 # We need either Poly/ML or SML/NJ. No great preference as to which.
Chris@70 18
Chris@70 19 if (!$sml) {
Chris@70 20 if (Get-Command "sml" -ErrorAction SilentlyContinue) {
Chris@70 21 $sml = "smlnj"
Chris@70 22 } elseif (Get-Command "polyml" -ErrorAction SilentlyContinue) {
Chris@70 23 $sml = "poly"
Chris@70 24 } else {
Chris@70 25 echo @"
Chris@70 26
Chris@70 27 ERROR: No supported SML compiler or interpreter found
Chris@70 28
Chris@70 29 The Vext external source code manager needs a Standard ML (SML)
Chris@70 30 compiler or interpreter to run.
Chris@70 31
Chris@70 32 Please ensure you have one of the following SML implementations
Chris@70 33 installed and present in your PATH, and try again.
Chris@70 34
Chris@70 35 1. Standard ML of New Jersey
Chris@70 36 - executable name: sml
Chris@70 37
Chris@70 38 2. Poly/ML
Chris@70 39 - executable name: polyml
Chris@70 40
Chris@70 41 "@
Chris@70 42 exit 1
Chris@70 43 }
Chris@70 44 }
Chris@70 45
Chris@70 46 if ($args -match "'""") {
Chris@70 47 $arglist = '["usage"]'
Chris@70 48 } else {
Chris@70 49 $arglist = '["' + ($args -join '","') + '"]'
Chris@70 50 }
Chris@70 51
Chris@70 52 if ($sml -eq "poly") {
Chris@70 53
Chris@70 54 $program = $program -replace "\\","\\\\"
Chris@70 55 echo "use ""$program""; vext $arglist" | polyml -q --error-exit | Out-Host
Chris@70 56
Chris@70 57 if (-not $?) {
Chris@70 58 exit $LastExitCode
Chris@70 59 }
Chris@70 60
Chris@70 61 } elseif ($sml -eq "smlnj") {
Chris@70 62
Chris@70 63 $lines = @(Get-Content $program)
Chris@70 64 $lines = $lines -notmatch "val _ = main ()"
Chris@70 65
Chris@70 66 $intro = @"
Chris@70 67 val smlrun__cp =
Chris@70 68 let val x = !Control.Print.out in
Chris@70 69 Control.Print.out := { say = fn _ => (), flush = fn () => () };
Chris@70 70 x
Chris@70 71 end;
Chris@70 72 val smlrun__prev = ref "";
Chris@70 73 Control.Print.out := {
Chris@70 74 say = fn s =>
Chris@70 75 (if String.isSubstring "Error" s orelse String.isSubstring "Fail" s
Chris@70 76 then (Control.Print.out := smlrun__cp;
Chris@70 77 (#say smlrun__cp) (!smlrun__prev);
Chris@70 78 (#say smlrun__cp) s)
Chris@70 79 else (smlrun__prev := s; ())),
Chris@70 80 flush = fn s => ()
Chris@70 81 };
Chris@70 82 "@ -split "[\r\n]+"
Chris@70 83
Chris@70 84 $outro = @"
Chris@70 85 val _ = vext $arglist;
Chris@70 86 val _ = OS.Process.exit (OS.Process.success);
Chris@70 87 "@ -split "[\r\n]+"
Chris@70 88
Chris@70 89 $script = @()
Chris@70 90 $script += $intro
Chris@70 91 $script += $lines
Chris@70 92 $script += $outro
Chris@70 93
Chris@70 94 $tmpfile = ([System.IO.Path]::GetTempFileName()) -replace "[.]tmp",".sml"
Chris@70 95
Chris@70 96 $script | Out-File -Encoding "ASCII" $tmpfile
Chris@70 97
Chris@70 98 $env:CM_VERBOSE="false"
Chris@70 99
Chris@70 100 sml $tmpfile
Chris@70 101
Chris@70 102 if (-not $?) {
Chris@70 103 del $tmpfile
Chris@70 104 exit $LastExitCode
Chris@70 105 }
Chris@70 106
Chris@70 107 del $tmpfile
Chris@70 108
Chris@70 109 } else {
Chris@70 110
Chris@70 111 "Unknown SML implementation name: $sml"
Chris@70 112 exit 2
Chris@70 113 }