diff --git a/Changes b/Changes index 5fde9be80e02..8a131128ae3d 100644 --- a/Changes +++ b/Changes @@ -156,6 +156,10 @@ Working version (Tim McGilchrist and Sebastien Hinderer, review by Sebastien Hinderer, Gabriel Scherer and Antonin Décimo) +- #12239: Add -source-tree and -build-tree options to ocamldep to + specify where to find dependencies and where to output a target. + (Antonin Décimo, review by Sébastien Hinderer, Nicolás Ojeda Bär) + ### Manual and documentation: - #13694: Fix name for caml_hash_variant in the C interface. diff --git a/driver/makedepend.ml b/driver/makedepend.ml index ecd74183043a..9a9cd2584dd8 100644 --- a/driver/makedepend.ml +++ b/driver/makedepend.ml @@ -34,6 +34,8 @@ let nocwd = ref false let one_line = ref false let allow_approximation = ref false let debug = ref false +let source_tree = ref "" +let build_tree = ref "" (* [(dir, contents)] where [contents] is returned by [Sys.readdir dir]. *) let load_path = ref ([] : (string * string array) list) @@ -190,25 +192,44 @@ let print_filename s = let print_dependencies target_files deps = let pos = ref 0 in - let print_on_same_line item = + let artifacts = [".cmi"; ".cmo"; ".cmx"; ".cmxs"; ".o"] in + let print_prefix prefix = + match !prefix with + | "" -> Fun.id, 0 + | prefix -> + let len = String.length prefix in + let dir_sep = if Sys.os_type <> "Windows" || !Clflags.force_slash then + '/' else '\\' in + let s, len = if String.get prefix (len - 1) = dir_sep then + prefix, len + else prefix ^ String.make 1 dir_sep, len + 1 in + (fun () -> print_string s; pos := !pos + len), len + in + let print_build_tree, build_tree_len = print_prefix build_tree + and print_source_tree, _ = print_prefix source_tree + in + let print_on_same_line ~is_artifact item = if !pos <> 0 then print_string " "; + if is_artifact then print_build_tree () + else print_source_tree (); print_filename item; pos := !pos + String.length item + 1; - in - let print_on_new_line item = + and print_on_new_line ~is_artifact item = print_string escaped_eol; + if is_artifact then print_build_tree () + else print_source_tree (); print_filename item; pos := String.length item + 4; in let print_compact item = - if !one_line || (!pos + 1 + String.length item <= 77) - then print_on_same_line item - else print_on_new_line item - in - let print_dep item = + if !one_line || (!pos + 1 + build_tree_len + String.length item <= 77) + then print_on_same_line ~is_artifact:true item + else print_on_new_line ~is_artifact:true item + and print_dep item = + let is_artifact = List.mem (Filename.extension item) artifacts in if !one_line - then print_on_same_line item - else print_on_new_line item + then print_on_same_line ~is_artifact item + else print_on_new_line ~is_artifact item in List.iter print_compact target_files; print_string " "; print_string depends_on; @@ -624,6 +645,10 @@ let run_main argv = " (Windows) Preserve any backslash \\ in file paths"; "-sort", Arg.Set sort_files, " Sort files according to their dependencies"; + "-build-tree", Arg.String(fun s -> build_tree := s), + " Tree where build artifacts are written"; + "-source-tree", Arg.String(fun s -> source_tree := s), + " Tree where dependencies are found"; "-version", Arg.Unit print_version, " Print version and exit"; "-vnum", Arg.Unit print_version_num, diff --git a/man/ocamldep.1 b/man/ocamldep.1 index 166936b73153..248f3d7ec70b 100644 --- a/man/ocamldep.1 +++ b/man/ocamldep.1 @@ -187,6 +187,12 @@ Under Unix, this option does nothing. .B \-sort Sort files according to their dependencies. .TP +.B \-build\-tree \ path +Tree where build artifacts are written. +.TP +.B \-source\-tree \ path +Tree where dependencies are found. +.TP .B \-version Print version string and exit. .TP diff --git a/manual/src/cmds/ocamldep.etex b/manual/src/cmds/ocamldep.etex index 1213cb9b1b26..505d980cb15c 100644 --- a/manual/src/cmds/ocamldep.etex +++ b/manual/src/cmds/ocamldep.etex @@ -138,6 +138,12 @@ nothing. \item["-sort"] Sort files according to their dependencies. +\item["-build-tree" \var{path}] +Tree where build artifacts are written. + +\item["-source-tree" \var{path}] +Tree where dependencies are found. + \item["-version"] Print version string and exit. diff --git a/testsuite/tests/tool-ocamldep-tree/lib.ml b/testsuite/tests/tool-ocamldep-tree/lib.ml new file mode 100644 index 000000000000..e9066706584f --- /dev/null +++ b/testsuite/tests/tool-ocamldep-tree/lib.ml @@ -0,0 +1 @@ +let message = "Hello, world!" diff --git a/testsuite/tests/tool-ocamldep-tree/main.compilers.reference b/testsuite/tests/tool-ocamldep-tree/main.compilers.reference new file mode 100644 index 000000000000..a5ef78c8f17d --- /dev/null +++ b/testsuite/tests/tool-ocamldep-tree/main.compilers.reference @@ -0,0 +1,11 @@ +$(OD)/lib.cmo $(OD)/lib.cmi : \ + $(srcdir)/lib.ml +$(OD)/lib.cmx $(OD)/lib.o $(OD)/lib.cmi : \ + $(srcdir)/lib.ml +$(OD)/main.cmo $(OD)/main.cmi : \ + $(OD)/lib.cmi \ + $(srcdir)/main.ml +$(OD)/main.cmx $(OD)/main.o $(OD)/main.cmi : \ + $(OD)/lib.cmi \ + $(OD)/lib.cmx \ + $(srcdir)/main.ml diff --git a/testsuite/tests/tool-ocamldep-tree/main.ml b/testsuite/tests/tool-ocamldep-tree/main.ml new file mode 100644 index 000000000000..9c0978a65bf2 --- /dev/null +++ b/testsuite/tests/tool-ocamldep-tree/main.ml @@ -0,0 +1,9 @@ +(* TEST + modules = "lib.ml main.ml"; + setup-ocamlc.byte-build-env; + commandline = "-depend -all -source-tree $(srcdir) -build-tree $(OD) lib.ml main.ml"; + ocamlc.byte; + check-ocamlc.byte-output; + *) + +let () = print_endline Lib.message