Fix private deps check for ppx runtime dependencies
This commit is contained in:
parent
b2258b6c98
commit
753badd481
34
src/lib.ml
34
src/lib.ml
|
@ -548,6 +548,14 @@ module Dep_stack = struct
|
|||
}
|
||||
end
|
||||
|
||||
let check_private_deps ~(lib : lib) ~loc ~allow_private_deps =
|
||||
if (not allow_private_deps) && Status.is_private lib.status then (
|
||||
Result.Error (Error (
|
||||
Private_deps_not_allowed { private_dep = lib ; pd_loc = loc }))
|
||||
) else (
|
||||
Ok lib
|
||||
)
|
||||
|
||||
let already_in_table (info : Info.t) name x =
|
||||
let to_sexp = Sexp.To_sexp.(pair Path.sexp_of_t string) in
|
||||
let sexp =
|
||||
|
@ -666,12 +674,7 @@ and resolve_dep db name ~allow_private_deps ~loc ~stack : (t, exn) result =
|
|||
match find_internal db name ~stack with
|
||||
| St_initializing id ->
|
||||
Error (Dep_stack.dependency_cycle stack id)
|
||||
| St_found t ->
|
||||
if (not allow_private_deps) && Status.is_private t.status then (
|
||||
failwith ""
|
||||
) else (
|
||||
Ok t
|
||||
)
|
||||
| St_found lib -> check_private_deps ~lib ~loc ~allow_private_deps
|
||||
| St_not_found ->
|
||||
Error (Error (Library_not_available { loc; name; reason = Not_found }))
|
||||
| St_hidden (_, hidden) ->
|
||||
|
@ -778,7 +781,7 @@ and resolve_complex_deps db deps ~allow_private_deps ~stack =
|
|||
and resolve_deps db deps ~allow_private_deps ~stack =
|
||||
match (deps : Info.Deps.t) with
|
||||
| Simple names ->
|
||||
(resolve_simple_deps db names ~allow_private_deps ~stack, [])
|
||||
(resolve_simple_deps db names ~allow_private_deps ~stack, [])
|
||||
| Complex names ->
|
||||
resolve_complex_deps ~allow_private_deps db names ~stack
|
||||
|
||||
|
@ -791,15 +794,21 @@ and resolve_user_deps db deps ~allow_private_deps ~pps ~stack =
|
|||
| pps ->
|
||||
let pps =
|
||||
let pps = (pps : (Loc.t * Jbuild.Pp.t) list :> (Loc.t * string) list) in
|
||||
resolve_simple_deps db pps ~allow_private_deps ~stack >>= fun pps ->
|
||||
resolve_simple_deps db pps ~allow_private_deps:true ~stack
|
||||
>>= fun pps ->
|
||||
closure_with_overlap_checks None pps ~stack
|
||||
in
|
||||
let deps =
|
||||
let rec loop acc = function
|
||||
let rec check_deps acc pps ~loc = function
|
||||
| [] -> loop acc pps
|
||||
| lib :: ppx_rts ->
|
||||
check_private_deps ~lib ~loc ~allow_private_deps >>= fun rt ->
|
||||
check_deps (rt :: acc) pps ~loc ppx_rts
|
||||
and loop acc = function
|
||||
| [] -> Ok acc
|
||||
| pp :: pps ->
|
||||
pp.ppx_runtime_deps >>= fun rt_deps ->
|
||||
loop (List.rev_append rt_deps acc) pps
|
||||
check_deps acc pps ~loc:pp.loc rt_deps
|
||||
in
|
||||
deps >>= fun deps ->
|
||||
pps >>= fun pps ->
|
||||
|
@ -1141,10 +1150,11 @@ let report_lib_error ppf (e : Error.t) =
|
|||
cycle
|
||||
| Private_deps_not_allowed (t : private_deps_not_allowed) ->
|
||||
Format.fprintf ppf
|
||||
"%a@{<error>Error@}: Public libraries may not have private dependencies.\
|
||||
\nPrivate dependency %S encountered in public library:\n"
|
||||
"%a@{<error>Error@}: Library %S is private, it cannot be a dependency of\
|
||||
a public library.\nYou need to give %S a public name.\n"
|
||||
Loc.print t.pd_loc
|
||||
t.private_dep.name
|
||||
t.private_dep.name
|
||||
|
||||
let () =
|
||||
Report_error.register (fun exn ->
|
||||
|
|
|
@ -1,15 +1,10 @@
|
|||
public libraries may not have private dependencies
|
||||
|
||||
$ $JBUILDER build -j1 --display short --root private-dep 2>&1 | grep -v Entering
|
||||
File "jbuild", line 1, characters 0-155:
|
||||
Error: Library "privatelib" is private, it cannot be a dependency ofa public library. You need to give "privatelib" a public name
|
||||
-> required by library "publiclib" in _build/default
|
||||
ocamldep publiclib.ml.d
|
||||
ocamldep privatelib.ml.d
|
||||
ocamlc .privatelib.objs/privatelib.{cmi,cmo,cmt}
|
||||
ocamlc .publiclib.objs/publiclib.{cmi,cmo,cmt}
|
||||
ocamlc publiclib.cma
|
||||
ocamlopt .privatelib.objs/privatelib.{cmx,o}
|
||||
ocamlopt .publiclib.objs/publiclib.{cmx,o}
|
||||
ocamlopt publiclib.{a,cmxa}
|
||||
ocamlopt publiclib.cmxs
|
||||
|
||||
On the other hand, public libraries may have private preprocessors
|
||||
$ $JBUILDER build -j1 --display short --root private-rewriter 2>&1 | grep -v Entering
|
||||
|
@ -27,20 +22,15 @@ On the other hand, public libraries may have private preprocessors
|
|||
|
||||
Unless they introduce private runtime dependencies:
|
||||
$ $JBUILDER build -j1 --display short --root private-runtime-deps 2>&1 | grep -v Entering
|
||||
File "jbuild", line 8, characters 1-143:
|
||||
Error: Library "private_runtime_dep" is private, it cannot be a dependency ofa public library. You need to give "private_runtime_dep" a public name
|
||||
-> required by library "mylib" in _build/default
|
||||
ocamlc .private_ppx.objs/private_ppx.{cmi,cmo,cmt}
|
||||
ocamlopt .private_ppx.objs/private_ppx.{cmx,o}
|
||||
ocamlopt private_ppx.{a,cmxa}
|
||||
ocamlopt .ppx/private_ppx@mylib/ppx.exe
|
||||
ppx mylib.pp.ml
|
||||
ocamldep mylib.pp.ml.d
|
||||
ocamldep private_runtime_dep.ml.d
|
||||
ocamlc .private_runtime_dep.objs/private_runtime_dep.{cmi,cmo,cmt}
|
||||
ocamlc .mylib.objs/mylib.{cmi,cmo,cmt}
|
||||
ocamlc mylib.cma
|
||||
ocamlopt .private_runtime_dep.objs/private_runtime_dep.{cmx,o}
|
||||
ocamlopt .mylib.objs/mylib.{cmx,o}
|
||||
ocamlopt mylib.{a,cmxa}
|
||||
ocamlopt mylib.cmxs
|
||||
|
||||
However, public binaries may accept private dependencies
|
||||
$ $JBUILDER build -j1 --display short --root exes 2>&1 | grep -v Entering
|
||||
|
|
Loading…
Reference in New Issue