$ . ./helpers.sh $ mkrepo Set up two build contexts: a default one for linux and another for macos. $ cat >dune-workspace < (lang dune 3.8) > (lock_dir > (path dune.lock) > (repositories mock) > (solver_env > (os linux))) > (lock_dir > (path dune.macos.lock) > (repositories mock) > (solver_env > (os macos))) > (context > (default)) > (context > (default > (name macos) > (lock_dir dune.macos.lock))) > (repository > (name mock) > (url "file://$(pwd)/mock-opam-repository")) > EOF Helper shell function to generate a dune-project file and generate lockdir for both contexts: $ solve_project() { > cat >dune-project > dune pkg lock dune.lock > dune pkg lock dune.macos.lock > } A package which is only available on linux: $ mkpkg linux-only 0.0.1 < available: os = "linux" > EOF $ mkpkg linux-only 0.0.2 < available: os = "linux" > EOF A package with three versions with only the middle version available on macos: $ mkpkg macos-sometimes 0.0.1 < available: os = "linux" > EOF $ mkpkg macos-sometimes 0.0.2 < EOF $ mkpkg macos-sometimes 0.0.3 < available: os = "linux" > EOF A package with an undefined variable in its availability filter for 0.0.1, and which is only available on linux for 0.0.2: $ mkpkg undefined-var 0.0.1 < available: xos = "linux" > EOF $ mkpkg undefined-var 0.0.2 < available: os = "linux" > EOF A package whose availability filter resolves to a string: $ mkpkg availability-string 0.0.1 < available: "foo" > EOF $ mkpkg availability-string 0.0.2 < available: os > EOF A package whose oldest and newest version is only available if with-test is false. $ mkpkg with-test-check 0.0.1 < available: ! with-test > EOF $ mkpkg with-test-check 0.0.2 < EOF $ mkpkg with-test-check 0.0.3 < available: ! with-test > EOF No solution will be available on macos as all versions of this package are only available on linux. $ solve linux-only Solution for dune.lock: - linux-only.0.0.2 Error: Unable to solve dependencies for the following lock directories: Lock directory dune.macos.lock: Couldn't solve the package dependency formula. Selected candidates: x.dev - linux-only -> (problem) No usable implementations: linux-only.0.0.2: Availability condition not satisfied linux-only.0.0.1: Availability condition not satisfied [1] The latest version of the package will be chosen on linux but the middle version will be chosen on macos as that's the only version available on macos. $ solve macos-sometimes Solution for dune.lock: - macos-sometimes.0.0.3 Solution for dune.macos.lock: - macos-sometimes.0.0.2 A warning will be printed as the undefined-var.0.0.1 package has an undefined variable in its `available` filter. The undefined-var.0.0.2 package has a valid `available` filter but is only available on linux. $ solve undefined-var Solution for dune.lock: - undefined-var.0.0.2 Error: Unable to solve dependencies for the following lock directories: Lock directory dune.macos.lock: Couldn't solve the package dependency formula. Selected candidates: x.dev - undefined-var -> (problem) No usable implementations: undefined-var.0.0.2: Availability condition not satisfied undefined-var.0.0.1: Availability condition not satisfied [1] Warnings will be printed and no solution will be found as the availability filter resolves to a string instead of to a boolean. $ solve availability-string Error: Unable to solve dependencies for the following lock directories: Lock directory dune.lock: Couldn't solve the package dependency formula. Selected candidates: x.dev - availability-string -> (problem) No usable implementations: availability-string.0.0.2: Availability condition not satisfied availability-string.0.0.1: Availability condition not satisfied Error: Unable to solve dependencies for the following lock directories: Lock directory dune.macos.lock: Couldn't solve the package dependency formula. Selected candidates: x.dev - availability-string -> (problem) No usable implementations: availability-string.0.0.2: Availability condition not satisfied availability-string.0.0.1: Availability condition not satisfied [1] The middle version will be picked as this is the only one available if with-test is set. This exercises that we can handle flags in the available filter. $ solve with-test-check Solution for dune.lock: - with-test-check.0.0.2 Solution for dune.macos.lock: - with-test-check.0.0.2