Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Changes
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
45 changes: 35 additions & 10 deletions driver/makedepend.ml
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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),
"<path> Tree where build artifacts are written";
"-source-tree", Arg.String(fun s -> source_tree := s),
"<path> Tree where dependencies are found";
"-version", Arg.Unit print_version,
" Print version and exit";
"-vnum", Arg.Unit print_version_num,
Expand Down
6 changes: 6 additions & 0 deletions man/ocamldep.1
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions manual/src/cmds/ocamldep.etex
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
1 change: 1 addition & 0 deletions testsuite/tests/tool-ocamldep-tree/lib.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let message = "Hello, world!"
11 changes: 11 additions & 0 deletions testsuite/tests/tool-ocamldep-tree/main.compilers.reference
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions testsuite/tests/tool-ocamldep-tree/main.ml
Original file line number Diff line number Diff line change
@@ -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
Loading