summaryrefslogtreecommitdiff
path: root/tools/ocamlmklib.mlp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ocamlmklib.mlp')
-rw-r--r--tools/ocamlmklib.mlp250
1 files changed, 0 insertions, 250 deletions
diff --git a/tools/ocamlmklib.mlp b/tools/ocamlmklib.mlp
deleted file mode 100644
index 27eecccbc3..0000000000
--- a/tools/ocamlmklib.mlp
+++ /dev/null
@@ -1,250 +0,0 @@
-(***********************************************************************)
-(* *)
-(* Objective Caml *)
-(* *)
-(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *)
-(* *)
-(* Copyright 2001 Institut National de Recherche en Informatique et *)
-(* en Automatique. All rights reserved. This file is distributed *)
-(* under the terms of the Q Public License version 1.0. *)
-(* *)
-(***********************************************************************)
-
-(* $Id$ *)
-
-open Printf
-
-let bindir = "%%BINDIR%%"
-and supports_shared_libraries = %%SUPPORTS_SHARED_LIBRARIES%%
-and mksharedlib = "%%MKSHAREDLIB%%"
-and bytecc_rpath = "%%BYTECCRPATH%%"
-and nativecc_rpath = "%%NATIVECCRPATH%%"
-and mksharedlib_rpath = "%%MKSHAREDLIBRPATH%%"
-and ranlib = "%%RANLIB%%"
-
-let bytecode_objs = ref [] (* .cmo,.cma,.ml,.mli files to pass to ocamlc *)
-and native_objs = ref [] (* .cmx,.cmxa,.ml,.mli files to pass to ocamlopt *)
-and c_objs = ref [] (* .o, .a files to pass to mksharedlib and ar *)
-and caml_libs = ref [] (* -cclib to pass to ocamlc, ocamlopt *)
-and caml_opts = ref [] (* -ccopt to pass to ocamlc, ocamlopt *)
-and dynlink = ref supports_shared_libraries
-and failsafe = ref false (* whether to fall back on static build only *)
-and c_libs = ref [] (* libs to pass to mksharedlib and ocamlc -cclib *)
-and c_opts = ref [] (* options to pass to mksharedlib and ocamlc -ccopt *)
-and ld_opts = ref [] (* options to pass only to the linker *)
-and ocamlc = ref (Filename.concat bindir "ocamlc")
-and ocamlopt = ref (Filename.concat bindir "ocamlopt")
-and output = ref "a" (* Output name for Caml part of library *)
-and output_c = ref "" (* Output name for C part of library *)
-and rpath = ref [] (* rpath options *)
-and verbose = ref false
-
-let starts_with s pref =
- String.length s >= String.length pref &&
- String.sub s 0 (String.length pref) = pref
-let ends_with = Filename.check_suffix
-let chop_prefix s pref =
- String.sub s (String.length pref) (String.length s - String.length pref)
-let chop_suffix = Filename.chop_suffix
-
-exception Bad_argument of string
-
-let parse_arguments argv =
- let i = ref 1 in
- let next_arg () =
- if !i + 1 >= Array.length argv
- then raise (Bad_argument("Option " ^ argv.(!i) ^ " expects one argument"));
- incr i; argv.(!i) in
- while !i < Array.length argv do
- let s = argv.(!i) in
- if ends_with s ".cmo" || ends_with s ".cma" then
- bytecode_objs := s :: !bytecode_objs
- else if ends_with s ".cmx" || ends_with s ".cmxa" then
- native_objs := s :: !native_objs
- else if ends_with s ".ml" || ends_with s ".mli" then
- (bytecode_objs := s :: !bytecode_objs;
- native_objs := s :: !native_objs)
- else if ends_with s ".o" || ends_with s ".a" then
- c_objs := s :: !c_objs
- else if s = "-cclib" then
- caml_libs := next_arg () :: "-cclib" :: !caml_libs
- else if s = "-ccopt" then
- caml_opts := next_arg () :: "-ccopt" :: !caml_opts
- else if s = "-custom" then
- dynlink := false
- else if s = "-I" then
- caml_opts := next_arg () :: "-I" :: !caml_opts
- else if s = "-failsafe" then
- failsafe := true
- else if s = "-h" || s = "-help" then
- raise (Bad_argument "")
- else if s = "-ldopt" then
- ld_opts := next_arg () :: !ld_opts
- else if s = "-linkall" then
- caml_opts := s :: !caml_opts
- else if starts_with s "-l" then
- c_libs := s :: !c_libs
- else if starts_with s "-L" then
- (c_opts := s :: !c_opts;
- let l = chop_prefix s "-L" in
- if not (Filename.is_relative l) then rpath := l :: !rpath)
- else if s = "-ocamlc" then
- ocamlc := next_arg ()
- else if s = "-ocamlopt" then
- ocamlopt := next_arg ()
- else if s = "-o" then
- output := next_arg()
- else if s = "-oc" then
- output_c := next_arg()
- else if s = "-dllpath" || s = "-R" || s = "-rpath" then
- rpath := next_arg() :: !rpath
- else if starts_with s "-R" then
- rpath := chop_prefix s "-R" :: !rpath
- else if s = "-Wl,-rpath" then
- (let a = next_arg() in
- if starts_with a "-Wl,"
- then rpath := chop_prefix a "-Wl," :: !rpath
- else raise (Bad_argument("Option -Wl,-rpath expects a -Wl, argument")))
- else if starts_with s "-Wl,-rpath," then
- rpath := chop_prefix s "-Wl,-rpath," :: !rpath
- else if starts_with s "-Wl,-R" then
- rpath := chop_prefix s "-Wl,-R" :: !rpath
- else if s = "-v" || s = "-verbose" then
- verbose := true
- else if starts_with s "-F" then
- c_opts := s :: !c_opts
- else if s = "-framework" then
- (let a = next_arg() in c_opts := a :: s :: !c_opts)
- else if starts_with s "-" then
- prerr_endline ("Unknown option " ^ s)
- else
- raise (Bad_argument("Don't know what to do with " ^ s));
- incr i
- done;
- List.iter
- (fun r -> r := List.rev !r)
- [ bytecode_objs; native_objs; c_objs; caml_libs; caml_opts;
- c_libs; c_objs; c_opts; ld_opts; rpath ];
- if !output_c = "" then output_c := !output
-
-let usage = "\
-Usage: ocamlmklib [options] <.cmo|.cma|.cmx|.cmxa|.ml|.mli|.o|.a files>
-Options are:
- -cclib <lib> C library passed to ocamlc -a or ocamlopt -a only
- -ccopt <opt> C option passed to ocamlc -a or ocamlopt -a only
- -custom disable dynamic loading
- -dllpath <dir> Add <dir> to the run-time search path for DLLs
- -I <dir> Add <dir> to the path searched for Caml object files
- -failsafe fall back to static linking if DLL construction failed
- -ldopt <opt> C option passed to the shared linker only
- -linkall Build Caml archive with link-all behavior
- -l<lib> Specify a dependent C library
- -L<dir> Add <dir> to the path searched for C libraries
- -ocamlc <cmd> Use <cmd> in place of \"ocamlc\"
- -ocamlopt <cmd> Use <cmd> in place of \"ocamlopt\"
- -o <name> Generated Caml library is named <name>.cma or <name>.cmxa
- -oc <name> Generated C library is named lib<name>.so or lib<name>.a
- -rpath <dir> Same as -dllpath <dir>
- -R<dir> Same as -rpath
- -verbose Print commands before executing them
- -Wl,-rpath,<dir> Same as -dllpath <dir>
- -Wl,-rpath -Wl,<dir> Same as -dllpath <dir>
- -Wl,-R<dir> Same as -dllpath <dir>
- -F<dir> Specify a framework directory (MacOSX)
- -framework <name> Use framework <name> (MacOSX)
-"
-
-let command cmd =
- if !verbose then (print_string "+ "; print_string cmd; print_newline());
- Sys.command cmd
-
-let scommand cmd =
- if command cmd <> 0 then exit 2
-
-let safe_remove s =
- try Sys.remove s with Sys_error _ -> ()
-
-let make_set l =
- let rec merge l = function
- [] -> List.rev l
- | p :: r -> if List.mem p l then merge l r else merge (p::l) r
- in
- merge [] l
-
-let make_rpath flag =
- if !rpath = [] || flag = ""
- then ""
- else flag ^ String.concat ":" (make_set !rpath)
-
-let make_rpath_ccopt flag =
- if !rpath = [] || flag = ""
- then ""
- else "-ccopt " ^ flag ^ String.concat ":" (make_set !rpath)
-
-let prefix_list pref l =
- List.map (fun s -> pref ^ s) l
-
-let build_libs () =
- if !c_objs <> [] then begin
- if !dynlink then begin
- let retcode = command
- (sprintf "%s dll%s.so %s %s %s %s %s"
- mksharedlib
- !output_c
- (String.concat " " !c_objs)
- (String.concat " " !c_opts)
- (String.concat " " !ld_opts)
- (make_rpath mksharedlib_rpath)
- (String.concat " " !c_libs)) in
- if retcode <> 0 then if !failsafe then dynlink := false else exit 2
- end;
- safe_remove ("lib" ^ !output_c ^ ".a");
- scommand
- (sprintf "ar rc lib%s.a %s"
- !output_c
- (String.concat " " !c_objs));
- scommand
- (sprintf "%s lib%s.a"
- ranlib
- !output_c)
- end;
- if !bytecode_objs <> [] then
- scommand
- (sprintf "%s -a %s -o %s.cma %s %s -dllib -l%s -cclib -l%s %s %s %s %s"
- !ocamlc
- (if !dynlink then "" else "-custom")
- !output
- (String.concat " " !caml_opts)
- (String.concat " " !bytecode_objs)
- !output_c
- !output_c
- (String.concat " " (prefix_list "-ccopt " !c_opts))
- (make_rpath_ccopt bytecc_rpath)
- (String.concat " " (prefix_list "-cclib " !c_libs))
- (String.concat " " !caml_libs));
- if !native_objs <> [] then
- scommand
- (sprintf "%s -a -o %s.cmxa %s %s -cclib -l%s %s %s %s %s"
- !ocamlopt
- !output
- (String.concat " " !caml_opts)
- (String.concat " " !native_objs)
- !output_c
- (String.concat " " (prefix_list "-ccopt " !c_opts))
- (make_rpath_ccopt nativecc_rpath)
- (String.concat " " (prefix_list "-cclib " !c_libs))
- (String.concat " " !caml_libs))
-
-let _ =
- try
- parse_arguments Sys.argv;
- build_libs()
- with
- | Bad_argument "" ->
- prerr_string usage; exit 0
- | Bad_argument s ->
- prerr_endline s; prerr_string usage; exit 4
- | Sys_error s ->
- prerr_string "System error: "; prerr_endline s; exit 4
- | x ->
- raise x