diff options
-rw-r--r-- | bytecomp/bytelink.ml | 26 | ||||
-rw-r--r-- | bytecomp/bytelink.mli | 5 | ||||
-rw-r--r-- | testsuite/tests/badly-ordered-deps/lib.ml | 1 | ||||
-rw-r--r-- | testsuite/tests/badly-ordered-deps/main.bytecode.reference | 2 | ||||
-rw-r--r-- | testsuite/tests/badly-ordered-deps/main.ml | 26 |
5 files changed, 50 insertions, 10 deletions
diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 90fcc0917a..79976dda15 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -19,6 +19,13 @@ open Misc open Config open Cmo_format +module Dep = struct + type t = string * string + let compare = compare +end + +module DepSet = Set.Make (Dep) + type error = | File_not_found of filepath | Not_an_object_file of filepath @@ -30,7 +37,7 @@ type error = | Cannot_open_dll of filepath | Required_module_unavailable of modname * modname | Camlheader of string * filepath - | Wrong_link_order of (modname * modname) list + | Wrong_link_order of DepSet.t | Multiple_definition of modname * filepath * filepath exception Error of error @@ -90,11 +97,11 @@ let add_ccobjs origin l = let missing_globals = ref Ident.Map.empty let provided_globals = ref Ident.Set.empty -let badly_ordered_dependencies : (string * string) list ref = ref [] +let badly_ordered_dependencies : DepSet.t ref = ref DepSet.empty let record_badly_ordered_dependency (id, compunit) = - badly_ordered_dependencies := - ((Ident.name id), compunit.cu_name) :: !badly_ordered_dependencies + let dep = ((Ident.name id), compunit.cu_name) in + badly_ordered_dependencies := DepSet.add dep !badly_ordered_dependencies let is_required (rel, _pos) = match rel with @@ -632,11 +639,11 @@ let link objfiles output_name = match Ident.Map.bindings missing_modules with | [] -> () | (id, cu_name) :: _ -> - match !badly_ordered_dependencies with - | [] -> + if DepSet.is_empty !badly_ordered_dependencies + then raise (Error (Required_module_unavailable (Ident.name id, cu_name))) - | l -> - raise (Error (Wrong_link_order l)) + else + raise (Error (Wrong_link_order !badly_ordered_dependencies)) end; Clflags.ccobjs := !Clflags.ccobjs @ !lib_ccobjs; (* put user's libs last *) Clflags.all_ccopts := !lib_ccopts @ !Clflags.all_ccopts; @@ -772,7 +779,8 @@ let report_error ppf = function fprintf ppf "Module `%s' is unavailable (required by `%s')" s m | Camlheader (msg, header) -> fprintf ppf "System error while copying file %s: %s" header msg - | Wrong_link_order l -> + | Wrong_link_order depset -> + let l = DepSet.elements depset in let depends_on ppf (dep, depending) = fprintf ppf "%s depends on %s" depending dep in diff --git a/bytecomp/bytelink.mli b/bytecomp/bytelink.mli index 9adf20fdcb..35a59df1bf 100644 --- a/bytecomp/bytelink.mli +++ b/bytecomp/bytelink.mli @@ -17,6 +17,9 @@ open Misc (* Link .cmo files and produce a bytecode executable. *) +module Dep : Set.OrderedType with type t = modname * modname +module DepSet : Set.S with type elt = Dep.t + val link : filepath list -> filepath -> unit val reset : unit -> unit @@ -35,7 +38,7 @@ type error = | Cannot_open_dll of filepath | Required_module_unavailable of modname * modname | Camlheader of string * filepath - | Wrong_link_order of (modname * modname) list + | Wrong_link_order of DepSet.t | Multiple_definition of modname * filepath * filepath exception Error of error diff --git a/testsuite/tests/badly-ordered-deps/lib.ml b/testsuite/tests/badly-ordered-deps/lib.ml new file mode 100644 index 0000000000..4b4431124e --- /dev/null +++ b/testsuite/tests/badly-ordered-deps/lib.ml @@ -0,0 +1 @@ +let value = Main.value diff --git a/testsuite/tests/badly-ordered-deps/main.bytecode.reference b/testsuite/tests/badly-ordered-deps/main.bytecode.reference new file mode 100644 index 0000000000..8adfad056b --- /dev/null +++ b/testsuite/tests/badly-ordered-deps/main.bytecode.reference @@ -0,0 +1,2 @@ +File "_none_", line 1: +Error: Wrong link order: Lib depends on Main diff --git a/testsuite/tests/badly-ordered-deps/main.ml b/testsuite/tests/badly-ordered-deps/main.ml new file mode 100644 index 0000000000..ff4d1c90a1 --- /dev/null +++ b/testsuite/tests/badly-ordered-deps/main.ml @@ -0,0 +1,26 @@ +(* TEST + +(* Make sure ocamlc prints badly ordeered dependencies only once. + See issue #12074. We test with ocamlc.byte only. *) + +modules = "lib.ml" + +* setup-ocamlc.byte-build-env + +** ocamlc.byte +all_modules = "main.ml" +compile_only = "true" + +*** ocamlc.byte +all_modules = "lib.ml" + +**** ocamlc.byte +all_modules = "lib.cmo main.cmo" +compile_only = "false" +ocamlc_byte_exit_status = "2" + +***** check-ocamlc.byte-output + +*) + +let value = () |