diff options
Diffstat (limited to 'ocamlbuild/ocaml_compiler.ml')
-rw-r--r-- | ocamlbuild/ocaml_compiler.ml | 31 |
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 |