diff options
Diffstat (limited to 'ocaml-binary-annot/camlp4/mkcamlp4.ml')
| -rw-r--r-- | ocaml-binary-annot/camlp4/mkcamlp4.ml | 70 |
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 }; |
