summaryrefslogtreecommitdiffstats
path: root/ocamlbuild/ocaml_compiler.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocamlbuild/ocaml_compiler.ml')
-rw-r--r--ocamlbuild/ocaml_compiler.ml31
1 files changed, 24 insertions, 7 deletions
diff --git a/ocamlbuild/ocaml_compiler.ml b/ocamlbuild/ocaml_compiler.ml
index cf17c45d2..e875d9bc0 100644
--- a/ocamlbuild/ocaml_compiler.ml
+++ b/ocamlbuild/ocaml_compiler.ml
@@ -78,11 +78,16 @@ let ocamlopt_link_prog = ocamlopt_link N
let ocamlopt_p tags deps out =
let dirnames = List.union [] (List.map Pathname.dirname deps) in
let include_flags = List.fold_right ocaml_add_include_flag dirnames [] in
- let cmi = cmi_of out and cmitmp = Pathname.update_extensions "cmitmp" out in
- Seq[mv cmi cmitmp;
- Cmd (S [!Options.ocamlopt; A"-pack"; forpack_flags out tags; T tags; S include_flags;
- atomize_paths deps; flags_of_pathname out; (* FIXME: P (cmi_of out);*) A"-o"; Px out]);
- cmp cmitmp cmi]
+ let mli = Pathname.update_extensions "mli" out in
+ let cmd =
+ S [!Options.ocamlopt; A"-pack"; forpack_flags out tags; T tags;
+ S include_flags; atomize_paths deps; flags_of_pathname out;
+ A"-o"; Px out] in
+ if (*FIXME true ||*) Pathname.exists mli then Cmd cmd
+ else
+ let rm = S[A"rm"; A"-f"; P mli] in
+ Cmd(S[A"touch"; P mli; Sh" ; if "; cmd; Sh" ; then "; rm; Sh" ; else ";
+ rm; Sh" ; exit 1; fi"])
let native_lib_linker tags =
if Tags.mem "ocamlmklib" tags then
@@ -175,7 +180,7 @@ let caml_transitive_closure = Ocaml_dependencies.caml_transitive_closure
let link_gen cmX_ext cma_ext a_ext extensions linker tagger cmX out env build =
let cmX = env cmX and out = env out in
let tags = tagger (tags_of_pathname out) in
- let dyndeps = Rule.build_deps_of_tags build tags in
+ let dyndeps = Rule.build_deps_of_tags build (tags++"link_with") in
let cmi = Pathname.update_extensions "cmi" cmX in
prepare_link cmX cmi extensions build;
let libs = prepare_libs cma_ext a_ext out build in
@@ -185,9 +190,15 @@ let link_gen cmX_ext cma_ext a_ext extensions linker tagger cmX out env build =
~caml_obj_ext:cmX_ext ~caml_lib_ext:cma_ext
~used_libraries:libs ~hidden_packages (cmX :: dyndeps) in
let deps = (List.filter (fun l -> not (List.mem l deps)) libs) @ deps in
+
+ (* Hack to avoid linking twice with the standard library. *)
+ let stdlib = "stdlib/stdlib"-.-cma_ext in
+ let is_not_stdlib x = x <> stdlib in
+ let deps = List.filter is_not_stdlib deps in
+
if deps = [] then failwith "Link list cannot be empty";
let () = dprintf 6 "link: %a -o %a" print_string_list deps Pathname.print out in
- linker tags deps out
+ linker (tags++"dont_link_with") deps out
let byte_link_gen = link_gen "cmo" "cma" "cma" ["cmo"; "cmi"]
@@ -258,6 +269,12 @@ let link_units table extensions cmX_ext cma_ext a_ext linker tagger contents_lis
let full_contents = libs @ module_paths in
let deps = List.filter (fun x -> List.mem x full_contents) deps in
let deps = (List.filter (fun l -> not (List.mem l deps)) libs) @ deps in
+
+ (* Hack to avoid linking twice with the standard library. *)
+ let stdlib = "stdlib/stdlib"-.-cma_ext in
+ let is_not_stdlib x = x <> stdlib in
+ let deps = List.filter is_not_stdlib deps in
+
linker tags deps cmX
let link_modules = link_units library_index