71 lines
2.8 KiB
OCaml
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 };
|