123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265(**************************************************************************)(* *)(* Copyright 2015-2020 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+=|ASSUMEDEPEXTSofbooloption|AUTOREMOVEofbooloption|CLIofstringoption|DROPWORKINGDIRofbooloption|EDITORofstringoption|FAKEofbooloption|IGNOREPINDEPENDSofbooloption|INPLACEBUILDofbooloption|JSONofstringoption|KEEPBUILDDIRofbooloption|NOAGGREGATEofbooloption|NOAUTOUPGRADEofbooloption|NOSELFUPGRADEofstringoption|PINKINDAUTOofbooloption|REUSEBUILDDIRofbooloption|ROOTISOKofbooloption|SHOWofbooloption|SKIPUPDATEofbooloption|STATSofbooloption|WORKINGDIRofbooloptionopenOpamStd.Config.Eletassumedepexts=value(functionASSUMEDEPEXTSb->b|_->None)letautoremove=value(functionAUTOREMOVEb->b|_->None)letcli=value(functionCLIs->s|_->None)letdropworkingdir=value(functionDROPWORKINGDIRb->b|_->None)leteditor=value(functionEDITORs->s|_->None)letfake=value(functionFAKEb->b|_->None)letignorepindepends=value(functionIGNOREPINDEPENDSb->b|_->None)letinplacebuild=value(functionINPLACEBUILDb->b|_->None)letjson=value(functionJSONs->s|_->None)letkeepbuilddir=value(functionKEEPBUILDDIRb->b|_->None)letnoaggregate=value(functionNOAGGREGATEb->b|_->None)letnoautoupgrade=value(functionNOAUTOUPGRADEb->b|_->None)letnoselfupgrade=value(functionNOSELFUPGRADEs->s|_->None)letpinkindauto=value(functionPINKINDAUTOb->b|_->None)letreusebuilddir=value(functionREUSEBUILDDIRb->b|_->None)letrootisok=value(functionROOTISOKb->b|_->None)letshow=value(functionSHOWb->b|_->None)letskipupdate=value(functionSKIPUPDATEb->b|_->None)letstats=value(functionSTATSb->b|_->None)letworkingdir=value(functionWORKINGDIRb->b|_->None)endtypet={print_stats:bool;pin_kind_auto:bool;autoremove:bool;editor:string;keep_build_dir:bool;reuse_build_dir:bool;inplace_build:bool;working_dir:bool;drop_working_dir:bool;ignore_pin_depends:bool;show:bool;fake:bool;skip_dev_update:bool;json_out:stringoption;root_is_ok:bool;no_auto_upgrade:bool;assume_depexts:bool;cli:OpamCLIVersion.t;scrubbed_environment_variables:stringlist;}letdefault={print_stats=false;pin_kind_auto=true;autoremove=false;editor="nano";keep_build_dir=false;reuse_build_dir=false;inplace_build=false;working_dir=false;drop_working_dir=false;ignore_pin_depends=false;show=false;fake=false;skip_dev_update=false;json_out=None;root_is_ok=false;no_auto_upgrade=false;assume_depexts=false;cli=OpamCLIVersion.current;scrubbed_environment_variables=[];}type'aoptions_fun=?print_stats:bool->?pin_kind_auto:bool->?autoremove:bool->?editor:string->?keep_build_dir:bool->?reuse_build_dir:bool->?inplace_build:bool->?working_dir:bool->?drop_working_dir:bool->?ignore_pin_depends:bool->?show:bool->?fake:bool->?skip_dev_update:bool->?json_out:stringoption->?root_is_ok:bool->?no_auto_upgrade:bool->?assume_depexts:bool->?cli:OpamCLIVersion.t->?scrubbed_environment_variables:stringlist->'aletsetkkt?print_stats?pin_kind_auto?autoremove?editor?keep_build_dir?reuse_build_dir?inplace_build?working_dir?drop_working_dir?ignore_pin_depends?show?fake?skip_dev_update?json_out?root_is_ok?no_auto_upgrade?assume_depexts?cli?scrubbed_environment_variables=let(+)xopt=matchoptwithSomex->x|None->xink{print_stats=t.print_stats+print_stats;pin_kind_auto=t.pin_kind_auto+pin_kind_auto;autoremove=t.autoremove+autoremove;editor=t.editor+editor;keep_build_dir=t.keep_build_dir+keep_build_dir;reuse_build_dir=t.reuse_build_dir+reuse_build_dir;inplace_build=t.inplace_build+inplace_build;working_dir=t.working_dir+working_dir;drop_working_dir=t.drop_working_dir+drop_working_dir;ignore_pin_depends=t.ignore_pin_depends+ignore_pin_depends;show=t.show+show;fake=t.fake+fake;skip_dev_update=t.skip_dev_update+skip_dev_update;json_out=t.json_out+json_out;root_is_ok=t.root_is_ok+root_is_ok;no_auto_upgrade=t.no_auto_upgrade+no_auto_upgrade;assume_depexts=t.assume_depexts+assume_depexts;cli=t.cli+cli;scrubbed_environment_variables=t.scrubbed_environment_variables+scrubbed_environment_variables}letsett=setk(funx()->x)tletr=refdefaultletupdate?noop:_=setk(funcfg()->r:=cfg)!rletinitkk=letopenOpamStd.Option.OpinRandom.self_init();leteditor=E.editor()++OpamStd.Env.(getopt"VISUAL"++getopt"EDITOR")insetk(setk(func->r:=c;k))!r?print_stats:(E.stats())?pin_kind_auto:(E.pinkindauto())?autoremove:(E.autoremove())?editor?keep_build_dir:(E.keepbuilddir())?reuse_build_dir:(E.reusebuilddir())?inplace_build:(E.inplacebuild())?working_dir:(E.workingdir())?drop_working_dir:(E.dropworkingdir())?ignore_pin_depends:(E.ignorepindepends())?show:(E.show())?fake:(E.fake())?skip_dev_update:(E.skipupdate())?json_out:(E.json()>>|function""->None|s->Somes)?root_is_ok:(E.rootisok())?no_auto_upgrade:(E.noautoupgrade())?assume_depexts:(E.assumedepexts())?cli:None?scrubbed_environment_variables:Noneletinit?noop:_=initk(fun()->())letsearch_files=["findlib"]openOpamStd.Opletopam_init?root_dir?strict?solver=letopenOpamStd.Option.Opin(* (i) get root dir *)letroot=OpamStateConfig.opamroot?root_dir()in(* (ii) load conf file and set defaults *)(* the init for OpamFormat is done in advance since (a) it has an effect on
loading the global config (b) the global config has no effect on it *)OpamFormatConfig.initk?strict@@fun?log_dir->letconfig=OpamStateConfig.load_defaults~lock_kind:`Lock_readrootinletinitialised=config<>Nonein(* !X fixme: don't drop the loaded config file to reload it afterwards (when
loading the global_state) like that... *)letsolver=ifsolver=None&&OpamSolverConfig.E.externalsolver()=Nonethen(* fixme: in order to not revert config file solver value, we need to
check it here *)(config>>=OpamFile.Config.solver>>|funs->lazy(OpamCudfSolver.custom_solvers))elsesolverinbeginmatchconfigwith|None->()|Someconf->letcriteriakind=letc=OpamFile.Config.criteriaconfintrySome(List.assockindc)withNot_found->NoneinOpamSolverConfig.update?solver?solver_preferences_default:(criteria`Default>>|funs->lazy(Somes))?solver_preferences_upgrade:(criteria`Upgrade>>|funs->lazy(Somes))?solver_preferences_fixup:(criteria`Fixup>>|funs->lazy(Somes))?solver_preferences_best_effort_prefix:(OpamFile.Config.best_effort_prefixconf>>|funs->lazy(Somes))();OpamStateConfig.update()end;(* (iii) load from env and options using OpamXxxConfig.init *)letlog_dir=OpamStd.Option.mapOpamFilename.Dir.to_string@@iflog_dir=None&&initialised&&OpamCoreConfig.E.logs()=Nonethen(* fixme: in order to not revert [OPAMLOGS] value,
we need to check it here *)Some(OpamPath.logroot)elselog_dirin(fun()->())|>OpamCoreConfig.initk?log_dir|>OpamRepositoryConfig.initk|>OpamSolverConfig.initk?solver|>OpamStateConfig.initk~root_dir:root|>initk