123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205(**************************************************************************)(* *)(* Copyright 2015 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. *)(* *)(**************************************************************************)openOpamTypestypet={root_dir:OpamFilename.Dir.t;current_switch:OpamSwitch.toption;switch_from:[`Env|`Command_line|`Default];jobs:intLazy.t;dl_jobs:int;build_test:bool;build_doc:bool;dryrun:bool;makecmd:stringLazy.t;ignore_constraints_on:name_set;unlock_base:bool;no_env_notice:bool;locked:stringoption;}letdefault={root_dir=OpamFilename.(concat_and_resolve(Dir.of_string(OpamStd.Sys.home()))".opam");current_switch=None;switch_from=`Default;jobs=lazy(max1(OpamSystem.cpu_count()-1));dl_jobs=3;build_test=false;build_doc=false;dryrun=false;makecmd=lazyOpamStd.Sys.(matchos()with|FreeBSD|OpenBSD|NetBSD|DragonFly->"gmake"|_->"make");ignore_constraints_on=OpamPackage.Name.Set.empty;unlock_base=false;no_env_notice=false;locked=None;}type'aoptions_fun=?root_dir:OpamFilename.Dir.t->?current_switch:OpamSwitch.t->?switch_from:[`Env|`Command_line|`Default]->?jobs:(intLazy.t)->?dl_jobs:int->?build_test:bool->?build_doc:bool->?dryrun:bool->?makecmd:stringLazy.t->?ignore_constraints_on:name_set->?unlock_base:bool->?no_env_notice:bool->?locked:stringoption->'aletsetkkt?root_dir?current_switch?switch_from?jobs?dl_jobs?build_test?build_doc?dryrun?makecmd?ignore_constraints_on?unlock_base?no_env_notice?locked=let(+)xopt=matchoptwithSomex->x|None->xink{root_dir=t.root_dir+root_dir;current_switch=(matchcurrent_switchwithNone->t.current_switch|s->s);switch_from=t.switch_from+switch_from;jobs=t.jobs+jobs;dl_jobs=t.dl_jobs+dl_jobs;build_test=t.build_test+build_test;build_doc=t.build_doc+build_doc;dryrun=t.dryrun+dryrun;makecmd=t.makecmd+makecmd;ignore_constraints_on=t.ignore_constraints_on+ignore_constraints_on;unlock_base=t.unlock_base+unlock_base;no_env_notice=t.no_env_notice+no_env_notice;locked=t.locked+locked;}letsett=setk(funx()->x)tletr=refdefaultletupdate?noop:_=setk(funcfg()->r:=cfg)!rletinitkk=letopenOpamStd.ConfiginletopenOpamStd.Option.Opinletcurrent_switch,switch_from=matchenv_string"SWITCH"with|Some""|None->None,None|Somes->Some(OpamSwitch.of_strings),Some`Envinsetk(setk(func->r:=c;k))!r?root_dir:(env_string"ROOT">>|OpamFilename.Dir.of_string)?current_switch?switch_from?jobs:(env_int"JOBS">>|funs->lazys)?dl_jobs:(env_int"DOWNLOADJOBS")?build_test:(env_bool"WITHTEST"++env_bool"BUILDTEST")?build_doc:(env_bool"WITHDOC"++env_bool"BUILDDOC")?dryrun:(env_bool"DRYRUN")?makecmd:(env_string"MAKECMD">>|funs->lazys)?ignore_constraints_on:(env_string"IGNORECONSTRAINTS">>|funs->OpamStd.String.splits','|>List.mapOpamPackage.Name.of_string|>OpamPackage.Name.Set.of_list)?unlock_base:(env_bool"UNLOCKBASE")?no_env_notice:(env_bool"NOENVNOTICE")?locked:(env_string"LOCKED">>|function""->None|s->Somes)letinit?noop:_=initk(fun()->())letopamroot?root_dir()=letopenOpamStd.Option.Opin(root_dir>>+fun()->OpamStd.Env.getopt"OPAMROOT">>|OpamFilename.Dir.of_string)+!default.root_dirletloadopamroot=OpamFile.Config.read_opt(OpamPath.configopamroot)letlocal_switch_existsrootswitch=OpamPath.Switch.switch_configrootswitch|>OpamFile.Switch_config.read_opt|>function|None->false|Someconf->conf.OpamFile.Switch_config.opam_root=Somerootletresolve_local_switchroots=letswitch_root=OpamSwitch.get_rootrootsinifOpamSwitch.is_externals&&OpamFilename.dirname_dirswitch_root=rootthenOpamSwitch.of_string(OpamFilename.remove_prefix_dirrootswitch_root)elsesletget_current_switch_from_cwdroot=letopenOpamStd.Option.OpinOpamFilename.find_in_parents(fundir->OpamSwitch.of_string(OpamFilename.Dir.to_stringdir)|>local_switch_existsroot)(OpamFilename.cwd())>>|OpamSwitch.of_dirname>>|resolve_local_switchrootletload_defaultsroot_dir=letcurrent_switch=matchOpamStd.Config.env_string"SWITCH"with|Some""|None->get_current_switch_from_cwdroot_dir|_->(* OPAMSWITCH is set, no need to lookup *)Noneinmatchloadroot_dirwith|None->update?current_switch();None|Someconf->letopenOpamStd.Option.OpinOpamRepositoryConfig.update?download_tool:(OpamFile.Config.dl_toolconf>>|function|(CStringc,None)::_astwhenOpamStd.String.ends_with~suffix:"curl"c->lazy(t,`Curl)|t->lazy(t,`Default))~validation_hook:(OpamFile.Config.validation_hookconf)();update?current_switch:(OpamFile.Config.switchconf)~switch_from:`Default~jobs:(lazy(OpamFile.Config.jobsconf))~dl_jobs:(OpamFile.Config.dl_jobsconf)();update?current_switch();Someconfletget_switch_opt()=match!r.current_switchwith|Somes->Some(resolve_local_switch!r.root_dirs)|None->Noneletget_switch()=matchget_switch_opt()with|Somes->s|None->OpamConsole.error_and_exit`Configuration_error"No switch is currently set. Please use 'opam switch' to set or install \
a switch"