Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 515 lines (435 sloc) 14.763 kb
612a479 @andrenth libmilter bindings
authored
1 (* OASIS_START *)
3791df1 @andrenth Renaming library back to Milter
authored
2 (* DO NOT EDIT (digest: 1357a97222e2271f08b2687684f56835) *)
612a479 @andrenth libmilter bindings
authored
3 module OASISGettext = struct
3791df1 @andrenth Renaming library back to Milter
authored
4 # 21 "/home/andre/src/oasis-0.3.0/src/oasis/OASISGettext.ml"
5
6 let ns_ str =
612a479 @andrenth libmilter bindings
authored
7 str
3791df1 @andrenth Renaming library back to Milter
authored
8
9 let s_ str =
612a479 @andrenth libmilter bindings
authored
10 str
3791df1 @andrenth Renaming library back to Milter
authored
11
612a479 @andrenth libmilter bindings
authored
12 let f_ (str : ('a, 'b, 'c, 'd) format4) =
13 str
3791df1 @andrenth Renaming library back to Milter
authored
14
612a479 @andrenth libmilter bindings
authored
15 let fn_ fmt1 fmt2 n =
16 if n = 1 then
17 fmt1^^""
18 else
19 fmt2^^""
3791df1 @andrenth Renaming library back to Milter
authored
20
21 let init =
612a479 @andrenth libmilter bindings
authored
22 []
3791df1 @andrenth Renaming library back to Milter
authored
23
612a479 @andrenth libmilter bindings
authored
24 end
25
26 module OASISExpr = struct
3791df1 @andrenth Renaming library back to Milter
authored
27 # 21 "/home/andre/src/oasis-0.3.0/src/oasis/OASISExpr.ml"
28
29
30
612a479 @andrenth libmilter bindings
authored
31 open OASISGettext
3791df1 @andrenth Renaming library back to Milter
authored
32
612a479 @andrenth libmilter bindings
authored
33 type test = string
3791df1 @andrenth Renaming library back to Milter
authored
34
612a479 @andrenth libmilter bindings
authored
35 type flag = string
3791df1 @andrenth Renaming library back to Milter
authored
36
612a479 @andrenth libmilter bindings
authored
37 type t =
38 | EBool of bool
39 | ENot of t
40 | EAnd of t * t
41 | EOr of t * t
42 | EFlag of flag
43 | ETest of test * string
44
3791df1 @andrenth Renaming library back to Milter
authored
45
612a479 @andrenth libmilter bindings
authored
46 type 'a choices = (t * 'a) list
3791df1 @andrenth Renaming library back to Milter
authored
47
612a479 @andrenth libmilter bindings
authored
48 let eval var_get t =
3791df1 @andrenth Renaming library back to Milter
authored
49 let rec eval' =
612a479 @andrenth libmilter bindings
authored
50 function
51 | EBool b ->
52 b
3791df1 @andrenth Renaming library back to Milter
authored
53
54 | ENot e ->
612a479 @andrenth libmilter bindings
authored
55 not (eval' e)
3791df1 @andrenth Renaming library back to Milter
authored
56
612a479 @andrenth libmilter bindings
authored
57 | EAnd (e1, e2) ->
58 (eval' e1) && (eval' e2)
3791df1 @andrenth Renaming library back to Milter
authored
59
60 | EOr (e1, e2) ->
612a479 @andrenth libmilter bindings
authored
61 (eval' e1) || (eval' e2)
3791df1 @andrenth Renaming library back to Milter
authored
62
612a479 @andrenth libmilter bindings
authored
63 | EFlag nm ->
64 let v =
65 var_get nm
66 in
67 assert(v = "true" || v = "false");
68 (v = "true")
3791df1 @andrenth Renaming library back to Milter
authored
69
612a479 @andrenth libmilter bindings
authored
70 | ETest (nm, vl) ->
71 let v =
72 var_get nm
73 in
74 (v = vl)
75 in
76 eval' t
3791df1 @andrenth Renaming library back to Milter
authored
77
612a479 @andrenth libmilter bindings
authored
78 let choose ?printer ?name var_get lst =
3791df1 @andrenth Renaming library back to Milter
authored
79 let rec choose_aux =
612a479 @andrenth libmilter bindings
authored
80 function
81 | (cond, vl) :: tl ->
3791df1 @andrenth Renaming library back to Milter
authored
82 if eval var_get cond then
83 vl
612a479 @andrenth libmilter bindings
authored
84 else
85 choose_aux tl
86 | [] ->
3791df1 @andrenth Renaming library back to Milter
authored
87 let str_lst =
612a479 @andrenth libmilter bindings
authored
88 if lst = [] then
89 s_ "<empty>"
90 else
3791df1 @andrenth Renaming library back to Milter
authored
91 String.concat
612a479 @andrenth libmilter bindings
authored
92 (s_ ", ")
93 (List.map
94 (fun (cond, vl) ->
95 match printer with
96 | Some p -> p vl
97 | None -> s_ "<no printer>")
98 lst)
99 in
3791df1 @andrenth Renaming library back to Milter
authored
100 match name with
612a479 @andrenth libmilter bindings
authored
101 | Some nm ->
102 failwith
3791df1 @andrenth Renaming library back to Milter
authored
103 (Printf.sprintf
612a479 @andrenth libmilter bindings
authored
104 (f_ "No result for the choice list '%s': %s")
105 nm str_lst)
106 | None ->
107 failwith
108 (Printf.sprintf
109 (f_ "No result for a choice list: %s")
110 str_lst)
111 in
112 choose_aux (List.rev lst)
3791df1 @andrenth Renaming library back to Milter
authored
113
612a479 @andrenth libmilter bindings
authored
114 end
115
116
3791df1 @andrenth Renaming library back to Milter
authored
117 # 117 "myocamlbuild.ml"
612a479 @andrenth libmilter bindings
authored
118 module BaseEnvLight = struct
3791df1 @andrenth Renaming library back to Milter
authored
119 # 21 "/home/andre/src/oasis-0.3.0/src/base/BaseEnvLight.ml"
120
612a479 @andrenth libmilter bindings
authored
121 module MapString = Map.Make(String)
3791df1 @andrenth Renaming library back to Milter
authored
122
612a479 @andrenth libmilter bindings
authored
123 type t = string MapString.t
3791df1 @andrenth Renaming library back to Milter
authored
124
612a479 @andrenth libmilter bindings
authored
125 let default_filename =
3791df1 @andrenth Renaming library back to Milter
authored
126 Filename.concat
612a479 @andrenth libmilter bindings
authored
127 (Sys.getcwd ())
128 "setup.data"
3791df1 @andrenth Renaming library back to Milter
authored
129
612a479 @andrenth libmilter bindings
authored
130 let load ?(allow_empty=false) ?(filename=default_filename) () =
131 if Sys.file_exists filename then
132 begin
133 let chn =
134 open_in_bin filename
135 in
136 let st =
137 Stream.of_channel chn
138 in
139 let line =
140 ref 1
141 in
3791df1 @andrenth Renaming library back to Milter
authored
142 let st_line =
612a479 @andrenth libmilter bindings
authored
143 Stream.from
144 (fun _ ->
145 try
3791df1 @andrenth Renaming library back to Milter
authored
146 match Stream.next st with
612a479 @andrenth libmilter bindings
authored
147 | '\n' -> incr line; Some '\n'
148 | c -> Some c
149 with Stream.Failure -> None)
150 in
3791df1 @andrenth Renaming library back to Milter
authored
151 let lexer =
612a479 @andrenth libmilter bindings
authored
152 Genlex.make_lexer ["="] st_line
153 in
154 let rec read_file mp =
3791df1 @andrenth Renaming library back to Milter
authored
155 match Stream.npeek 3 lexer with
612a479 @andrenth libmilter bindings
authored
156 | [Genlex.Ident nm; Genlex.Kwd "="; Genlex.String value] ->
3791df1 @andrenth Renaming library back to Milter
authored
157 Stream.junk lexer;
158 Stream.junk lexer;
612a479 @andrenth libmilter bindings
authored
159 Stream.junk lexer;
160 read_file (MapString.add nm value mp)
161 | [] ->
162 mp
163 | _ ->
164 failwith
165 (Printf.sprintf
166 "Malformed data file '%s' line %d"
167 filename !line)
168 in
169 let mp =
170 read_file MapString.empty
171 in
172 close_in chn;
173 mp
174 end
175 else if allow_empty then
176 begin
177 MapString.empty
178 end
179 else
180 begin
3791df1 @andrenth Renaming library back to Milter
authored
181 failwith
182 (Printf.sprintf
612a479 @andrenth libmilter bindings
authored
183 "Unable to load environment, the file '%s' doesn't exist."
184 filename)
185 end
3791df1 @andrenth Renaming library back to Milter
authored
186
612a479 @andrenth libmilter bindings
authored
187 let var_get name env =
188 let rec var_expand str =
189 let buff =
190 Buffer.create ((String.length str) * 2)
191 in
3791df1 @andrenth Renaming library back to Milter
authored
192 Buffer.add_substitute
612a479 @andrenth libmilter bindings
authored
193 buff
3791df1 @andrenth Renaming library back to Milter
authored
194 (fun var ->
195 try
612a479 @andrenth libmilter bindings
authored
196 var_expand (MapString.find var env)
197 with Not_found ->
3791df1 @andrenth Renaming library back to Milter
authored
198 failwith
199 (Printf.sprintf
612a479 @andrenth libmilter bindings
authored
200 "No variable %s defined when trying to expand %S."
3791df1 @andrenth Renaming library back to Milter
authored
201 var
612a479 @andrenth libmilter bindings
authored
202 str))
203 str;
204 Buffer.contents buff
205 in
206 var_expand (MapString.find name env)
3791df1 @andrenth Renaming library back to Milter
authored
207
208 let var_choose lst env =
612a479 @andrenth libmilter bindings
authored
209 OASISExpr.choose
210 (fun nm -> var_get nm env)
211 lst
212 end
213
214
3791df1 @andrenth Renaming library back to Milter
authored
215 # 215 "myocamlbuild.ml"
612a479 @andrenth libmilter bindings
authored
216 module MyOCamlbuildFindlib = struct
3791df1 @andrenth Renaming library back to Milter
authored
217 # 21 "/home/andre/src/oasis-0.3.0/src/plugins/ocamlbuild/MyOCamlbuildFindlib.ml"
218
612a479 @andrenth libmilter bindings
authored
219 (** OCamlbuild extension, copied from
220 * http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuild
221 * by N. Pouillard and others
222 *
223 * Updated on 2009/02/28
224 *
225 * Modified by Sylvain Le Gall
226 *)
227 open Ocamlbuild_plugin
3791df1 @andrenth Renaming library back to Milter
authored
228
612a479 @andrenth libmilter bindings
authored
229 (* these functions are not really officially exported *)
230 let run_and_read =
231 Ocamlbuild_pack.My_unix.run_and_read
3791df1 @andrenth Renaming library back to Milter
authored
232
612a479 @andrenth libmilter bindings
authored
233 let blank_sep_strings =
234 Ocamlbuild_pack.Lexers.blank_sep_strings
3791df1 @andrenth Renaming library back to Milter
authored
235
612a479 @andrenth libmilter bindings
authored
236 let split s ch =
237 let x =
238 ref []
239 in
240 let rec go s =
241 let pos =
242 String.index s ch
243 in
244 x := (String.before s pos)::!x;
245 go (String.after s (pos + 1))
246 in
247 try
248 go s
249 with Not_found -> !x
3791df1 @andrenth Renaming library back to Milter
authored
250
612a479 @andrenth libmilter bindings
authored
251 let split_nl s = split s '\n'
3791df1 @andrenth Renaming library back to Milter
authored
252
612a479 @andrenth libmilter bindings
authored
253 let before_space s =
254 try
255 String.before s (String.index s ' ')
256 with Not_found -> s
3791df1 @andrenth Renaming library back to Milter
authored
257
612a479 @andrenth libmilter bindings
authored
258 (* this lists all supported packages *)
259 let find_packages () =
260 List.map before_space (split_nl & run_and_read "ocamlfind list")
3791df1 @andrenth Renaming library back to Milter
authored
261
612a479 @andrenth libmilter bindings
authored
262 (* this is supposed to list available syntaxes, but I don't know how to do it. *)
263 let find_syntaxes () = ["camlp4o"; "camlp4r"]
3791df1 @andrenth Renaming library back to Milter
authored
264
612a479 @andrenth libmilter bindings
authored
265 (* ocamlfind command *)
266 let ocamlfind x = S[A"ocamlfind"; x]
3791df1 @andrenth Renaming library back to Milter
authored
267
612a479 @andrenth libmilter bindings
authored
268 let dispatch =
269 function
270 | Before_options ->
271 (* by using Before_options one let command line options have an higher priority *)
272 (* on the contrary using After_options will guarantee to have the higher priority *)
273 (* override default commands by ocamlfind ones *)
274 Options.ocamlc := ocamlfind & A"ocamlc";
275 Options.ocamlopt := ocamlfind & A"ocamlopt";
276 Options.ocamldep := ocamlfind & A"ocamldep";
277 Options.ocamldoc := ocamlfind & A"ocamldoc";
278 Options.ocamlmktop := ocamlfind & A"ocamlmktop"
279
280 | After_rules ->
281
282 (* When one link an OCaml library/binary/package, one should use -linkpkg *)
283 flag ["ocaml"; "link"; "program"] & A"-linkpkg";
284
285 (* For each ocamlfind package one inject the -package option when
286 * compiling, computing dependencies, generating documentation and
287 * linking. *)
288 List.iter
289 begin fun pkg ->
290 flag ["ocaml"; "compile"; "pkg_"^pkg] & S[A"-package"; A pkg];
291 flag ["ocaml"; "ocamldep"; "pkg_"^pkg] & S[A"-package"; A pkg];
292 flag ["ocaml"; "doc"; "pkg_"^pkg] & S[A"-package"; A pkg];
293 flag ["ocaml"; "link"; "pkg_"^pkg] & S[A"-package"; A pkg];
294 flag ["ocaml"; "infer_interface"; "pkg_"^pkg] & S[A"-package"; A pkg];
295 end
296 (find_packages ());
3791df1 @andrenth Renaming library back to Milter
authored
297
612a479 @andrenth libmilter bindings
authored
298 (* Like -package but for extensions syntax. Morover -syntax is useless
299 * when linking. *)
300 List.iter begin fun syntax ->
301 flag ["ocaml"; "compile"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
302 flag ["ocaml"; "ocamldep"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
303 flag ["ocaml"; "doc"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
304 flag ["ocaml"; "infer_interface"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
305 end (find_syntaxes ());
3791df1 @andrenth Renaming library back to Milter
authored
306
612a479 @andrenth libmilter bindings
authored
307 (* The default "thread" tag is not compatible with ocamlfind.
308 * Indeed, the default rules add the "threads.cma" or "threads.cmxa"
309 * options when using this tag. When using the "-linkpkg" option with
310 * ocamlfind, this module will then be added twice on the command line.
311 *
312 * To solve this, one approach is to add the "-thread" option when using
313 * the "threads" package using the previous plugin.
314 *)
315 flag ["ocaml"; "pkg_threads"; "compile"] (S[A "-thread"]);
3791df1 @andrenth Renaming library back to Milter
authored
316 flag ["ocaml"; "pkg_threads"; "doc"] (S[A "-I"; A "+threads"]);
612a479 @andrenth libmilter bindings
authored
317 flag ["ocaml"; "pkg_threads"; "link"] (S[A "-thread"]);
318 flag ["ocaml"; "pkg_threads"; "infer_interface"] (S[A "-thread"])
3791df1 @andrenth Renaming library back to Milter
authored
319
612a479 @andrenth libmilter bindings
authored
320 | _ ->
321 ()
3791df1 @andrenth Renaming library back to Milter
authored
322
612a479 @andrenth libmilter bindings
authored
323 end
324
325 module MyOCamlbuildBase = struct
3791df1 @andrenth Renaming library back to Milter
authored
326 # 21 "/home/andre/src/oasis-0.3.0/src/plugins/ocamlbuild/MyOCamlbuildBase.ml"
327
612a479 @andrenth libmilter bindings
authored
328 (** Base functions for writing myocamlbuild.ml
329 @author Sylvain Le Gall
330 *)
3791df1 @andrenth Renaming library back to Milter
authored
331
332
333
612a479 @andrenth libmilter bindings
authored
334 open Ocamlbuild_plugin
3791df1 @andrenth Renaming library back to Milter
authored
335 module OC = Ocamlbuild_pack.Ocaml_compiler
336
612a479 @andrenth libmilter bindings
authored
337 type dir = string
338 type file = string
339 type name = string
340 type tag = string
3791df1 @andrenth Renaming library back to Milter
authored
341
342 # 56 "/home/andre/src/oasis-0.3.0/src/plugins/ocamlbuild/MyOCamlbuildBase.ml"
343
612a479 @andrenth libmilter bindings
authored
344 type t =
345 {
346 lib_ocaml: (name * dir list) list;
347 lib_c: (name * dir * file list) list;
348 flags: (tag list * (spec OASISExpr.choices)) list;
3791df1 @andrenth Renaming library back to Milter
authored
349 (* Replace the 'dir: include' from _tags by a precise interdepends in
350 * directory.
351 *)
352 includes: (dir * dir list) list;
612a479 @andrenth libmilter bindings
authored
353 }
3791df1 @andrenth Renaming library back to Milter
authored
354
612a479 @andrenth libmilter bindings
authored
355 let env_filename =
356 Pathname.basename
357 BaseEnvLight.default_filename
3791df1 @andrenth Renaming library back to Milter
authored
358
612a479 @andrenth libmilter bindings
authored
359 let dispatch_combine lst =
360 fun e ->
361 List.iter
362 (fun dispatch -> dispatch e)
363 lst
3791df1 @andrenth Renaming library back to Milter
authored
364
365 let tag_libstubs nm =
366 "use_lib"^nm^"_stubs"
367
368 let nm_libstubs nm =
369 nm^"_stubs"
370
612a479 @andrenth libmilter bindings
authored
371 let dispatch t e =
372 let env =
373 BaseEnvLight.load
374 ~filename:env_filename
375 ~allow_empty:true
376 ()
377 in
378 match e with
379 | Before_options ->
380 let no_trailing_dot s =
381 if String.length s >= 1 && s.[0] = '.' then
382 String.sub s 1 ((String.length s) - 1)
383 else
384 s
385 in
386 List.iter
387 (fun (opt, var) ->
388 try
389 opt := no_trailing_dot (BaseEnvLight.var_get var env)
390 with Not_found ->
391 Printf.eprintf "W: Cannot get variable %s" var)
392 [
393 Options.ext_obj, "ext_obj";
394 Options.ext_lib, "ext_lib";
395 Options.ext_dll, "ext_dll";
396 ]
3791df1 @andrenth Renaming library back to Milter
authored
397
612a479 @andrenth libmilter bindings
authored
398 | After_rules ->
399 (* Declare OCaml libraries *)
400 List.iter
401 (function
3791df1 @andrenth Renaming library back to Milter
authored
402 | nm, [] ->
403 ocaml_lib nm
404 | nm, dir :: tl ->
405 ocaml_lib ~dir:dir (dir^"/"^nm);
612a479 @andrenth libmilter bindings
authored
406 List.iter
407 (fun dir ->
3791df1 @andrenth Renaming library back to Milter
authored
408 List.iter
409 (fun str ->
410 flag ["ocaml"; "use_"^nm; str] (S[A"-I"; P dir]))
411 ["compile"; "infer_interface"; "doc"])
612a479 @andrenth libmilter bindings
authored
412 tl)
413 t.lib_ocaml;
3791df1 @andrenth Renaming library back to Milter
authored
414
415 (* Declare directories dependencies, replace "include" in _tags. *)
416 List.iter
417 (fun (dir, include_dirs) ->
418 Pathname.define_context dir include_dirs)
419 t.includes;
420
612a479 @andrenth libmilter bindings
authored
421 (* Declare C libraries *)
422 List.iter
423 (fun (lib, dir, headers) ->
424 (* Handle C part of library *)
3791df1 @andrenth Renaming library back to Milter
authored
425 flag ["link"; "library"; "ocaml"; "byte"; tag_libstubs lib]
426 (S[A"-dllib"; A("-l"^(nm_libstubs lib)); A"-cclib";
427 A("-l"^(nm_libstubs lib))]);
428
429 flag ["link"; "library"; "ocaml"; "native"; tag_libstubs lib]
430 (S[A"-cclib"; A("-l"^(nm_libstubs lib))]);
612a479 @andrenth libmilter bindings
authored
431
3791df1 @andrenth Renaming library back to Milter
authored
432 flag ["link"; "program"; "ocaml"; "byte"; tag_libstubs lib]
433 (S[A"-dllib"; A("dll"^(nm_libstubs lib))]);
434
612a479 @andrenth libmilter bindings
authored
435 (* When ocaml link something that use the C library, then one
436 need that file to be up to date.
437 *)
3791df1 @andrenth Renaming library back to Milter
authored
438 dep ["link"; "ocaml"; "program"; tag_libstubs lib]
439 [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
440
441 dep ["compile"; "ocaml"; "program"; tag_libstubs lib]
442 [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
443
612a479 @andrenth libmilter bindings
authored
444 (* TODO: be more specific about what depends on headers *)
445 (* Depends on .h files *)
446 dep ["compile"; "c"]
447 headers;
3791df1 @andrenth Renaming library back to Milter
authored
448
612a479 @andrenth libmilter bindings
authored
449 (* Setup search path for lib *)
450 flag ["link"; "ocaml"; "use_"^lib]
451 (S[A"-I"; P(dir)]);
452 )
453 t.lib_c;
3791df1 @andrenth Renaming library back to Milter
authored
454
612a479 @andrenth libmilter bindings
authored
455 (* Add flags *)
456 List.iter
457 (fun (tags, cond_specs) ->
458 let spec =
459 BaseEnvLight.var_choose cond_specs env
460 in
461 flag tags & spec)
462 t.flags
463 | _ ->
464 ()
3791df1 @andrenth Renaming library back to Milter
authored
465
612a479 @andrenth libmilter bindings
authored
466 let dispatch_default t =
467 dispatch_combine
468 [
469 dispatch t;
470 MyOCamlbuildFindlib.dispatch;
471 ]
3791df1 @andrenth Renaming library back to Milter
authored
472
612a479 @andrenth libmilter bindings
authored
473 end
474
475
3791df1 @andrenth Renaming library back to Milter
authored
476 # 476 "myocamlbuild.ml"
612a479 @andrenth libmilter bindings
authored
477 open Ocamlbuild_plugin;;
478 let package_default =
479 {
3791df1 @andrenth Renaming library back to Milter
authored
480 MyOCamlbuildBase.lib_ocaml = [("milter", ["lib"])];
481 lib_c = [("milter", "lib", [])];
612a479 @andrenth libmilter bindings
authored
482 flags =
483 [
3791df1 @andrenth Renaming library back to Milter
authored
484 (["oasis_library_milter_ccopt"; "compile"],
612a479 @andrenth libmilter bindings
authored
485 [
486 (OASISExpr.EBool true,
487 S [A "-ccopt"; A "-Wall"; A "-ccopt"; A "-Werror"])
488 ]);
3791df1 @andrenth Renaming library back to Milter
authored
489 (["oasis_library_milter_cclib"; "link"],
612a479 @andrenth libmilter bindings
authored
490 [
491 (OASISExpr.EBool true,
492 S
493 [
494 A "-cclib";
495 A "-L/usr/lib/libmilter";
496 A "-cclib";
497 A "-lmilter"
498 ])
499 ]);
3791df1 @andrenth Renaming library back to Milter
authored
500 (["oasis_library_milter_cclib"; "ocamlmklib"; "c"],
612a479 @andrenth libmilter bindings
authored
501 [
502 (OASISExpr.EBool true,
503 S [A "-L/usr/lib/libmilter"; A "-lmilter"])
504 ])
505 ];
3791df1 @andrenth Renaming library back to Milter
authored
506 includes = [];
612a479 @andrenth libmilter bindings
authored
507 }
508 ;;
509
510 let dispatch_default = MyOCamlbuildBase.dispatch_default package_default;;
511
3791df1 @andrenth Renaming library back to Milter
authored
512 # 513 "myocamlbuild.ml"
612a479 @andrenth libmilter bindings
authored
513 (* OASIS_STOP *)
514 Ocamlbuild_plugin.dispatch dispatch_default;;
Something went wrong with that request. Please try again.