123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316(**************************************************************************)(* *)(* 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. *)(* *)(**************************************************************************)openOpamTypes[@@@ocaml.warning"-33"]openOpamDoseCompatincludeOpamCudfSolverSigletdefault_compat_criteria={crit_default="-removed,-notuptodate,-changed";crit_upgrade="-removed,-notuptodate,-changed";crit_fixup="-changed,-notuptodate";crit_best_effort_prefix=None;}moduletypeExternalArg=sigvalname:stringvalis_present:boolLazy.tvalcommand_name:stringvalcommand_args:OpamTypes.arglistvaldefault_criteria:criteria_defendletcall_external_solvercommand~criteria?timeout(_,universe,_ascudf)=letsolver_in=OpamFilename.of_string(OpamSystem.temp_file"solver-in")inletsolver_out=OpamFilename.of_string(OpamSystem.temp_file"solver-out")intrylet_=letoc=OpamFilename.open_outsolver_ininCudf_printer.pp_cudfoccudf;close_outocinlet()=letcmd=OpamFilter.single_command(funv->ifnot(OpamVariable.Full.is_globalv)thenNoneelsematchOpamVariable.to_string(OpamVariable.Full.variablev)with|"input"->Some(S(OpamFilename.to_stringsolver_in))|"output"->Some(S(OpamFilename.to_stringsolver_out))|"criteria"->Some(Scriteria)|"timeout"->Some(S(string_of_float(OpamStd.Option.default0.timeout)))|_->None)commandinOpamSystem.command~verbose:(OpamCoreConfig.(abs!r.debug_level>=2))cmdinOpamFilename.removesolver_in;ifnot(OpamFilename.existssolver_out)thenraise(Dose_common.CudfSolver.Error"no output")elseif(letic=OpamFilename.open_insolver_outintryleti=input_lineicinclose_inic;i="FAIL"withEnd_of_file->close_inic;false)thenraiseDose_common.CudfSolver.Unsatelseletr=Cudf_parser.load_solution_from_file(OpamFilename.to_stringsolver_out)universeinOpamFilename.removesolver_out;rwithe->OpamStd.Exn.finalisee@@fun()->OpamFilename.removesolver_in;OpamFilename.removesolver_outmoduleExternal(E:ExternalArg):S=structletname=E.nameletext=refNoneletis_present()=Lazy.forceE.is_presentletcommand_name=SomeE.command_nameletdefault_criteria=E.default_criterialetcall=call_external_solver((CStringE.command_name,None)::E.command_args)endmoduleAspcud_def=structletname="aspcud"letcommand_name="aspcud"letis_present=lazy(matchOpamSystem.resolve_commandcommand_namewith|None->false|Somecmd->trymatchOpamSystem.read_command_output~verbose:false~allow_stdin:false[cmd;"-v"]with|[]->false|s::_->matchOpamStd.String.splits' 'with|"aspcud"::_::v::_whenOpamVersionCompare.comparev"1.9">=0->OpamConsole.log"SOLVER""Solver is aspcud >= 1.9: using latest version criteria";true|_->falsewithOpamSystem.Process_error_->false)letcommand_args=[CIdent"input",None;CIdent"output",None;CIdent"criteria",None]letdefault_criteria={crit_default="-count(removed),\
-sum(solution,avoid-version),\
-sum(request,version-lag),\
-count(down),\
-sum(solution,version-lag),\
-count(changed),\
-sum(solution,missing-depexts)";crit_upgrade="-count(down),\
-count(removed),\
-sum(solution,avoid-version),\
-sum(solution,version-lag),\
-sum(solution,missing-depexts),\
-count(new)";crit_fixup="-count(changed),\
-count[avoid-version:,true],\
-notuptodate(solution),\
-sum(solution,version-lag),\
-count[missing-depexts:,true]";crit_best_effort_prefix=Some"+sum(solution,opam-query),";}endmoduleAspcud=External(Aspcud_def)moduleAspcud_old_def=structletname="aspcud-old"letcommand_name=Aspcud_def.command_nameletis_present=lazy(OpamSystem.resolve_commandcommand_name<>None)letcommand_args=Aspcud_def.command_argsletdefault_criteria=default_compat_criteriaendmoduleAspcud_old=External(Aspcud_old_def)moduleMccs_def=structletname="mccs"letcommand_name="mccs"letis_present=lazy(OpamSystem.resolve_commandcommand_name<>None)letcommand_args=[CString"-i",None;CIdent"input",None;CString"-o",None;CIdent"output",None;CString"-lexagregate[%{criteria}%]",None;]letdefault_criteria={crit_default="-removed,\
-count[avoid-version:,true],\
-count[version-lag:,true],\
-changed,\
-count[version-lag:,false],\
-count[missing-depexts:,true],\
-new";crit_upgrade="-removed,\
-count[avoid-version:,true],\
-count[version-lag:,false],\
-count[missing-depexts:,true],\
-new";crit_fixup="-changed,\
-count[avoid-version:,true],\
-count[version-lag:,false],\
-count[missing-depexts:,true]";crit_best_effort_prefix=Some"+count[opam-query:,false],";}endmoduleMccs=External(Mccs_def)modulePackup_def=structletname="packup"letcommand_name="packup"letis_present=lazy(OpamSystem.resolve_commandcommand_name<>None)letcommand_args=[CIdent"input",None;CIdent"output",None;CString"-u",None;CIdent"criteria",None;]letdefault_criteria=default_compat_criteriaendmodulePackup=External(Packup_def)letmake_custom_solvernameargscriteria=(module(External(structletcommand_name=nameletname=name^"-custom"letis_present=lazytrueletcommand_args=argsletdefault_criteria=criteriaend)):S)letdefault_solver_selection=OpamBuiltinMccs.all_backends@[(moduleOpamBuiltinZ3:S);(moduleOpamBuiltin0install:S);(moduleAspcud:S);(moduleMccs:S);(moduleAspcud_old:S);(modulePackup:S);]letextract_solver_paramname=ifOpamStd.String.ends_with~suffix:")"namethenmatchOpamStd.String.cut_atname'('with|Some(xname,ext2)->xname,Some(OpamStd.String.remove_suffix~suffix:")"ext2)|None->name,Noneelsename,Noneletcustom_solvercmd=matchcmdwith|[CIdentname,_]|[CStringname,_]->(tryletxname,ext=extract_solver_paramnameinList.find(fun(moduleS:S)->letn,_=extract_solver_paramS.namein(n=xname||n=Filename.basenamexname||S.command_name=Somename)&&(ifext<>NonethenS.ext:=ext;S.is_present()))default_solver_selectionwithNot_found->OpamConsole.error_and_exit`Configuration_error"No installed solver matching the selected '%s' found"name)|((CIdentname|CStringname),_)::args->letcriteria=tryletcorresponding_module=List.find(fun(moduleS:S)->S.command_name=Some(Filename.basenamename)&&S.is_present())default_solver_selectioninletmoduleS=(valcorresponding_module)inS.default_criteriawithNot_found->default_compat_criteriainmake_custom_solvernameargscriteria|_->OpamConsole.error_and_exit`Configuration_error"Invalid custom solver command specified."letsolver_of_strings=letargs=OpamStd.String.splits' 'in(custom_solver(List.map(funa->OpamTypes.CStringa,None)args))lethas_builtin_solver()=List.exists(fun(moduleS:S)->S.command_name=None&&S.is_present())default_solver_selectionletget_solver?internall=tryList.find(fun(moduleS:S)->(internal=None||internal=Some(S.command_name=None))&&S.is_present())lwithNot_found->OpamConsole.error_and_exit`Configuration_error"No available solver found. Make sure your solver configuration is \
correct. %s"(ifhas_builtin_solver()then"You can enforce use of the built-in solver with \
`--use-internal-solver'."else"This opam has been compiled without a built-in solver, so you need \
to install and configure an external one. See \
http://opam.ocaml.org/doc/Install.html#ExternalSolvers for details.")letget_name(moduleS:S)=letname,ext0=extract_solver_paramS.nameinmatch!S.ext,ext0with|Somee,_|None,Somee->Printf.sprintf"%s(%s)"namee|None,None->name