diff --git a/src/jbuild.ml b/src/jbuild.ml index d5c3b264..70a41a26 100644 --- a/src/jbuild.ml +++ b/src/jbuild.ml @@ -879,8 +879,16 @@ module Executables = struct ; buildable } in + let has_public_name = + List.exists ~f:Option.is_some public_names + in let to_install = match Link_mode.Set.best_install_mode t.modes with + | None when has_public_name -> + Loc.fail + buildable.loc + "No installable mode found for %s." + (if multi then "these executables" else "this executable") | None -> [] | Some mode -> let ext = diff --git a/test/blackbox-tests/dune.inc b/test/blackbox-tests/dune.inc index 0af19fcf..62c146f7 100644 --- a/test/blackbox-tests/dune.inc +++ b/test/blackbox-tests/dune.inc @@ -372,6 +372,15 @@ (run ${exe:cram.exe} -skip-versions 4.02.3 -test run.t) (diff? run.t run.t.corrected)))))) +(alias + ((name no-installable-mode) + (deps + ((package dune) (files_recursively_in test-cases/no-installable-mode))) + (action + (chdir + test-cases/no-installable-mode + (progn (run ${exe:cram.exe} -test run.t) (diff? run.t run.t.corrected)))))) + (alias ((name null-dep) (deps ((package dune) (files_recursively_in test-cases/null-dep))) @@ -579,6 +588,7 @@ (alias meta-gen) (alias misc) (alias multiple-private-libs) + (alias no-installable-mode) (alias null-dep) (alias ocaml-syntax) (alias ocamldep-multi-stanzas) @@ -639,6 +649,7 @@ (alias merlin-tests) (alias meta-gen) (alias misc) + (alias no-installable-mode) (alias null-dep) (alias ocaml-syntax) (alias ocamldep-multi-stanzas) diff --git a/test/blackbox-tests/test-cases/no-installable-mode/private/jbuild b/test/blackbox-tests/test-cases/no-installable-mode/private/jbuild new file mode 100644 index 00000000..3eb43e8f --- /dev/null +++ b/test/blackbox-tests/test-cases/no-installable-mode/private/jbuild @@ -0,0 +1,8 @@ +(jbuild_version 1) + +(executable + ( + (name myprivatelib) + (modes (shared_object)) + ) + ) diff --git a/test/blackbox-tests/test-cases/no-installable-mode/private/myprivatelib.ml b/test/blackbox-tests/test-cases/no-installable-mode/private/myprivatelib.ml new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/no-installable-mode/public/jbuild b/test/blackbox-tests/test-cases/no-installable-mode/public/jbuild new file mode 100644 index 00000000..83caf772 --- /dev/null +++ b/test/blackbox-tests/test-cases/no-installable-mode/public/jbuild @@ -0,0 +1,9 @@ +(jbuild_version 1) + +(executable + ( + (name mylib) + (public_name mylib) + (modes (shared_object)) + ) + ) diff --git a/test/blackbox-tests/test-cases/no-installable-mode/public/mylib.ml b/test/blackbox-tests/test-cases/no-installable-mode/public/mylib.ml new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/no-installable-mode/public/mypackage.opam b/test/blackbox-tests/test-cases/no-installable-mode/public/mypackage.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/no-installable-mode/run.t b/test/blackbox-tests/test-cases/no-installable-mode/run.t new file mode 100644 index 00000000..1a30df39 --- /dev/null +++ b/test/blackbox-tests/test-cases/no-installable-mode/run.t @@ -0,0 +1,16 @@ +When a public executable is built in shared_object mode, a specific error +message is displayed: + + $ dune build --root=public --display=short + File "jbuild", line 4, characters 2-74: + Error: No installable mode found for this executable. + [1] + +However, it is possible to build a private one explicitly. + + $ dune build --root=private --display=short myprivatelib.so + Entering directory 'private' + ocamldep myprivatelib.ml.d + ocamlc .myprivatelib.eobjs/myprivatelib.{cmi,cmo,cmt} + ocamlopt .myprivatelib.eobjs/myprivatelib.{cmx,o} + ocamlopt myprivatelib$ext_dll