1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192(************************************************************************)(* * The Coq Proof Assistant / The Coq Development Team *)(* v * INRIA, CNRS and contributors - Copyright 1999-2018 *)(* <O___,, * (see CREDITS file for the list of authors) *)(* \VV/ **************************************************************)(* // * This file is distributed under the terms of the *)(* * GNU Lesser General Public License Version 2.1 *)(* * (see LICENSE file for the text of the license) *)(************************************************************************)(************************************************************************)(* Coq serialization API/Plugin *)(* Copyright 2016-2019 MINES ParisTech *)(* Copyright 2019-2022 Inria *)(* Written by Emilio J. Gallego Arias *)(************************************************************************)[@@@ocamlformat"disable"]letlist_lastl=List.(nthl(lengthl-1))letnot_available_warnfl_pkginfo=Feedback.msg_warningPp.(str"Serlib plugin: "++strfl_pkg++str" is not available"++strinfo++str"."++fnl()++str"Incremental checking for commands in this plugin will be impacted.")letcheck_package_existsfl_pkg=trylet_=Findlib.package_directoryfl_pkginSomefl_pkgwith|Findlib.No_such_package(_,info)->not_available_warnfl_pkginfo;None(* Should improve *)letmap_serlibfl_pkg=letsupported=matchfl_pkgwith(* Supported by serlib *)(* directory *)|"coq-core.plugins.cc"(* cc *)|"coq-core.plugins.extraction"(* extraction *)|"coq-core.plugins.firstorder"(* firstorder *)|"coq-core.plugins.funind"(* funind *)|"coq-core.plugins.ltac"(* ltac *)|"coq-core.plugins.ltac2"(* ltac2 *)|"coq-core.plugins.micromega"(* micromega *)|"coq-core.plugins.ring"(* ring *)|"coq-core.plugins.ssreflect"(* ssreflect *)|"coq-core.plugins.ssrmatching"(* ssrmatching *)|"coq-core.plugins.number_string_notation"(* syntax *)|"coq-core.plugins.tauto"(* tauto *)|"coq-core.plugins.zify"(* zify *)->true|_->not_available_warnfl_pkg": serlib support is missing";falseinifsupportedthenletplugin_name=String.split_on_char'.'fl_pkg|>list_lastinletserlib_name="coq-serapi.serlib."^plugin_nameincheck_package_existsserlib_nameelseNone(* We used to be liberal here in the case a SerAPI plugin was not available.
This proved to be a bad choice as Coq got confused when plugin loading
failed. Par-contre, we now need to make the list in `map_serlib` open, so
plugins can register whether they support serialization. I'm afraid that'll
have to happen via the finlib database as we cannot load anticipatedly a
plugin that may not exist. *)letsafe_loaderloaderfl_pkg=tryloader[fl_pkg]withexn->letiexn=Exninfo.captureexninletexn_msg=CErrors.iprintiexninFeedback.msg_warningPp.(str"Loading findlib plugin: "++strfl_pkg++str"failed"++fnl()++exn_msg);Exninfo.iraiseiexnletplugin_handleruser_loader=letloader=Option.default(Fl_dynload.load_packages~debug:false)user_loaderinletsafe_loader=safe_loaderloaderinfunfl_pkg->let_,fl_pkg=Mltop.PluginSpec.reprfl_pkginmatchmap_serlibfl_pkgwith|Someserlib_pkg->safe_loaderserlib_pkg|None->safe_loaderfl_pkg