myocamlbuild.ml 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. (* OASIS_START *)
  2. (* DO NOT EDIT (digest: a02f38e3e2213d6985da0d03d4f432d7) *)
  3. module OASISGettext = struct
  4. (* # 22 "src/oasis/OASISGettext.ml" *)
  5. let ns_ str =
  6. str
  7. let s_ str =
  8. str
  9. let f_ (str: ('a, 'b, 'c, 'd) format4) =
  10. str
  11. let fn_ fmt1 fmt2 n =
  12. if n = 1 then
  13. fmt1^^""
  14. else
  15. fmt2^^""
  16. let init =
  17. []
  18. end
  19. module OASISString = struct
  20. (* # 22 "src/oasis/OASISString.ml" *)
  21. (** Various string utilities.
  22. Mostly inspired by extlib and batteries ExtString and BatString libraries.
  23. @author Sylvain Le Gall
  24. *)
  25. let nsplitf str f =
  26. if str = "" then
  27. []
  28. else
  29. let buf = Buffer.create 13 in
  30. let lst = ref [] in
  31. let push () =
  32. lst := Buffer.contents buf :: !lst;
  33. Buffer.clear buf
  34. in
  35. let str_len = String.length str in
  36. for i = 0 to str_len - 1 do
  37. if f str.[i] then
  38. push ()
  39. else
  40. Buffer.add_char buf str.[i]
  41. done;
  42. push ();
  43. List.rev !lst
  44. (** [nsplit c s] Split the string [s] at char [c]. It doesn't include the
  45. separator.
  46. *)
  47. let nsplit str c =
  48. nsplitf str ((=) c)
  49. let find ~what ?(offset=0) str =
  50. let what_idx = ref 0 in
  51. let str_idx = ref offset in
  52. while !str_idx < String.length str &&
  53. !what_idx < String.length what do
  54. if str.[!str_idx] = what.[!what_idx] then
  55. incr what_idx
  56. else
  57. what_idx := 0;
  58. incr str_idx
  59. done;
  60. if !what_idx <> String.length what then
  61. raise Not_found
  62. else
  63. !str_idx - !what_idx
  64. let sub_start str len =
  65. let str_len = String.length str in
  66. if len >= str_len then
  67. ""
  68. else
  69. String.sub str len (str_len - len)
  70. let sub_end ?(offset=0) str len =
  71. let str_len = String.length str in
  72. if len >= str_len then
  73. ""
  74. else
  75. String.sub str 0 (str_len - len)
  76. let starts_with ~what ?(offset=0) str =
  77. let what_idx = ref 0 in
  78. let str_idx = ref offset in
  79. let ok = ref true in
  80. while !ok &&
  81. !str_idx < String.length str &&
  82. !what_idx < String.length what do
  83. if str.[!str_idx] = what.[!what_idx] then
  84. incr what_idx
  85. else
  86. ok := false;
  87. incr str_idx
  88. done;
  89. if !what_idx = String.length what then
  90. true
  91. else
  92. false
  93. let strip_starts_with ~what str =
  94. if starts_with ~what str then
  95. sub_start str (String.length what)
  96. else
  97. raise Not_found
  98. let ends_with ~what ?(offset=0) str =
  99. let what_idx = ref ((String.length what) - 1) in
  100. let str_idx = ref ((String.length str) - 1) in
  101. let ok = ref true in
  102. while !ok &&
  103. offset <= !str_idx &&
  104. 0 <= !what_idx do
  105. if str.[!str_idx] = what.[!what_idx] then
  106. decr what_idx
  107. else
  108. ok := false;
  109. decr str_idx
  110. done;
  111. if !what_idx = -1 then
  112. true
  113. else
  114. false
  115. let strip_ends_with ~what str =
  116. if ends_with ~what str then
  117. sub_end str (String.length what)
  118. else
  119. raise Not_found
  120. let replace_chars f s =
  121. let buf = Buffer.create (String.length s) in
  122. String.iter (fun c -> Buffer.add_char buf (f c)) s;
  123. Buffer.contents buf
  124. let lowercase_ascii =
  125. replace_chars
  126. (fun c ->
  127. if (c >= 'A' && c <= 'Z') then
  128. Char.chr (Char.code c + 32)
  129. else
  130. c)
  131. let uncapitalize_ascii s =
  132. if s <> "" then
  133. (lowercase_ascii (String.sub s 0 1)) ^ (String.sub s 1 ((String.length s) - 1))
  134. else
  135. s
  136. let uppercase_ascii =
  137. replace_chars
  138. (fun c ->
  139. if (c >= 'a' && c <= 'z') then
  140. Char.chr (Char.code c - 32)
  141. else
  142. c)
  143. let capitalize_ascii s =
  144. if s <> "" then
  145. (uppercase_ascii (String.sub s 0 1)) ^ (String.sub s 1 ((String.length s) - 1))
  146. else
  147. s
  148. end
  149. module OASISExpr = struct
  150. (* # 22 "src/oasis/OASISExpr.ml" *)
  151. open OASISGettext
  152. type test = string
  153. type flag = string
  154. type t =
  155. | EBool of bool
  156. | ENot of t
  157. | EAnd of t * t
  158. | EOr of t * t
  159. | EFlag of flag
  160. | ETest of test * string
  161. type 'a choices = (t * 'a) list
  162. let eval var_get t =
  163. let rec eval' =
  164. function
  165. | EBool b ->
  166. b
  167. | ENot e ->
  168. not (eval' e)
  169. | EAnd (e1, e2) ->
  170. (eval' e1) && (eval' e2)
  171. | EOr (e1, e2) ->
  172. (eval' e1) || (eval' e2)
  173. | EFlag nm ->
  174. let v =
  175. var_get nm
  176. in
  177. assert(v = "true" || v = "false");
  178. (v = "true")
  179. | ETest (nm, vl) ->
  180. let v =
  181. var_get nm
  182. in
  183. (v = vl)
  184. in
  185. eval' t
  186. let choose ?printer ?name var_get lst =
  187. let rec choose_aux =
  188. function
  189. | (cond, vl) :: tl ->
  190. if eval var_get cond then
  191. vl
  192. else
  193. choose_aux tl
  194. | [] ->
  195. let str_lst =
  196. if lst = [] then
  197. s_ "<empty>"
  198. else
  199. String.concat
  200. (s_ ", ")
  201. (List.map
  202. (fun (cond, vl) ->
  203. match printer with
  204. | Some p -> p vl
  205. | None -> s_ "<no printer>")
  206. lst)
  207. in
  208. match name with
  209. | Some nm ->
  210. failwith
  211. (Printf.sprintf
  212. (f_ "No result for the choice list '%s': %s")
  213. nm str_lst)
  214. | None ->
  215. failwith
  216. (Printf.sprintf
  217. (f_ "No result for a choice list: %s")
  218. str_lst)
  219. in
  220. choose_aux (List.rev lst)
  221. end
  222. # 292 "myocamlbuild.ml"
  223. module BaseEnvLight = struct
  224. (* # 22 "src/base/BaseEnvLight.ml" *)
  225. module MapString = Map.Make(String)
  226. type t = string MapString.t
  227. let default_filename =
  228. Filename.concat
  229. (Sys.getcwd ())
  230. "setup.data"
  231. let load ?(allow_empty=false) ?(filename=default_filename) () =
  232. if Sys.file_exists filename then
  233. begin
  234. let chn =
  235. open_in_bin filename
  236. in
  237. let st =
  238. Stream.of_channel chn
  239. in
  240. let line =
  241. ref 1
  242. in
  243. let st_line =
  244. Stream.from
  245. (fun _ ->
  246. try
  247. match Stream.next st with
  248. | '\n' -> incr line; Some '\n'
  249. | c -> Some c
  250. with Stream.Failure -> None)
  251. in
  252. let lexer =
  253. Genlex.make_lexer ["="] st_line
  254. in
  255. let rec read_file mp =
  256. match Stream.npeek 3 lexer with
  257. | [Genlex.Ident nm; Genlex.Kwd "="; Genlex.String value] ->
  258. Stream.junk lexer;
  259. Stream.junk lexer;
  260. Stream.junk lexer;
  261. read_file (MapString.add nm value mp)
  262. | [] ->
  263. mp
  264. | _ ->
  265. failwith
  266. (Printf.sprintf
  267. "Malformed data file '%s' line %d"
  268. filename !line)
  269. in
  270. let mp =
  271. read_file MapString.empty
  272. in
  273. close_in chn;
  274. mp
  275. end
  276. else if allow_empty then
  277. begin
  278. MapString.empty
  279. end
  280. else
  281. begin
  282. failwith
  283. (Printf.sprintf
  284. "Unable to load environment, the file '%s' doesn't exist."
  285. filename)
  286. end
  287. let rec var_expand str env =
  288. let buff =
  289. Buffer.create ((String.length str) * 2)
  290. in
  291. Buffer.add_substitute
  292. buff
  293. (fun var ->
  294. try
  295. var_expand (MapString.find var env) env
  296. with Not_found ->
  297. failwith
  298. (Printf.sprintf
  299. "No variable %s defined when trying to expand %S."
  300. var
  301. str))
  302. str;
  303. Buffer.contents buff
  304. let var_get name env =
  305. var_expand (MapString.find name env) env
  306. let var_choose lst env =
  307. OASISExpr.choose
  308. (fun nm -> var_get nm env)
  309. lst
  310. end
  311. # 397 "myocamlbuild.ml"
  312. module MyOCamlbuildFindlib = struct
  313. (* # 22 "src/plugins/ocamlbuild/MyOCamlbuildFindlib.ml" *)
  314. (** OCamlbuild extension, copied from
  315. * http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuild
  316. * by N. Pouillard and others
  317. *
  318. * Updated on 2009/02/28
  319. *
  320. * Modified by Sylvain Le Gall
  321. *)
  322. open Ocamlbuild_plugin
  323. type conf =
  324. { no_automatic_syntax: bool;
  325. }
  326. (* these functions are not really officially exported *)
  327. let run_and_read =
  328. Ocamlbuild_pack.My_unix.run_and_read
  329. let blank_sep_strings =
  330. Ocamlbuild_pack.Lexers.blank_sep_strings
  331. let exec_from_conf exec =
  332. let exec =
  333. let env_filename = Pathname.basename BaseEnvLight.default_filename in
  334. let env = BaseEnvLight.load ~filename:env_filename ~allow_empty:true () in
  335. try
  336. BaseEnvLight.var_get exec env
  337. with Not_found ->
  338. Printf.eprintf "W: Cannot get variable %s\n" exec;
  339. exec
  340. in
  341. let fix_win32 str =
  342. if Sys.os_type = "Win32" then begin
  343. let buff = Buffer.create (String.length str) in
  344. (* Adapt for windowsi, ocamlbuild + win32 has a hard time to handle '\\'.
  345. *)
  346. String.iter
  347. (fun c -> Buffer.add_char buff (if c = '\\' then '/' else c))
  348. str;
  349. Buffer.contents buff
  350. end else begin
  351. str
  352. end
  353. in
  354. fix_win32 exec
  355. let split s ch =
  356. let buf = Buffer.create 13 in
  357. let x = ref [] in
  358. let flush () =
  359. x := (Buffer.contents buf) :: !x;
  360. Buffer.clear buf
  361. in
  362. String.iter
  363. (fun c ->
  364. if c = ch then
  365. flush ()
  366. else
  367. Buffer.add_char buf c)
  368. s;
  369. flush ();
  370. List.rev !x
  371. let split_nl s = split s '\n'
  372. let before_space s =
  373. try
  374. String.before s (String.index s ' ')
  375. with Not_found -> s
  376. (* ocamlfind command *)
  377. let ocamlfind x = S[Sh (exec_from_conf "ocamlfind"); x]
  378. (* This lists all supported packages. *)
  379. let find_packages () =
  380. List.map before_space (split_nl & run_and_read (exec_from_conf "ocamlfind" ^ " list"))
  381. (* Mock to list available syntaxes. *)
  382. let find_syntaxes () = ["camlp4o"; "camlp4r"]
  383. let well_known_syntax = [
  384. "camlp4.quotations.o";
  385. "camlp4.quotations.r";
  386. "camlp4.exceptiontracer";
  387. "camlp4.extend";
  388. "camlp4.foldgenerator";
  389. "camlp4.listcomprehension";
  390. "camlp4.locationstripper";
  391. "camlp4.macro";
  392. "camlp4.mapgenerator";
  393. "camlp4.metagenerator";
  394. "camlp4.profiler";
  395. "camlp4.tracer"
  396. ]
  397. let dispatch conf =
  398. function
  399. | After_options ->
  400. (* By using Before_options one let command line options have an higher
  401. * priority on the contrary using After_options will guarantee to have
  402. * the higher priority override default commands by ocamlfind ones *)
  403. Options.ocamlc := ocamlfind & A"ocamlc";
  404. Options.ocamlopt := ocamlfind & A"ocamlopt";
  405. Options.ocamldep := ocamlfind & A"ocamldep";
  406. Options.ocamldoc := ocamlfind & A"ocamldoc";
  407. Options.ocamlmktop := ocamlfind & A"ocamlmktop";
  408. Options.ocamlmklib := ocamlfind & A"ocamlmklib"
  409. | After_rules ->
  410. (* When one link an OCaml library/binary/package, one should use
  411. * -linkpkg *)
  412. flag ["ocaml"; "link"; "program"] & A"-linkpkg";
  413. if not (conf.no_automatic_syntax) then begin
  414. (* For each ocamlfind package one inject the -package option when
  415. * compiling, computing dependencies, generating documentation and
  416. * linking. *)
  417. List.iter
  418. begin fun pkg ->
  419. let base_args = [A"-package"; A pkg] in
  420. (* TODO: consider how to really choose camlp4o or camlp4r. *)
  421. let syn_args = [A"-syntax"; A "camlp4o"] in
  422. let (args, pargs) =
  423. (* Heuristic to identify syntax extensions: whether they end in
  424. ".syntax"; some might not.
  425. *)
  426. if Filename.check_suffix pkg "syntax" ||
  427. List.mem pkg well_known_syntax then
  428. (syn_args @ base_args, syn_args)
  429. else
  430. (base_args, [])
  431. in
  432. flag ["ocaml"; "compile"; "pkg_"^pkg] & S args;
  433. flag ["ocaml"; "ocamldep"; "pkg_"^pkg] & S args;
  434. flag ["ocaml"; "doc"; "pkg_"^pkg] & S args;
  435. flag ["ocaml"; "link"; "pkg_"^pkg] & S base_args;
  436. flag ["ocaml"; "infer_interface"; "pkg_"^pkg] & S args;
  437. (* TODO: Check if this is allowed for OCaml < 3.12.1 *)
  438. flag ["ocaml"; "compile"; "package("^pkg^")"] & S pargs;
  439. flag ["ocaml"; "ocamldep"; "package("^pkg^")"] & S pargs;
  440. flag ["ocaml"; "doc"; "package("^pkg^")"] & S pargs;
  441. flag ["ocaml"; "infer_interface"; "package("^pkg^")"] & S pargs;
  442. end
  443. (find_packages ());
  444. end;
  445. (* Like -package but for extensions syntax. Morover -syntax is useless
  446. * when linking. *)
  447. List.iter begin fun syntax ->
  448. flag ["ocaml"; "compile"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
  449. flag ["ocaml"; "ocamldep"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
  450. flag ["ocaml"; "doc"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
  451. flag ["ocaml"; "infer_interface"; "syntax_"^syntax] &
  452. S[A"-syntax"; A syntax];
  453. end (find_syntaxes ());
  454. (* The default "thread" tag is not compatible with ocamlfind.
  455. * Indeed, the default rules add the "threads.cma" or "threads.cmxa"
  456. * options when using this tag. When using the "-linkpkg" option with
  457. * ocamlfind, this module will then be added twice on the command line.
  458. *
  459. * To solve this, one approach is to add the "-thread" option when using
  460. * the "threads" package using the previous plugin.
  461. *)
  462. flag ["ocaml"; "pkg_threads"; "compile"] (S[A "-thread"]);
  463. flag ["ocaml"; "pkg_threads"; "doc"] (S[A "-I"; A "+threads"]);
  464. flag ["ocaml"; "pkg_threads"; "link"] (S[A "-thread"]);
  465. flag ["ocaml"; "pkg_threads"; "infer_interface"] (S[A "-thread"]);
  466. flag ["ocaml"; "package(threads)"; "compile"] (S[A "-thread"]);
  467. flag ["ocaml"; "package(threads)"; "doc"] (S[A "-I"; A "+threads"]);
  468. flag ["ocaml"; "package(threads)"; "link"] (S[A "-thread"]);
  469. flag ["ocaml"; "package(threads)"; "infer_interface"] (S[A "-thread"]);
  470. | _ ->
  471. ()
  472. end
  473. module MyOCamlbuildBase = struct
  474. (* # 22 "src/plugins/ocamlbuild/MyOCamlbuildBase.ml" *)
  475. (** Base functions for writing myocamlbuild.ml
  476. @author Sylvain Le Gall
  477. *)
  478. open Ocamlbuild_plugin
  479. module OC = Ocamlbuild_pack.Ocaml_compiler
  480. type dir = string
  481. type file = string
  482. type name = string
  483. type tag = string
  484. (* # 62 "src/plugins/ocamlbuild/MyOCamlbuildBase.ml" *)
  485. type t =
  486. {
  487. lib_ocaml: (name * dir list * string list) list;
  488. lib_c: (name * dir * file list) list;
  489. flags: (tag list * (spec OASISExpr.choices)) list;
  490. (* Replace the 'dir: include' from _tags by a precise interdepends in
  491. * directory.
  492. *)
  493. includes: (dir * dir list) list;
  494. }
  495. let env_filename =
  496. Pathname.basename
  497. BaseEnvLight.default_filename
  498. let dispatch_combine lst =
  499. fun e ->
  500. List.iter
  501. (fun dispatch -> dispatch e)
  502. lst
  503. let tag_libstubs nm =
  504. "use_lib"^nm^"_stubs"
  505. let nm_libstubs nm =
  506. nm^"_stubs"
  507. let dispatch t e =
  508. let env =
  509. BaseEnvLight.load
  510. ~filename:env_filename
  511. ~allow_empty:true
  512. ()
  513. in
  514. match e with
  515. | Before_options ->
  516. let no_trailing_dot s =
  517. if String.length s >= 1 && s.[0] = '.' then
  518. String.sub s 1 ((String.length s) - 1)
  519. else
  520. s
  521. in
  522. List.iter
  523. (fun (opt, var) ->
  524. try
  525. opt := no_trailing_dot (BaseEnvLight.var_get var env)
  526. with Not_found ->
  527. Printf.eprintf "W: Cannot get variable %s\n" var)
  528. [
  529. Options.ext_obj, "ext_obj";
  530. Options.ext_lib, "ext_lib";
  531. Options.ext_dll, "ext_dll";
  532. ]
  533. | After_rules ->
  534. (* Declare OCaml libraries *)
  535. List.iter
  536. (function
  537. | nm, [], intf_modules ->
  538. ocaml_lib nm;
  539. let cmis =
  540. List.map (fun m -> (OASISString.uncapitalize_ascii m) ^ ".cmi")
  541. intf_modules in
  542. dep ["ocaml"; "link"; "library"; "file:"^nm^".cma"] cmis
  543. | nm, dir :: tl, intf_modules ->
  544. ocaml_lib ~dir:dir (dir^"/"^nm);
  545. List.iter
  546. (fun dir ->
  547. List.iter
  548. (fun str ->
  549. flag ["ocaml"; "use_"^nm; str] (S[A"-I"; P dir]))
  550. ["compile"; "infer_interface"; "doc"])
  551. tl;
  552. let cmis =
  553. List.map (fun m -> dir^"/"^(OASISString.uncapitalize_ascii m)^".cmi")
  554. intf_modules in
  555. dep ["ocaml"; "link"; "library"; "file:"^dir^"/"^nm^".cma"]
  556. cmis)
  557. t.lib_ocaml;
  558. (* Declare directories dependencies, replace "include" in _tags. *)
  559. List.iter
  560. (fun (dir, include_dirs) ->
  561. Pathname.define_context dir include_dirs)
  562. t.includes;
  563. (* Declare C libraries *)
  564. List.iter
  565. (fun (lib, dir, headers) ->
  566. (* Handle C part of library *)
  567. flag ["link"; "library"; "ocaml"; "byte"; tag_libstubs lib]
  568. (S[A"-dllib"; A("-l"^(nm_libstubs lib)); A"-cclib";
  569. A("-l"^(nm_libstubs lib))]);
  570. flag ["link"; "library"; "ocaml"; "native"; tag_libstubs lib]
  571. (S[A"-cclib"; A("-l"^(nm_libstubs lib))]);
  572. flag ["link"; "program"; "ocaml"; "byte"; tag_libstubs lib]
  573. (S[A"-dllib"; A("dll"^(nm_libstubs lib))]);
  574. (* When ocaml link something that use the C library, then one
  575. need that file to be up to date.
  576. This holds both for programs and for libraries.
  577. *)
  578. dep ["link"; "ocaml"; tag_libstubs lib]
  579. [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
  580. dep ["compile"; "ocaml"; tag_libstubs lib]
  581. [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
  582. (* TODO: be more specific about what depends on headers *)
  583. (* Depends on .h files *)
  584. dep ["compile"; "c"]
  585. headers;
  586. (* Setup search path for lib *)
  587. flag ["link"; "ocaml"; "use_"^lib]
  588. (S[A"-I"; P(dir)]);
  589. )
  590. t.lib_c;
  591. (* Add flags *)
  592. List.iter
  593. (fun (tags, cond_specs) ->
  594. let spec = BaseEnvLight.var_choose cond_specs env in
  595. let rec eval_specs =
  596. function
  597. | S lst -> S (List.map eval_specs lst)
  598. | A str -> A (BaseEnvLight.var_expand str env)
  599. | spec -> spec
  600. in
  601. flag tags & (eval_specs spec))
  602. t.flags
  603. | _ ->
  604. ()
  605. let dispatch_default conf t =
  606. dispatch_combine
  607. [
  608. dispatch t;
  609. MyOCamlbuildFindlib.dispatch conf;
  610. ]
  611. end
  612. # 766 "myocamlbuild.ml"
  613. open Ocamlbuild_plugin;;
  614. let package_default =
  615. {
  616. MyOCamlbuildBase.lib_ocaml = [];
  617. lib_c = [];
  618. flags = [];
  619. includes = [("src/test", ["src"]); ("src", ["src/test"])]
  620. }
  621. ;;
  622. let conf = {MyOCamlbuildFindlib.no_automatic_syntax = false}
  623. let dispatch_default = MyOCamlbuildBase.dispatch_default conf package_default;;
  624. # 782 "myocamlbuild.ml"
  625. (* OASIS_STOP *)
  626. Ocamlbuild_plugin.dispatch dispatch_default;;