diff --git a/src/dune_rules/utop.ml b/src/dune_rules/utop.ml index cd86a55feda..150ed46a635 100644 --- a/src/dune_rules/utop.ml +++ b/src/dune_rules/utop.ml @@ -93,6 +93,52 @@ let libs_and_ppx_under_dir sctx ~db ~dir = , pps ) else (acc, pps)) + | Dune_file.Executables exes -> ( + let* libs = + let open Memo.Build.O in + let* compile_info = + let project = Scope.project d.scope in + let dune_version = Dune_project.dune_version project in + let+ pps = + Resolve.Build.read_memo_build + (Preprocess.Per_module.with_instrumentation + exes.buildable.preprocess + ~instrumentation_backend: + (Lib.DB.instrumentation_backend (Scope.libs d.scope))) + >>| Preprocess.Per_module.pps + in + Lib.DB.resolve_user_written_deps_for_exes db exes.names + exes.buildable.libraries ~pps ~dune_version + ~allow_overlaps: + exes.buildable.allow_overlapping_dependencies + ~forbidden_libraries:exes.forbidden_libraries + in + let+ available = Lib.Compile.direct_requires compile_info in + Resolve.peek available + in + match libs with + | Error () -> Memo.Build.return (acc, pps) + | Ok libs -> + Memo.Build.List.fold_left libs ~init:(acc, pps) + ~f:(fun (acc, pps) lib -> + let info = Lib.info lib in + match Lib_info.kind info with + | Lib_kind.Ppx_rewriter _ + | Ppx_deriver _ -> + Memo.Build.return + ( Appendable_list.( @ ) + (Appendable_list.singleton lib) + acc + , Appendable_list.( @ ) + (Appendable_list.singleton + (Lib_info.loc info, Lib_info.name info)) + pps ) + | Normal -> + Memo.Build.return + ( Appendable_list.( @ ) + (Appendable_list.singleton lib) + acc + , pps ))) | _ -> Memo.Build.return (acc, pps))) >>| fun (libs, pps) -> (Appendable_list.to_list libs, Appendable_list.to_list pps) diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/bin/dune b/test/blackbox-tests/test-cases/utop/utop-executables.t/bin/dune new file mode 100644 index 00000000000..dd1214fa74a --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/bin/dune @@ -0,0 +1,3 @@ +(executable + (name foo) + (libraries bar)) diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/bin/foo.ml b/test/blackbox-tests/test-cases/utop/utop-executables.t/bin/foo.ml new file mode 100644 index 00000000000..897d3b159ac --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/bin/foo.ml @@ -0,0 +1,2 @@ +module Bar = Bar + diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/dune-project b/test/blackbox-tests/test-cases/utop/utop-executables.t/dune-project new file mode 100644 index 00000000000..5bbef0b4909 --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/dune-project @@ -0,0 +1 @@ +(lang dune 2.5) diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/lib/bar.ml b/test/blackbox-tests/test-cases/utop/utop-executables.t/lib/bar.ml new file mode 100644 index 00000000000..b6de1a37dc6 --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/lib/bar.ml @@ -0,0 +1 @@ +let run () = print_endline "loaded external library successfully" diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/lib/dune b/test/blackbox-tests/test-cases/utop/utop-executables.t/lib/dune new file mode 100644 index 00000000000..06f0fc22117 --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/lib/dune @@ -0,0 +1,2 @@ +(library + (name bar)) diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/load_executable_libraries.ml b/test/blackbox-tests/test-cases/utop/utop-executables.t/load_executable_libraries.ml new file mode 100644 index 00000000000..47049d3b591 --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/load_executable_libraries.ml @@ -0,0 +1,3 @@ +let () = + Bar.run (); + exit 0 diff --git a/test/blackbox-tests/test-cases/utop/utop-executables.t/run.t b/test/blackbox-tests/test-cases/utop/utop-executables.t/run.t new file mode 100644 index 00000000000..cf8d260e465 --- /dev/null +++ b/test/blackbox-tests/test-cases/utop/utop-executables.t/run.t @@ -0,0 +1,3 @@ +Running dune utop in a project with only executables loads external libraries + $ dune utop bin -- load_executable_libraries.ml + loaded external library successfully