-
Notifications
You must be signed in to change notification settings - Fork 11
/
B0.ml
142 lines (122 loc) · 5.1 KB
/
B0.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
open B0_kit.V000
open Result.Syntax
let unicode_version = 16, 0, 0, None (* Adjust on new releases *)
let next_major = let maj, _, _, _ = unicode_version in (maj + 1), 0, 0, None
(* OCaml library names *)
let b0_std = B0_ocaml.libname "b0.std"
let unix = B0_ocaml.libname "unix"
let uucd = B0_ocaml.libname "uucd"
let uunf = B0_ocaml.libname "uunf"
let cmdliner = B0_ocaml.libname "cmdliner"
let uucp = B0_ocaml.libname "uucp"
(* Libraries *)
let uucp_lib = B0_ocaml.lib uucp ~srcs:[ `Dir ~/"src" ]
(* Data generation. *)
let generate_data =
let doc = "uucp_*_data.ml files generator" in
let srcs =
[ `Dir ~/"support";
(* Well that was based on ocamlbuild loose' inclusion,
maybe we could move all that to a single _base.ml module. *)
`File ~/"src/uucp_block_base.ml";
`File ~/"src/uucp_break_base.ml";
`File ~/"src/uucp_gc_base.ml";
`File ~/"src/uucp_hangul_base.ml";
`File ~/"src/uucp_name_base.ml";
`File ~/"src/uucp_num_base.ml";
`File ~/"src/uucp_script_base.ml";
(* *)
`File ~/"src/uucp_cmap.ml";
`File ~/"src/uucp_fmt.ml";
`File ~/"src/uucp_rmap.ml";
`File ~/"src/uucp_tmap.ml";
`File ~/"src/uucp_tmap5bytes.ml";
`File ~/"src/uucp_tmapbool.ml";
`File ~/"src/uucp_tmapbyte.ml"; ]
in
let requires = [ uucd; unix ] in
let meta =
B0_meta.empty
|> B0_meta.(tag build)
|> ~~ B0_unit.Action.cwd `Scope_dir
in
B0_ocaml.exe "generate-data" ~doc ~srcs ~requires ~meta
(* Tools *)
let ucharinfo =
let doc = "The ucharinfo tool" in
let srcs = [ `File ~/"test/ucharinfo.ml" ] in
let requires = [ cmdliner; uunf; uucp ] in
B0_ocaml.exe "ucharinfo" ~public:true ~doc ~srcs ~requires
(* Tests *)
let test ?doc ?(meta = B0_meta.empty) ?run:(r = false) ?(requires = []) src =
let srcs = [ `File src ] in
let requires = uucp :: requires in
let meta = B0_meta.(meta |> tag test |> add run r) in
let name = Fpath.basename ~strip_ext:true src in
B0_ocaml.exe name ?doc ~srcs ~meta ~requires
let test_uucp =
let doc = "Test Uucp against the Unicode database." in
let meta = B0_meta.empty |> ~~ B0_unit.Action.cwd `Scope_dir in
test ~/"test/test_uucp.ml" ~requires:[uucd; b0_std] ~meta ~run:true ~doc
let perf = test ~/"test/perf.ml" ~doc:"Test performance"
let link_test = test ~/"test/link_test.ml" ~doc:"Link test"
let examples = test ~/"test/examples.ml" ~requires:[uunf] ~doc:"Doc samples"
(* Actions *)
let uc_base = "http://www.unicode.org/Public"
let show_version =
B0_unit.of_action "unicode-version" ~doc:"Show supported unicode version" @@
fun _ _ ~args:_ ->
Ok (Log.stdout (fun m -> m "%s" (String.of_version unicode_version)))
let download_ucdxml =
let doc = "Download the ucdxml to support/ucd.xml" in
B0_unit.of_action "download-ucdxml" ~doc @@ fun env _ ~args:_ ->
let* unzip = B0_env.get_cmd env (Cmd.tool "unzip") in
let version = String.of_version unicode_version in
let ucd_url = Fmt.str "%s/%s/ucdxml/ucd.all.grouped.zip" uc_base version in
let ucd_file = B0_env.in_scope_dir env ~/"support/ucd.xml" in
Result.join @@ Os.File.with_tmp_fd @@ fun tmpfile tmpfd ->
(Log.stdout @@ fun m ->
m "@[<v>Downloading %s@,to %a@]" ucd_url Fpath.pp ucd_file);
let* () = B0_action_kit.fetch_url env ucd_url tmpfile in
let stdout = Os.Cmd.out_file ~force:true ~make_path:true ucd_file in
Os.Cmd.run Cmd.(unzip % "-p" %% path tmpfile) ~stdout
(* Packs *)
let default =
let unicode_version = String.of_version unicode_version in
let next_major = String.of_version next_major in
let meta =
B0_meta.empty
|> ~~ B0_meta.authors ["The uucp programmers"]
|> ~~ B0_meta.maintainers ["Daniel Bünzli <daniel.buenzl i@erratique.ch>"]
|> ~~ B0_meta.homepage "https://erratique.ch/software/uucp"
|> ~~ B0_meta.online_doc "https://erratique.ch/software/uucp/doc/"
|> ~~ B0_meta.licenses ["ISC"]
|> ~~ B0_meta.repo "git+https://erratique.ch/repos/uucp.git"
|> ~~ B0_meta.issues "https://github.com/dbuenzli/uucp/issues"
|> ~~ B0_meta.description_tags
["unicode"; "text"; "character"; "org:erratique"]
|> ~~ B0_opam.build
{|[["ocaml" "pkg/pkg.ml" "build" "--dev-pkg" "%{dev}%"
"--with-uunf" "%{uunf:installed}%"
"--with-cmdliner" "%{cmdliner:installed}%" ]]|}
|> B0_meta.tag B0_opam.tag
|> ~~ B0_opam.depopts [ "uunf", ""; "cmdliner", ""]
|> ~~ B0_opam.conflicts
[ "uunf", Fmt.str {|< "%s" | >= "%s" |} unicode_version next_major;
"cmdliner", {|< "1.1.0"|} ]
|> ~~ B0_opam.depends
[ "ocaml", {|>= "4.14.0"|};
"ocamlfind", {|build|};
"ocamlbuild", {|build|};
"topkg", {|build & >= "1.0.3"|};
"uucd", Fmt.str {|with-test dev & >= "%s" & < "%s"|}
unicode_version next_major;
"uunf", {|with-test|} ]
|> ~~ B0_opam.file_addendum
[ `Field ("post-messages", `L (true, [
`S "If the build fails with \"ocamlopt.opt got signal and \
exited\", issue 'ulimit -s unlimited' and retry.";
`Raw {|{failure & (arch = "ppc64" | arch = "arm64")}|}]))]
in
B0_pack.make "default" ~doc:"uucd package" ~meta ~locked:true @@
B0_unit.list ()