Skip to content

Commit aa7e081

Browse files
authored
feature(pkg): add implicit constraint on dune (#8899)
This constraint is almost always what the user wants if they are planning to use the same dune that generated the build plan to build it Signed-off-by: Rudi Grinberg <[email protected]>
1 parent 5644576 commit aa7e081

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

src/dune_pkg/opam_solver.ml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,15 @@ module Context_for_dune = struct
1515
; version_preference : Version_preference.t
1616
; local_packages : OpamFile.OPAM.t OpamPackage.Name.Map.t
1717
; solver_env : Solver_env.t
18+
; dune_version : OpamPackage.Version.t
1819
}
1920

2021
let create ~solver_env ~repos ~local_packages ~version_preference =
21-
{ repos; version_preference; local_packages; solver_env }
22+
let dune_version =
23+
let major, minor = Dune_lang.Stanza.latest_version in
24+
OpamPackage.Version.of_string @@ sprintf "%d.%d" major minor
25+
in
26+
{ repos; version_preference; local_packages; solver_env; dune_version }
2227
;;
2328

2429
type rejection = Unavailable
@@ -122,7 +127,12 @@ module Context_for_dune = struct
122127
OpamFile.OPAM.version opam_file, opam_file_result))
123128
;;
124129

125-
let user_restrictions _ _ = None
130+
let user_restrictions : t -> OpamPackage.Name.t -> OpamFormula.version_constraint option
131+
=
132+
let dune = OpamPackage.Name.of_string "dune" in
133+
fun t pkg ->
134+
if OpamPackage.Name.equal dune pkg then Some (`Eq, t.dune_version) else None
135+
;;
126136

127137
let map_filters ~(f : filter -> filter) : filtered_formula -> filtered_formula =
128138
OpamFilter.gen_filter_formula

src/dune_rules/pkg_rules.ml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -845,12 +845,13 @@ module DB = struct
845845
let get context =
846846
let+ all = Lock_dir.get context in
847847
let system_provided =
848-
if Env.mem Env.initial ~var:"DUNE_PKG_OVERRIDE_OCAML"
849-
then (
850-
match all.ocaml with
851-
| None -> Package.Name.Set.singleton ocaml_package_name
852-
| Some (_, name) -> Package.Name.Set.singleton name)
853-
else Package.Name.Set.empty
848+
let base = Package.Name.Set.singleton (Package.Name.of_string "dune") in
849+
match Env.mem Env.initial ~var:"DUNE_PKG_OVERRIDE_OCAML" with
850+
| false -> base
851+
| true ->
852+
(match all.ocaml with
853+
| None -> Package.Name.Set.add base ocaml_package_name
854+
| Some (_, name) -> Package.Name.Set.singleton name)
854855
in
855856
{ all = all.packages; system_provided }
856857
;;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
By default, we introduce a constraint on in the build plan that will require
2+
the dune version to match the version of dune being used to generate the
3+
constraint.
4+
5+
$ . ./helpers.sh
6+
$ mkrepo
7+
8+
$ mkpkg dune 3.11.0 <<EOF
9+
> EOF
10+
11+
$ test() {
12+
> mkpkg foo <<EOF
13+
> depends: [ "dune" {<= "$1"} ]
14+
> EOF
15+
> solve foo
16+
> }
17+
18+
$ test "2.0.0"
19+
Error: Unable to solve dependencies in build context: default
20+
Can't find all required versions.
21+
Selected: foo.0.0.1 x.dev
22+
- dune -> (problem)
23+
User requested = 3.11
24+
Rejected candidates:
25+
dune.3.11.0: Incompatible with restriction: = 3.11
26+
[1]
27+
$ test "4.0.0"
28+
Solution for dune.lock:
29+
dune.3.11.0
30+
foo.0.0.1
31+

0 commit comments

Comments
 (0)