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