-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathmyocamlbuild.ml
92 lines (82 loc) · 3.19 KB
/
myocamlbuild.ml
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
88
89
90
91
92
(******************************************************************************)
(* OASIS: architecture for building OCaml libraries and applications *)
(* *)
(* Copyright (C) 2011-2016, Sylvain Le Gall *)
(* Copyright (C) 2008-2011, OCamlCore SARL *)
(* *)
(* This library is free software; you can redistribute it and/or modify it *)
(* under the terms of the GNU Lesser General Public License as published by *)
(* the Free Software Foundation; either version 2.1 of the License, or (at *)
(* your option) any later version, with the OCaml static compilation *)
(* exception. *)
(* *)
(* This library is distributed in the hope that it will be useful, but *)
(* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *)
(* or FITNESS FOR A PARTICULAR PURPOSE. See the file COPYING for more *)
(* details. *)
(* *)
(* You should have received a copy of the GNU Lesser General Public License *)
(* along with this library; if not, write to the Free Software Foundation, *)
(* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA *)
(******************************************************************************)
open Ocamlbuild_plugin;;
open Command;;
(* TODO: use an ocamlbuild plugin for ocamlify. *)
let depends_from_file env build ?(fmod=fun x -> x) fn =
let depends_lst =
let deps = ref [] in
let fd = open_in fn in
begin
try
while true; do deps := (fmod (input_line fd)) :: !deps done
with End_of_file ->
close_in fd
end;
List.rev !deps
in
List.iter
(fun fn ->
List.iter
(function
| Outcome.Good _ -> ()
| Outcome.Bad exn ->
prerr_endline
(Printf.sprintf
"Could not build '%s': %s"
fn
(Printexc.to_string exn));
raise exn
)
(build [[fn]])
)
depends_lst
;;
let ocamlify = A"ocamlify";;
rule "ocamlify: %.mlify -> %.mlify.depends"
~prod:"%.mlify.depends"
~dep:"%.mlify"
begin
fun env _ ->
Cmd(S[ocamlify;
T(tags_of_pathname (env "%.mlify")++"ocamlify"++"depends");
A"--depends";
A"--output"; P(env "%.mlify.depends");
P(env "%.mlify");])
end
;;
rule "ocamlify: %.mlify & %.mlify.depends -> %.ml"
~prod:"%.ml"
~deps:["%.mlify"; "%.mlify.depends"]
begin
fun env build ->
depends_from_file
env
build
(env "%.mlify.depends");
Cmd(S[ocamlify; A"--output"; P(env "%.ml"); P(env "%.mlify")])
end
;;
(* OASIS_START *)
(* OASIS_STOP *)
open Ocamlbuild_plugin;;
dispatch dispatch_default;;