123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253(**************************************************************************)(* *)(* Copyright 2015-2018 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. *)(* *)(**************************************************************************)moduleE=structtypeOpamStd.Config.E.t+=|BESTEFFORTofbooloption|BESTEFFORTPREFIXCRITERIAofstringoption|CRITERIAofstringoption|CUDFFILEofstringoption|CUDFTRIMofstringoption|DIGDEPTHofintoption|EXTERNALSOLVERofstringoption|FIXUPCRITERIAofstringoption|NOASPCUDofbooloption|PREPROofbooloption|SOLVERALLOWSUBOPTIMALofbooloption|SOLVERTIMEOUToffloatoption|UPGRADECRITERIAofstringoption|USEINTERNALSOLVERofbooloption|VERSIONLAGPOWERofintoptionopenOpamStd.Config.Eletbesteffort=value(functionBESTEFFORTb->b|_->None)letbesteffortprefixcriteria=value(functionBESTEFFORTPREFIXCRITERIAs->s|_->None)letcriteria=value(functionCRITERIAs->s|_->None)letcudffile=value(functionCUDFFILEs->s|_->None)letcudftrim=value(functionCUDFTRIMs->s|_->None)letdigdepth=value(functionDIGDEPTHi->i|_->None)letexternalsolver=value(functionEXTERNALSOLVERs->s|_->None)letfixupcriteria=value(functionFIXUPCRITERIAs->s|_->None)letnoaspcud=value(functionNOASPCUDb->b|_->None)letprepro=value(functionPREPROb->b|_->None)letsolverallowsuboptimal=value(functionSOLVERALLOWSUBOPTIMALb->b|_->None)letsolvertimeout=value(functionSOLVERTIMEOUTf->f|_->None)letuseinternalsolver=value(functionUSEINTERNALSOLVERb->b|_->None)letupgradecriteria=value(functionUPGRADECRITERIAs->s|_->None)letversionlagpower=value(functionVERSIONLAGPOWERi->i|_->None)endtypet={cudf_file:stringoption;solver:(moduleOpamCudfSolver.S)Lazy.t;best_effort:bool;(* The following are options because the default can only be known once the
solver is known, so we set it only if no customisation was made *)solver_preferences_default:stringoptionLazy.t;solver_preferences_upgrade:stringoptionLazy.t;solver_preferences_fixup:stringoptionLazy.t;solver_preferences_best_effort_prefix:stringoptionLazy.t;solver_timeout:floatoption;solver_allow_suboptimal:bool;cudf_trim:stringoption;dig_depth:int;preprocess:bool;version_lag_power:int;}type'aoptions_fun=?cudf_file:stringoption->?solver:((moduleOpamCudfSolver.S)Lazy.t)->?best_effort:bool->?solver_preferences_default:stringoptionLazy.t->?solver_preferences_upgrade:stringoptionLazy.t->?solver_preferences_fixup:stringoptionLazy.t->?solver_preferences_best_effort_prefix:stringoptionLazy.t->?solver_timeout:floatoption->?solver_allow_suboptimal:bool->?cudf_trim:stringoption->?dig_depth:int->?preprocess:bool->?version_lag_power:int->'aletdefault=letsolver=lazy(OpamCudfSolver.get_solverOpamCudfSolver.default_solver_selection)in{cudf_file=None;solver;best_effort=false;solver_preferences_default=lazyNone;solver_preferences_upgrade=lazyNone;solver_preferences_fixup=lazyNone;solver_preferences_best_effort_prefix=lazyNone;solver_timeout=Some60.;solver_allow_suboptimal=true;cudf_trim=None;dig_depth=2;preprocess=true;version_lag_power=1;}letsetkkt?cudf_file?solver?best_effort?solver_preferences_default?solver_preferences_upgrade?solver_preferences_fixup?solver_preferences_best_effort_prefix?solver_timeout?solver_allow_suboptimal?cudf_trim?dig_depth?preprocess?version_lag_power=let(+)xopt=matchoptwithSomex->x|None->xink{cudf_file=t.cudf_file+cudf_file;solver=t.solver+solver;best_effort=t.best_effort+best_effort;solver_preferences_default=t.solver_preferences_default+solver_preferences_default;solver_preferences_upgrade=t.solver_preferences_upgrade+solver_preferences_upgrade;solver_preferences_fixup=t.solver_preferences_fixup+solver_preferences_fixup;solver_preferences_best_effort_prefix=t.solver_preferences_best_effort_prefix+solver_preferences_best_effort_prefix;solver_timeout=t.solver_timeout+solver_timeout;solver_allow_suboptimal=t.solver_allow_suboptimal+solver_allow_suboptimal;cudf_trim=t.cudf_trim+cudf_trim;dig_depth=t.dig_depth+dig_depth;preprocess=t.preprocess+preprocess;version_lag_power=t.version_lag_power+version_lag_power;}letsett=setk(funx()->x)tletr=refdefaultletupdate?noop:_=setk(funcfg()->r:=cfg)!rletwith_auto_criteriaconfig=letcriteria=lazy(letmoduleS=(valLazy.forceconfig.solver)inS.default_criteria)insetconfig~solver_preferences_default:(lazy(matchconfig.solver_preferences_defaultwith|lazyNone->Some(Lazy.forcecriteria).OpamCudfSolver.crit_default|lazysome->some))~solver_preferences_upgrade:(lazy(matchconfig.solver_preferences_upgradewith|lazyNone->Some(Lazy.forcecriteria).OpamCudfSolver.crit_upgrade|lazysome->some))~solver_preferences_fixup:(lazy(matchconfig.solver_preferences_fixupwith|lazyNone->Some(Lazy.forcecriteria).OpamCudfSolver.crit_fixup|lazysome->some))~solver_preferences_best_effort_prefix:(lazy(matchconfig.solver_preferences_best_effort_prefixwith|lazyNone->(Lazy.forcecriteria).OpamCudfSolver.crit_best_effort_prefix|lazysome->some))()letinitkk=letopenOpamStd.Option.Opinletsolver=letopenOpamCudfSolverinmatchE.externalsolver()with|Some""->lazy(get_solver~internal:truedefault_solver_selection)|Somes->lazy(solver_of_strings)|None->letinternal=E.useinternalsolver()++E.noaspcud()inlazy(get_solver?internaldefault_solver_selection)inletcriteria=E.criteria()>>|func->lazy(Somec)inletupgrade_criteria=(E.upgradecriteria()>>|func->lazy(Somec))++criteriainletfixup_criteria=E.fixupcriteria()>>|func->(lazy(Somec))inletbest_effort_prefix_criteria=E.besteffortprefixcriteria()>>|func->(lazy(Somec))inletsolver_timeout=E.solvertimeout()>>|funf->iff<=0.thenNoneelseSomefinsetk(setk(func->r:=with_auto_criteriac;k))!r~cudf_file:(E.cudffile())~solver?best_effort:(E.besteffort())?solver_preferences_default:criteria?solver_preferences_upgrade:upgrade_criteria?solver_preferences_fixup:fixup_criteria?solver_preferences_best_effort_prefix:best_effort_prefix_criteria?solver_timeout?solver_allow_suboptimal:(E.solverallowsuboptimal())~cudf_trim:(E.cudftrim())?dig_depth:(E.digdepth())?preprocess:(E.prepro())?version_lag_power:(E.versionlagpower())letinit?noop:_=initk(fun()->())letbest_effort=letr=lazy(!r.best_effort&&letcrit=matchLazy.force!r.solver_preferences_defaultwith|Somec->c|None->failwith"Solver criteria uninitialised"inletpfx=Lazy.force!r.solver_preferences_best_effort_prefixinpfx<>None||OpamStd.String.contains~sub:"opam-query"crit||(OpamConsole.warning"Your solver configuration does not support --best-effort, the option \
was ignored (you need to specify variable OPAMBESTEFFORTCRITERIA, or \
set your criteria to maximise the count for cudf attribute \
'opam-query')";false))infun()->Lazy.forcerletcriteriakind=letcrit=matchkindwith|`Default->!r.solver_preferences_default|`Upgrade->!r.solver_preferences_upgrade|`Fixup->!r.solver_preferences_fixupinletstr=matchLazy.forcecritwith|Somec->c|None->failwith"Solver criteria uninitialised"inif!r.best_effortthenmatch!r.solver_preferences_best_effort_prefixwith|lazy(Somepfx)->pfx^str|lazyNone->strelsestrletcall_solver~criteriacudf=letmoduleS=(valLazy.force(!r.solver))inOpamConsole.log"SOLVER""Calling solver %s with criteria %s"(OpamCudfSolver.get_name(moduleS))criteria;S.call~criteria?timeout:(!r.solver_timeout)cudf