123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120(**************************************************************************)(* *)(* This file is part of the why3find. *)(* *)(* Copyright (C) 2022-2024 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the enclosed LICENSE.md for details. *)(* *)(**************************************************************************)typeconfig={fast:float;time:float;depth:int;packages:stringlist;provers:stringlist;tactics:stringlist;drivers:stringlist;warnoff:stringlist;preprocess:stringoption;profile:Json.toption;(* We'll keep it like that for now *)}letconf_file="why3find.json"letload_raw_configp=letp=Filename.concatpconf_fileinifSys.file_existspthenJson.of_filepelse`Nullletget~of_json~defaultnamejson=tryof_json(Json.jfield_exnnamejson)with|Not_found->defaultletgetsname?(default=[])json=get~of_json:Json.jstringlist~defaultnamejsonletconfig_of_jsonjson=ifgets"configs"json<>[]thenLog.warning"Support for extra config files was removed in why3find 1.1.0.\
@ If you need this feature, please report this at %%PKG_ISSUES%%.";{fast=get"fast"~of_json:Json.jfloat~default:0.2json;time=get"time"~of_json:Json.jfloat~default:1.0json;depth=get"depth"~of_json:Json.jint~default:4json;packages=gets"packages"json;provers=gets"provers"json;tactics=gets"tactics"~default:["split_vc"]json;drivers=gets"drivers"json;warnoff=gets"warnoff"json;preprocess=Json.(joptionjstring@@jfield"preprocess"json);profile=get~of_json:Option.some~default:None"profile"json;}letdefault=config_of_json`Nullletlistsfd=`List(List.map(funs->`Strings)fd)letconfig_to_jsonconfig=letfields=["fast",`Floatconfig.fast;"time",`Floatconfig.time;"depth",`Intconfig.depth;"packages",listsconfig.packages;"provers",listsconfig.provers;"tactics",listsconfig.tactics;"drivers",listsconfig.drivers;"warnoff",listsconfig.warnoff;"preprocess",Json.option_mapJson.stringconfig.preprocess;"profile",Json.option_mapFun.idconfig.profile]inJson.assoc~keepnull:falsefieldsletload_configp=config_of_json@@load_raw_configpletsave_configpconfig=letp=Filename.concatpconf_fileinJson.to_filep@@config_to_jsonconfigtypewenv={config:Why3.Whyconf.config;env:Why3.Env.env;}moduleWenvWhtbl=Why3.Weakhtbl.Make(structtypet=wenvlettagw=Why3.Env.env_tagw.envend)letcreate_wenv?(loadpath=[])config=letloadpath=loadpath@Why3.Whyconf.(loadpath@@get_mainconfig)inletenv=Why3.Env.create_envloadpathin{config;env}typeenv={config:config;wenv:wenv;pkgs:Meta.pkglist;}letcreate_env?(root=".")~config()=letpkgs=Meta.find_allconfig.packagesinletpkg_path=List.map(funm->m.Meta.path)pkgsinletwconfig=Why3.Whyconf.init_config~extra_config:[]Noneinletwenv=create_wenv~loadpath:(root::pkg_path)wconfigin{config;wenv;pkgs}