A package that installs itself into the ocaml stdlib should work. $ . ./helpers.sh $ mkdir nondune $ cd nondune $ cat > nondune.ml < let main () = print_endline "Nondune" > let () = main () > EOF $ ocamlc -c nondune.ml $ ocamlc -o nondune.cma -a nondune.cmo $ cat > nondune.install < lib_root: [ > "nondune.cma" {"ocaml/nondune.cma"} > "nondune.cmi" {"ocaml/nondune.cmi"} > ] > lib: [ > "META" {"META"} > ] > EOF $ cat > META < directory = "^" > archive(byte) = "nondune.cma" > EOF $ cat > nondune.opam < opam-version: "2.0" > build: [ > [true] > ] > EOF $ cd .. With this project set up, lets depend on it. $ mkdir foo $ cd foo $ mkrepo $ solve_project < (lang dune 3.15) > (pin > (url "file://$PWD/../nondune") > (package (name nondune))) > (package > (name foo) > (depends nondune)) > EOF Solution for dune.lock: - nondune.dev $ cat > dune < (executable > (name foo) > (modules foo) > (libraries nondune) > (modes byte)) > EOF $ cat > foo.ml < let () = Nondune.main () > EOF $ dune exec ./foo.exe 2>&1 | grep -o "Unbound module Nondune" Unbound module Nondune