ocaml/camlp4/mkcamlp4.ml

71 lines
2.8 KiB
OCaml

(****************************************************************************)
(* *)
(* OCaml *)
(* *)
(* INRIA Rocquencourt *)
(* *)
(* Copyright 2006 Institut National de Recherche en Informatique et *)
(* en Automatique. All rights reserved. This file is distributed under *)
(* the terms of the GNU Library General Public License, with the special *)
(* exception on linking described in LICENSE at the top of the OCaml *)
(* source tree. *)
(* *)
(****************************************************************************)
(* Authors:
* - Daniel de Rauglaudre: initial shell version
* - Nicolas Pouillard: rewriting in OCaml
*)
open Camlp4;
open Camlp4_config;
open Filename;
open Format;
value (interfaces, options, includes) =
let rec self (interf, opts, incl) =
fun
[ [] -> (List.rev interf, List.rev opts, List.rev incl)
| ["-I"; dir :: args] -> self (interf, opts, [dir; "-I" :: incl]) args
| ["-version" :: _] ->
do { printf "mkcamlp4, version %s@." version; exit 0 }
| ["-vnum" :: _] ->
do { printf "%s@." version; exit 0 }
| [ arg :: args ] when check_suffix arg ".cmi" ->
let basename = String.capitalize (Filename.chop_suffix
(Filename.basename arg) ".cmi") in
self ([ basename :: interf ], opts, incl) args
| [ arg :: args ] ->
self (interf, [ arg :: opts ], incl) args ]
in self ([], [], ["."; "-I"]) (List.tl (Array.to_list Sys.argv));
value run l =
let cmd = String.concat " " l in
let () = Format.printf "%s@." cmd in
let st =
Sys.command cmd
(* 0 *)
in
if st <> 0 then failwith ("Exit: " ^ string_of_int st) else ();
value crc_ml = Filename.temp_file "crc_" ".ml";
value crc = Filename.chop_suffix crc_ml ".ml";
value clean () = run ["rm"; "-f"; crc_ml; crc^".cmi"; crc^".cmo"];
try do {
run ([ocaml_standard_library^"/extract_crc"; "-I"; camlp4_standard_library]
@ includes @ interfaces @ [">"; crc_ml]);
let cout = open_out_gen [Open_wronly; Open_append; Open_text] 0o666 crc_ml in do {
output_string cout "let _ = Dynlink.add_available_units crc_unit_list\n";
close_out cout
};
run (["ocamlc"; "-I"; camlp4_standard_library; "dynlink.cma"; "camlp4lib.cma"; crc_ml]
@ includes @ options @ ["Camlp4Bin.cmo"; "-linkall"]);
clean();
}
with exc -> do { clean (); raise exc };