summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/camlp4/mkcamlp4.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/camlp4/mkcamlp4.ml')
-rw-r--r--ocaml-binary-annot/camlp4/mkcamlp4.ml70
1 files changed, 70 insertions, 0 deletions
diff --git a/ocaml-binary-annot/camlp4/mkcamlp4.ml b/ocaml-binary-annot/camlp4/mkcamlp4.ml
new file mode 100644
index 0000000000..6c6b4b245f
--- /dev/null
+++ b/ocaml-binary-annot/camlp4/mkcamlp4.ml
@@ -0,0 +1,70 @@
+(****************************************************************************)
+(* *)
+(* Objective Caml *)
+(* *)
+(* 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 Objective *)
+(* Caml 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; "camlp4lib.cma"; crc_ml]
+ @ includes @ options @ ["Camlp4Bin.cmo"; "-linkall"]);
+ clean();
+}
+with exc -> do { clean (); raise exc };