123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466open!StduneopenResult.OmoduleProg_and_args=structtypet={prog:string;args:stringlist}endopenProg_and_argsmoduleValue=structtypet=|Boolofbool|Intofint|Stringofstring|Wordsofstringlist|Prog_and_argsofProg_and_args.tletto_sexp:t->Sexp.t=letopenSexp.Encoderinfunction|Boolx->boolx|Intx->intx|Stringx->stringx|Wordsx->(liststring)x|Prog_and_args{prog;args}->(liststring)(prog::args)letto_string=function|Boolx->string_of_boolx|Intx->string_of_intx|Stringx->x|Wordsx->String.concatx~sep:" "|Prog_and_argsx->String.concat~sep:" "(x.prog::x.args)endtypet={version:int*int*int;version_string:string;standard_library_default:string;standard_library:string;standard_runtime:string;ccomp_type:string;c_compiler:string;ocamlc_cflags:stringlist;ocamlopt_cflags:stringlist;bytecomp_c_compiler:Prog_and_args.t;bytecomp_c_libraries:stringlist;native_c_compiler:Prog_and_args.t;native_c_libraries:stringlist;cc_profile:stringlist;architecture:string;model:string;int_size:int;word_size:int;system:string;asm:Prog_and_args.t;asm_cfi_supported:bool;with_frame_pointers:bool;ext_exe:string;ext_obj:string;ext_asm:string;ext_lib:string;ext_dll:string;os_type:string;default_executable_name:string;systhread_supported:bool;host:string;target:string;profiling:bool;flambda:bool;spacetime:bool;safe_string:bool;exec_magic_number:string;cmi_magic_number:string;cmo_magic_number:string;cma_magic_number:string;cmx_magic_number:string;cmxa_magic_number:string;ast_impl_magic_number:string;ast_intf_magic_number:string;cmxs_magic_number:string;cmt_magic_number:string;natdynlink_supported:bool;supports_shared_libraries:bool;windows_unicode:bool}letversiont=t.versionletversion_stringt=t.version_stringletstandard_library_defaultt=t.standard_library_defaultletstandard_libraryt=t.standard_libraryletstandard_runtimet=t.standard_runtimeletccomp_typet=t.ccomp_typeletc_compilert=t.c_compilerletocamlc_cflagst=t.ocamlc_cflagsletocamlopt_cflagst=t.ocamlopt_cflagsletbytecomp_c_compilert=t.bytecomp_c_compilerletbytecomp_c_librariest=t.bytecomp_c_librariesletnative_c_compilert=t.native_c_compilerletnative_c_librariest=t.native_c_librariesletcc_profilet=t.cc_profileletarchitecturet=t.architectureletmodelt=t.modelletint_sizet=t.int_sizeletword_sizet=t.word_sizeletsystemt=t.systemletasmt=t.asmletasm_cfi_supportedt=t.asm_cfi_supportedletwith_frame_pointerst=t.with_frame_pointersletext_exet=t.ext_exeletext_objt=t.ext_objletext_asmt=t.ext_asmletext_libt=t.ext_libletext_dllt=t.ext_dllletos_typet=t.os_typeletdefault_executable_namet=t.default_executable_nameletsysthread_supportedt=t.systhread_supportedlethostt=t.hostlettargett=t.targetletprofilingt=t.profilingletflambdat=t.flambdaletspacetimet=t.spacetimeletsafe_stringt=t.safe_stringletexec_magic_numbert=t.exec_magic_numberletcmi_magic_numbert=t.cmi_magic_numberletcmo_magic_numbert=t.cmo_magic_numberletcma_magic_numbert=t.cma_magic_numberletcmx_magic_numbert=t.cmx_magic_numberletcmxa_magic_numbert=t.cmxa_magic_numberletast_impl_magic_numbert=t.ast_impl_magic_numberletast_intf_magic_numbert=t.ast_intf_magic_numberletcmxs_magic_numbert=t.cmxs_magic_numberletcmt_magic_numbert=t.cmt_magic_numberletnatdynlink_supportedt=t.natdynlink_supportedletsupports_shared_librariest=t.supports_shared_librariesletwindows_unicodet=t.windows_unicodeletto_listt:(string*Value.t)list=["version",Stringt.version_string;"standard_library_default",Stringt.standard_library_default;"standard_library",Stringt.standard_library;"standard_runtime",Stringt.standard_runtime;"ccomp_type",Stringt.ccomp_type;"c_compiler",Stringt.c_compiler;"ocamlc_cflags",Wordst.ocamlc_cflags;"ocamlopt_cflags",Wordst.ocamlopt_cflags;"bytecomp_c_compiler",Prog_and_argst.bytecomp_c_compiler;"bytecomp_c_libraries",Wordst.bytecomp_c_libraries;"native_c_compiler",Prog_and_argst.native_c_compiler;"native_c_libraries",Wordst.native_c_libraries;"cc_profile",Wordst.cc_profile;"architecture",Stringt.architecture;"model",Stringt.model;"int_size",Intt.int_size;"word_size",Intt.word_size;"system",Stringt.system;"asm",Prog_and_argst.asm;"asm_cfi_supported",Boolt.asm_cfi_supported;"with_frame_pointers",Boolt.with_frame_pointers;"ext_exe",Stringt.ext_exe;"ext_obj",Stringt.ext_obj;"ext_asm",Stringt.ext_asm;"ext_lib",Stringt.ext_lib;"ext_dll",Stringt.ext_dll;"os_type",Stringt.os_type;"default_executable_name",Stringt.default_executable_name;"systhread_supported",Boolt.systhread_supported;"host",Stringt.host;"target",Stringt.target;"profiling",Boolt.profiling;"flambda",Boolt.flambda;"spacetime",Boolt.spacetime;"safe_string",Boolt.safe_string;"exec_magic_number",Stringt.exec_magic_number;"cmi_magic_number",Stringt.cmi_magic_number;"cmo_magic_number",Stringt.cmo_magic_number;"cma_magic_number",Stringt.cma_magic_number;"cmx_magic_number",Stringt.cmx_magic_number;"cmxa_magic_number",Stringt.cmxa_magic_number;"ast_impl_magic_number",Stringt.ast_impl_magic_number;"ast_intf_magic_number",Stringt.ast_intf_magic_number;"cmxs_magic_number",Stringt.cmxs_magic_number;"cmt_magic_number",Stringt.cmt_magic_number;"natdynlink_supported",Boolt.natdynlink_supported;"supports_shared_libraries",Boolt.supports_shared_libraries;"windows_unicode",Boolt.windows_unicode]letto_sexpt=letopenSexpinList(to_listt|>List.map~f:(fun(k,v)->List[Atomk;Value.to_sexpv]))moduleOrigin=structtypet=|Ocamlc_config|Makefile_configofPath.tendletsplit_progs=matchString.extract_blank_separated_wordsswith|[]->None|prog::args->Some{prog;args}moduleVars=structtypet=stringString.Map.tletof_lineslines=letrecloopacc=function|[]->Okacc|line::lines->matchString.indexline':'with|Somei->letx=(String.takelinei,String.dropline(i+2)(* skipping the space *))inloop(x::acc)lines|None->Error(Printf.sprintf"Unrecognized line: %S"line)inloop[]lines>>=funvars->Result.map_error(String.Map.of_listvars)~f:(fun(var,_,_)->Printf.sprintf"Variable %S present twice."var)letload_makefile_configfile=letlines=Io.lines_of_filefileinList.filter_maplines~f:(funline->letline=String.trimlineinifline=""||line.[0]='#'thenNoneelseString.lsplit2line~on:'=')|>String.Map.of_list_reduce~f:(fun_x->x)exceptionEofOrigin.t*stringmoduleGetters(Origin:sigvalorigin:Origin.tend)=structletfailfmt=Printf.ksprintf(funmsg->raise(E(Origin.origin,msg)))fmtletget_opttvar=String.Map.findtvarletgettvar=matchget_opttvarwith|Somes->s|None->fail"Variable %S not found."varletget_boolt?(default=false)var=matchget_opttvarwith|None->default|Somes->matchswith|"true"->true|"false"->false|s->fail"Value of %S is neither 'true' neither 'false': %s."varsletget_int_opttvar=Option.bind(get_opttvar)~f:(funs->matchint_of_stringswith|x->Somex|exception_->fail"Value of %S is not an integer: %s."vars)letget_wordstvar=matchget_opttvarwith|None->[]|Somes->String.extract_blank_separated_wordssletget_prog_or_dummytvar=Option.map(get_opttvar)~f:(funv->matchsplit_progvwith|None->{prog=Printf.sprintf"%s-not-found-in-ocaml-config"var;args=[]}|Somes->s)letget_prog_or_dummy_exntvar=matchget_prog_or_dummytvarwith|None->fail"Variable %S not found."var|Somes->sendmoduleOcamlc_config_getters=Getters(structletorigin=Origin.Ocamlc_configend)endletget_arch_sixtyfourstdlib_dir=letfiles=["caml/config.h";"caml/m.h"]inletget_arch_sixtyfour_fromfile=letfile=Filename.concatstdlib_dirfileinifSys.file_existsfilethenbeginletrecloopic=matchinput_lineicwith|exceptionEnd_of_file->false|line->matchString.extract_blank_separated_wordslinewith|["#define";"ARCH_SIXTYFOUR"]->true|_->loopicinExn.protectx(open_infile)~finally:close_in~f:loopendelsefalseinList.exists~f:get_arch_sixtyfour_fromfilesletmakevars=matchletopenVars.Ocamlc_config_gettersinletbytecomp_c_compiler=get_prog_or_dummy_exnvars"bytecomp_c_compiler"inletnative_c_compiler=get_prog_or_dummy_exnvars"native_c_compiler"inletc_compiler,ocamlc_cflags,ocamlopt_cflags=matchget_prog_or_dummyvars"c_compiler"with|Some{prog;args}->(* >= 4.06 *)letget_flagsvar=args@get_wordsvarsvarin(prog,get_flags"ocamlc_cflags",get_flags"ocamlopt_cflags")|None->(bytecomp_c_compiler.prog,bytecomp_c_compiler.args,native_c_compiler.args)inletversion_string=getvars"version"inletversion=Scanf.sscanfversion_string"%u.%u.%u"(funabc->a,b,c)inletos_type=getvars"os_type"inletstandard_library_default=getvars"standard_library_default"inletstandard_library=getvars"standard_library"inletstandard_runtime=Option.value(get_optvars"standard_runtime")~default:"the_standard_runtime_variable_was_deleted"inletccomp_type=getvars"ccomp_type"inletbytecomp_c_libraries=get_wordsvars"bytecomp_c_libraries"inletnative_c_libraries=get_wordsvars"native_c_libraries"inletcc_profile=get_wordsvars"cc_profile"inletarchitecture=getvars"architecture"inletmodel=getvars"model"inletsystem=getvars"system"inletasm_cfi_supported=get_boolvars"asm_cfi_supported"inletwith_frame_pointers=get_boolvars"with_frame_pointers"inletasm=get_prog_or_dummy_exnvars"asm"inletword_size=matchget_int_optvars"word_size"with|Somen->n|None->ifget_arch_sixtyfourstandard_librarythen64else32inletint_size=matchget_int_optvars"int_size"with|Somen->n|None->word_size-1inletext_obj=getvars"ext_obj"inletext_asm=getvars"ext_asm"inletext_lib=getvars"ext_lib"inletext_dll=getvars"ext_dll"inletext_exe=matchget_optvars"exe_ext"with|Somes->s|None->ifos_type="Win32"then".exe"else""inletdefault_executable_name=getvars"default_executable_name"inletsysthread_supported=get_boolvars"systhread_supported"inlethost=getvars"host"inlettarget=getvars"target"inletprofiling=get_boolvars"profiling"inletflambda=get_boolvars"flambda"inletspacetime=get_boolvars"spacetime"inletsafe_string=get_boolvars"safe_string"inletexec_magic_number=getvars"exec_magic_number"inletcmi_magic_number=getvars"cmi_magic_number"inletcmo_magic_number=getvars"cmo_magic_number"inletcma_magic_number=getvars"cma_magic_number"inletcmx_magic_number=getvars"cmx_magic_number"inletcmxa_magic_number=getvars"cmxa_magic_number"inletast_impl_magic_number=getvars"ast_impl_magic_number"inletast_intf_magic_number=getvars"ast_intf_magic_number"inletcmxs_magic_number=getvars"cmxs_magic_number"inletcmt_magic_number=getvars"cmt_magic_number"inletwindows_unicode=get_boolvars"windows_unicode"inletnatdynlink_supported=Sys.file_exists(Filename.concatstandard_library"dynlink.cmxa")inletfile=Path.relative(Path.of_stringstandard_library)"Makefile.config"inletvars=Vars.load_makefile_configfileinletmoduleGetters=Vars.Getters(structletorigin=Origin.Makefile_configfileend)inletsupports_shared_libraries=get_boolvars"SUPPORTS_SHARED_LIBRARIES"in{version;version_string;standard_library_default;standard_library;standard_runtime;ccomp_type;c_compiler;ocamlc_cflags;ocamlopt_cflags;bytecomp_c_compiler;bytecomp_c_libraries;native_c_compiler;native_c_libraries;cc_profile;architecture;model;int_size;word_size;system;asm;asm_cfi_supported;with_frame_pointers;ext_exe;ext_obj;ext_asm;ext_lib;ext_dll;os_type;default_executable_name;systhread_supported;host;target;profiling;flambda;spacetime;safe_string;exec_magic_number;cmi_magic_number;cmo_magic_number;cma_magic_number;cmx_magic_number;cmxa_magic_number;ast_impl_magic_number;ast_intf_magic_number;cmxs_magic_number;cmt_magic_number;natdynlink_supported;supports_shared_libraries;windows_unicode}with|t->Okt|exception(Vars.E(origin,msg))->Error(origin,msg)