$ . ./helpers.sh $ mkrepo A package with different linux and macos dependencies including a test-only dependency: $ mkpkg foo < depends: [ > "foo-linux" {os = "linux"} > "foo-macos" {os = "macos"} > "foo-macos-test-only" {os = "macos" & with-test} > ] > EOF $ mkpkg foo-linux < available: os = "linux" > EOF $ mkpkg foo-linux-test-only < available: os = "linux" > EOF $ mkpkg foo-macos < available: os = "macos" > EOF Create a workspace config that defines separate build contexts for macos and linux. $ cat >dune-workspace < (lang dune 3.8) > (lock_dir > (path dune.no-os.lock) > (repositories mock) > (solver_env > (unset_variables os))) > (lock_dir > (path dune.linux.lock) > (repositories mock) > (solver_env > (os linux))) > (lock_dir > (path dune.macos.lock) > (repositories mock) > (solver_env > (os macos))) > (lock_dir > (path dune.lock) > (repositories mock)) > (context > (default > (name linux) > (lock_dir dune.linux.lock))) > (context > (default > (name macos) > (lock_dir dune.macos.lock))) > (repository > (name mock) > (url "file://$(pwd)/mock-opam-repository")) > EOF Now the os-specific dependencies are included on their respective systems. $ dune pkg lock --all Solution for dune.linux.lock: (no dependencies to lock) Solution for dune.lock: (no dependencies to lock) Solution for dune.macos.lock: (no dependencies to lock) Solution for dune.no-os.lock: (no dependencies to lock)