diff --git a/doc/index.html b/doc/index.html
index 399432c6761..f27e6e37661 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -198,6 +198,8 @@
opam %{OPAMVERSION}% API and libraries documentation
Configuration options for this lib (record, global reference, setter, initialisation) |
opamActionGraph.ml |
Handles graphs of actions (package changes), based on ocamlgraph |
+opamCudfCriteria.ml |
+ Cudf criteria helper functions (string conversion, etc.) |
opamCudfSolver.ml |
Bindings to implementation of CUDF solvers, either built-in or external |
opamCudf.ml |
diff --git a/master_changes.md b/master_changes.md
index e9bc7d044a7..73bb678f71d 100644
--- a/master_changes.md
+++ b/master_changes.md
@@ -211,6 +211,7 @@ users)
* `OpamStateConfig.opamroot_with_provenance`: restore previous behaviour to `OpamStateConfig.opamroot` for compatibility with third party code [#6047 @dra27]
## opam-solver
+ * `OpamCudfCriteria`, `OpamBuiltinZ3.Syntax`: Move `OpamBuiltinZ3.Syntax` into a dedicated module `OpamCudfCriteria` [#6130 @kit-ty-kate]
## opam-format
* Add `OpamTypesBase.switch_selections_{compare,equal}`: proper comparison functions for `OpamTypes.switch_selections` [#6102 @kit-ty-kate]
diff --git a/src/solver/opamBuiltinZ3.real.ml b/src/solver/opamBuiltinZ3.real.ml
index 24eada8bb34..3ffa167d6d1 100644
--- a/src/solver/opamBuiltinZ3.real.ml
+++ b/src/solver/opamBuiltinZ3.real.ml
@@ -273,17 +273,10 @@ let sum ctx (_, universe, _) filter value =
[]
universe
-type filter = Installed | Changed | Removed | New |
- Upgraded | Downgraded | Requested
-type property = string option
-type sign = Plus | Minus
-
-type criterion = sign * filter * property
-
let def_criterion ctx opt (preamble, universe, request as cudf)
- (sign, filter, property : criterion) =
+ (sign, filter, property : OpamCudfCriteria.criterion) =
let filter_f = match filter with
- | Installed -> fun p -> psym ctx p
+ | Installed | Solution -> fun p -> psym ctx p
| Changed ->
fun p ->
if p.Cudf.installed then
@@ -367,82 +360,6 @@ let def_criterion ctx opt (preamble, universe, request as cudf)
let def_criteria ctx opt cudf crits =
List.iter (def_criterion ctx opt cudf) crits
-module Syntax = struct
-
- let criterion_of_string (s,params) =
- let sign = match s.[0] with
- | '+' -> Plus
- | '-' -> Minus
- | c -> failwith (Printf.sprintf "criteria_of_string sign=%c" c)
- | exception Invalid_argument _ ->
- failwith "criteria_of_string sign=EOF"
- in
- let s = String.sub s 1 (String.length s - 1) in
- let subset_of_string = function
- | "new" -> New
- | "removed" -> Removed
- | "changed" -> Changed
- | "up" -> Upgraded
- | "down" -> Downgraded
- | "installed" | "solution" -> Installed
- | "request" -> Requested
- | s -> failwith ("criteria_of_string subset="^s)
- in
- match s, params with
- | "count", [field; subset] ->
- sign, subset_of_string subset, Some field
- | s, [] -> sign, subset_of_string s, None
- | s, _ -> failwith ("criteria_of_string s="^s)
-(*
- let string_of_criterion (sign, filter, property: criterion) =
- Printf.sprintf "%c%s%s"
- (match sign with Plus -> '+' | Minus -> '-')
- (match filter with
- | Installed -> "installed"
- | Changed -> "changed"
- | Removed -> "removed"
- | New -> "new"
- | Upgraded -> "up"
- | Downgraded -> "down"
- | Requested -> "request")
- (match property with None -> "" | Some p -> "["^p^"]")
-*)
- let criteria_of_string s =
- let start = ref 0 in
- let crits = ref [] in
- let params = ref None in
- for i = 0 to String.length s - 1 do
- match s.[i] with
- | ',' ->
- let sub = String.sub s !start (i - !start) in
- start := i + 1;
- if sub <> "" then
- (match !params with
- | None -> crits := (sub, []) :: !crits
- | Some (name, ps) -> params := Some (name, sub :: ps))
- | '[' ->
- let sub = String.sub s !start (i - !start) in
- start := i + 1;
- if !params <> None then failwith "criteria_of_string";
- params := Some (sub, [])
- | ']' ->
- let sub = String.sub s !start (i - !start) in
- start := i + 1;
- (match !params with
- | None -> failwith "criteria_of_string"
- | Some (name, ps) ->
- params := None;
- crits := (name, List.rev (sub::ps)) :: !crits)
- | _ -> ()
- done;
- if !start < String.length s then
- crits := (String.sub s !start (String.length s - !start), []) :: !crits;
- if !params <> None then failwith "criteria_of_string";
- let r = List.rev_map criterion_of_string !crits in
- r
-
-end
-
let extract_solution_packages universe opt =
match Z3.Optimize.get_model opt with
| Some model ->
@@ -485,7 +402,7 @@ let call ~criteria ?timeout (preamble, universe, _ as cudf) =
log "Generating optimization criteria";
let opt = Z3.Optimize.mk_opt ctx.z3 in
let _criteria_def_handles =
- def_criteria ctx opt cudf (Syntax.criteria_of_string criteria)
+ def_criteria ctx opt cudf (OpamCudfCriteria.of_string criteria)
in
log "Sending the problem to Z3";
let params =
diff --git a/src/solver/opamCudfCriteria.ml b/src/solver/opamCudfCriteria.ml
new file mode 100644
index 00000000000..b4b601e76e6
--- /dev/null
+++ b/src/solver/opamCudfCriteria.ml
@@ -0,0 +1,99 @@
+(**************************************************************************)
+(* *)
+(* Copyright 2017-2019 OCamlPro *)
+(* *)
+(* All rights reserved. This file is distributed under the terms of the *)
+(* GNU Lesser General Public License version 2.1, with the special *)
+(* exception on linking described in the file LICENSE. *)
+(* *)
+(**************************************************************************)
+
+type filter =
+ | Installed
+ | Solution
+ | Changed
+ | Removed
+ | New
+ | Upgraded
+ | Downgraded
+ | Requested
+
+type property = string option
+
+type sign = Plus | Minus
+
+type criterion = sign * filter * property
+
+let criterion_of_string (s,params) =
+ let sign = match s.[0] with
+ | '+' -> Plus
+ | '-' -> Minus
+ | c -> failwith (Printf.sprintf "criteria_of_string sign=%c" c)
+ | exception Invalid_argument _ ->
+ failwith "criteria_of_string sign=EOF"
+ in
+ let s = String.sub s 1 (String.length s - 1) in
+ let subset_of_string = function
+ | "new" -> New
+ | "removed" -> Removed
+ | "changed" -> Changed
+ | "up" -> Upgraded
+ | "down" -> Downgraded
+ | "installed" -> Installed
+ | "solution" -> Solution
+ | "request" -> Requested
+ | s -> failwith ("criteria_of_string subset="^s)
+ in
+ match s, params with
+ | "count", [field; subset] ->
+ sign, subset_of_string subset, Some field
+ | s, [] -> sign, subset_of_string s, None
+ | s, _ -> failwith ("criteria_of_string s="^s)
+
+let criterion_to_string (sign, filter, property: criterion) =
+ Printf.sprintf "%c%s%s"
+ (match sign with Plus -> '+' | Minus -> '-')
+ (match filter with
+ | Installed -> "installed"
+ | Solution -> "solution"
+ | Changed -> "changed"
+ | Removed -> "removed"
+ | New -> "new"
+ | Upgraded -> "up"
+ | Downgraded -> "down"
+ | Requested -> "request")
+ (match property with None -> "" | Some p -> "["^p^"]")
+
+let of_string s =
+ let start = ref 0 in
+ let crits = ref [] in
+ let params = ref None in
+ for i = 0 to String.length s - 1 do
+ match s.[i] with
+ | ',' ->
+ let sub = String.sub s !start (i - !start) in
+ start := i + 1;
+ if sub <> "" then
+ (match !params with
+ | None -> crits := (sub, []) :: !crits
+ | Some (name, ps) -> params := Some (name, sub :: ps))
+ | '[' ->
+ let sub = String.sub s !start (i - !start) in
+ start := i + 1;
+ if !params <> None then failwith "criteria_of_string";
+ params := Some (sub, [])
+ | ']' ->
+ let sub = String.sub s !start (i - !start) in
+ start := i + 1;
+ (match !params with
+ | None -> failwith "criteria_of_string"
+ | Some (name, ps) ->
+ params := None;
+ crits := (name, List.rev (sub::ps)) :: !crits)
+ | _ -> ()
+ done;
+ if !start < String.length s then
+ crits := (String.sub s !start (String.length s - !start), []) :: !crits;
+ if !params <> None then failwith "criteria_of_string";
+ let r = List.rev_map criterion_of_string !crits in
+ r
diff --git a/src/solver/opamCudfCriteria.mli b/src/solver/opamCudfCriteria.mli
new file mode 100644
index 00000000000..c9d6ec08376
--- /dev/null
+++ b/src/solver/opamCudfCriteria.mli
@@ -0,0 +1,37 @@
+(**************************************************************************)
+(* *)
+(* Copyright 2017-2019 OCamlPro *)
+(* *)
+(* All rights reserved. This file is distributed under the terms of the *)
+(* GNU Lesser General Public License version 2.1, with the special *)
+(* exception on linking described in the file LICENSE. *)
+(* *)
+(**************************************************************************)
+
+(** Cudf criteria helpers *)
+
+(* {2 Criterion types} *)
+type filter =
+ | Installed
+ | Solution
+ | Changed
+ | Removed
+ | New
+ | Upgraded
+ | Downgraded
+ | Requested
+
+type property = string option
+
+type sign = Plus | Minus
+
+type criterion = sign * filter * property
+
+(* {2 String conversion} *)
+
+val criterion_to_string : criterion -> string
+
+(** [of_string s] Parses the string [s] as a CUDF optimization criteria.
+
+ @raise {!Stdlib.Failure} if the string is invalid *)
+val of_string : string -> criterion list
---|