annotate vext.ps1 @ 1747:ffe59b457557

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