Private/Public overlap tests

private dependencies aren't allowed in public libraries. These tests
demonstrates that dune accepts them anyway
This commit is contained in:
Rudi Grinberg 2018-03-12 22:12:45 +07:00
parent 9ae2fb1fef
commit 35da6080e6
17 changed files with 112 additions and 0 deletions

View File

@ -419,3 +419,14 @@
(progn
(run ${exe:cram.exe} run.t)
(diff? run.t run.t.corrected)))))))
(alias
((name runtest)
(deps ((files_recursively_in test-cases/private-public-overlap)))
(action
(chdir test-cases/private-public-overlap
(setenv JBUILDER ${bin:jbuilder}
(progn
(run ${exe:cram.exe} run.t)
(diff? run.t run.t.corrected)))))))

View File

@ -0,0 +1,11 @@
(jbuild_version 1)
(library
((name privatelib)
(modules (privatelib))))
(executable
((name publicbin)
(modules (publicbin))
(public_name publicbin)
(package publicbin)))

View File

@ -0,0 +1,11 @@
(jbuild_version 1)
(library
((name privatelib)
(modules (privatelib))))
(library
((name publiclib)
(public_name publiclib)
(libraries (privatelib))
(modules (publiclib))))

View File

@ -0,0 +1,12 @@
(jbuild_version 1)
(library
((name ppx_internal)
(modules (:standard \ mylib))
(kind ppx_rewriter)))
(library
((name mylib)
(public_name mylib)
(preprocess (pps (ppx_internal)))
(modules (mylib))))

View File

@ -0,0 +1,17 @@
(jbuild_version 1)
(library
((name private_runtime_dep)
(modules (private_runtime_dep))))
(library
((name private_ppx)
(kind ppx_rewriter)
(ppx_runtime_libraries (private_runtime_dep))
(modules (:standard \ mylib private_runtime_dep))))
(library
((name mylib)
(public_name mylib)
(preprocess (pps (private_ppx)))
(modules (mylib))))

View File

@ -0,0 +1,50 @@
public libraries may not have private dependencies
$ $JBUILDER build -j1 --display short --root private-dep 2>&1 | grep -v Entering
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
ocamlc .ppx_internal.objs/ppx_internal.{cmi,cmo,cmt}
ocamlopt .ppx_internal.objs/ppx_internal.{cmx,o}
ocamlopt ppx_internal.{a,cmxa}
ocamlopt .ppx/ppx_internal@mylib/ppx.exe
ppx mylib.pp.ml
ocamldep mylib.pp.ml.d
ocamlc .mylib.objs/mylib.{cmi,cmo,cmt}
ocamlopt .mylib.objs/mylib.{cmx,o}
ocamlopt mylib.{a,cmxa}
ocamlopt mylib.cmxs
ocamlc mylib.cma
Unless they introduce private runtime dependencies:
$ $JBUILDER build -j1 --display short --root private-runtime-deps 2>&1 | grep -v Entering
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
ocamldep publicbin.ml.d
ocamlc .publicbin.eobjs/publicbin.{cmi,cmo,cmt}
ocamlopt .publicbin.eobjs/publicbin.{cmx,o}
ocamlopt publicbin.exe