-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmake.sml
87 lines (72 loc) · 2.88 KB
/
make.sml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(* Given a base string, builds the appropriate executables *)
structure Make:> sig
(* Takes a base, like "hopeless" or "hopeless:102" and returns
* a path to player-hopeless.exe or player-hopeless-102.exe *)
val getExe: string -> string
exception MakeFailed
(* breaking interfaces *)
val flagSubmit: bool ref
val file_exists: string -> bool
end = struct
val flagSubmit = Params.flag false
(SOME ("--submit", "ONLY USE IF YOU'VE TALKED TO ROB")) "submit"
datatype player_file = CUR of string | REV of string * int
exception BadPlayer
exception MakeFailed
fun parse_player_arg s =
case String.tokens (fn x => x = #":") s of
[] => raise BadPlayer
| [name] => CUR name
| [name, num] => (case Int.fromString num of NONE => raise BadPlayer
| SOME n => REV (name, n))
| _ => raise BadPlayer
(* build_target and build_filename include messy hack to get around
* joshua_'s change to the build process on Friday night *)
fun build_target (CUR name) = "player-" ^ name ^ ".exe"
| build_target (REV (name, num)) =
if num > 175 then "player-" ^ name ^ ".exe"
else "player-" ^ name
fun build_filename (x as (CUR name)) = build_target x
| build_filename (x as (REV (name, num))) =
if num > 175 then build_target x
else "player-" ^ name ^ ".exe"
fun save_filename (CUR name) = "player-" ^ name ^ ".exe"
| save_filename (REV (name, num)) =
"player-" ^ name ^ "-" ^ (Int.toString num) ^ ".exe"
exception Archive
fun archive_filename (CUR name) = raise Archive
| archive_filename (REV (name, num)) =
"player-" ^ name ^ "-" ^ Int.toString num ^ ".tgz"
fun file_exists file =
case (SOME (OS.FileSys.fullPath file) handle SysErr => NONE) of
SOME _ => true
| NONE => false
fun getExe base =
let
val player = parse_player_arg(base)
val _ = if (file_exists (save_filename player)) then () else
case player of
REV (_, n) =>
(OS.Process.system("svn up -q -r " ^ (Int.toString n));
OS.Process.system("make " ^ (build_target player));
OS.Process.system("mv " ^ (build_filename player)
^ " " ^ (save_filename player));
OS.Process.system("svn up -q");
())
| CUR _ =>
(OS.Process.system("make " ^ (build_target player));
())
val _ =
if !flagSubmit andalso not(file_exists (archive_filename player))
then case player of
CUR _ => raise Archive
| REV (name, n) =>
OS.Process.system("./submission " ^ name ^ " " ^ Int.toString n)
else OS.Process.success
val filename = OS.Path.joinDirFile {dir = OS.FileSys.getDir (),
file = save_filename player}
in
if file_exists filename then filename
else raise MakeFailed
end
end