Module OpamFilter
Formulas on variables, as used in opam files build scripts
Filters are a small language of formulas over strings and booleans used for conditions and text replacements. It has relational operators over strings (using version-number comparison), And, Or and Not boolean operations, dynamic casting (using strings "true" and "false"), and string interpolation. Variables are resolved using a user function returning an option, undefined values are propagated.
String interpolation uses the syntax %{identifier}%
Identifiers have the form
[package:]var[?str_if_true:str_if_false_or_undef]
The last optional part specifies a conversion from boolean to static strings.
The syntax pkg1+pkg2+pkgn:var
is allowed as a shortcut to pkg1:var & pkg2:var & pkgn:var
.
The special variable pkg:enable
is allowed as a shortcut for pkg:installed?enable:disable
val to_string : OpamTypes.filter -> string
Pretty-print
val fold_down_left : ('a -> OpamTypes.filter -> 'a) -> 'a -> OpamTypes.filter -> 'a
Folds on the tree of a filter
val map_up : (OpamTypes.filter -> OpamTypes.filter) -> OpamTypes.filter -> OpamTypes.filter
Maps on all nodes of a filter, bottom-up
val variables : OpamTypes.filter -> OpamTypes.full_variable list
Returns all the variables appearing in a filter (including the ones within string interpolations
type env
= OpamTypes.full_variable -> OpamTypes.variable_contents option
Type of filter environment.
type fident
= OpamTypes.name option list * OpamTypes.variable * (string * string) option
The type of filter idents with (optionally multiple) qualifying package names and optional string converter. Package name
None
encodes the self-reference_
val map_variables : (OpamTypes.full_variable -> OpamTypes.full_variable) -> OpamTypes.filter -> OpamTypes.filter
Maps on all variables appearing in a filter. The case where package variables are renamed differently and appear in a filter ident of the form
%{pkg1+pkg2:var}%
is not supported and raisesInvalid_argument
.
val map_variables_in_string : (OpamTypes.full_variable -> OpamTypes.full_variable) -> string -> string
Same limitation as
map_variables
val map_variables_in_fident : (OpamTypes.full_variable -> OpamTypes.full_variable) -> fident -> fident
Does not handle rewriting the variables to different names (which can't be expressed with a
fident
anymore), and raisesInvalid_argument
val distribute_negations : ?neg:bool -> OpamTypes.filter -> OpamTypes.filter
Distributes the negations to apply only to atoms
val expand_string : ?partial:bool -> ?default:(string -> string) -> env -> string -> string
Rewrites string interpolations within a string.
default
is applied to the fident string (e.g. what's between%{
and}%
) when the expansion is undefined. If unspecified, this raisesFailure
.With
partial
,default
defaults to the identity, and is otherwise expected to return a fident. In this case, the returned string is supposed to be expanded again (expansion results are escaped, escapes are otherwise kept). This makes the function idempotent
val unclosed_expansions : string -> ((int * int) * string) list
Returns the (beginning, end) offsets and substrings of any unclosed
%{
expansions
val eval : ?default:OpamTypes.variable_contents -> env -> OpamTypes.filter -> OpamTypes.variable_contents
Computes the value of a filter. May raise
Failure
ifdefault
isn't provided
val eval_to_bool : ?default:bool -> env -> OpamTypes.filter -> bool
Like
eval
but casts the result to a bool. RaisesInvalid_argument
if not a valid bool and no default supplied.
val opt_eval_to_bool : env -> OpamTypes.filter option -> bool
Same as
eval_to_bool
, but takes an option as filter and returns alwaystrue
onNone
,false
when the filter isUndefined
. This is the most common behaviour for using "filters" for filtering
val eval_to_string : ?default:string -> env -> OpamTypes.filter -> string
Like
eval
but casts the result to a string
val partial_eval : env -> OpamTypes.filter -> OpamTypes.filter
Reduces what can be, keeps the rest unchanged
val ident_of_var : OpamTypes.full_variable -> fident
Wraps a full_variable into a fident accessor
val ident_of_string : string -> fident
A fident accessor directly referring a variable with the given name
val ident_value : ?default:OpamTypes.variable_contents -> env -> fident -> OpamTypes.variable_contents
Resolves a filter ident. Like
eval
, may raise Failure if no default is provided
val ident_string : ?default:string -> env -> fident -> string
Like
ident_value
, but casts the result to a string
val ident_bool : ?default:bool -> env -> fident -> bool
Like
ident_value
, but casts the result to a bool
val expand_interpolations_in_file : env -> OpamTypes.basename -> unit
Rewrites
basename
.in tobasename
, expanding interpolations
val commands : env -> OpamTypes.command list -> string list list
Processes filters evaluation in a command list: parameter expansion and conditional filtering
val single_command : env -> OpamTypes.arg list -> string list
Process a simpler command, without filters
val commands_variables : OpamTypes.command list -> OpamTypes.full_variable list
Extracts variables appearing in a list of commands
val of_formula : ('a -> OpamTypes.filter) -> 'a OpamTypes.generic_formula -> OpamTypes.filter
Converts a generic formula to a filter, given a converter for atoms
val filter_formula : ?default_version:OpamTypes.version -> ?default:bool -> env -> OpamTypes.filtered_formula -> OpamTypes.formula
Resolves the filter in a filtered formula, reducing to a pure formula.
default
is the assumed result for undefined filters. If a version filter doesn't resolve to a valid version, the constraint is dropped unlessdefault_version
is specified.May raise, as other filter functions, if
default
is not provided and filters don't resolve.
val partial_filter_formula : env -> OpamTypes.filtered_formula -> OpamTypes.filtered_formula
Reduces according to what is defined in
env
, and returns the simplified formula
val gen_filter_formula : ('a -> [< `True | `False | `Formula of 'b OpamTypes.generic_formula ]) -> ('c * 'a) OpamFormula.formula -> ('c * 'b OpamTypes.generic_formula) OpamFormula.formula
A more generic formula reduction function, that takes a "partial resolver" as argument
val string_of_filtered_formula : OpamTypes.filtered_formula -> string
val variables_of_filtered_formula : OpamTypes.filtered_formula -> OpamTypes.full_variable list
val filter_deps : build:bool -> post:bool -> ?test:bool -> ?doc:bool -> ?dev:bool -> ?default_version:OpamTypes.version -> ?default:bool -> OpamTypes.filtered_formula -> OpamTypes.formula
Resolves the build, post, test, doc, dev flags in a filtered formula (which is supposed to have been pre-processed to remove switch and global variables).
default
determines the behaviour on undefined filters, and the function may raise if it is undefined. If a constraint resolves to an invalid version, it is dropped, or replaced withdefault_version
if specified. If test, doc or dev are unspecified, they are assumed to be filtered out already and encountering them will raise an assert.
val deps_var_env : build:bool -> post:bool -> ?test:bool -> ?doc:bool -> ?dev:bool -> env
The environment used in resolving the dependency filters, as per
filter_deps
.
val simplify_extended_version_formula : OpamTypes.filter OpamTypes.filter_or_constraint OpamFormula.formula -> OpamTypes.filter OpamTypes.filter_or_constraint OpamFormula.formula option
Like
OpamFormula.simplify_version_formula
, but on filtered formulas (filters are kept unchanged, but put in front)
val atomise_extended : OpamTypes.filtered_formula -> (OpamPackage.Name.t * (OpamTypes.filter * (OpamTypes.relop * OpamTypes.filter) option)) OpamFormula.formula