123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646(* Copyright (c) 2017 Anil Madhavapeddy <anil@recoil.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*)typet={major:int;minor:int;patch:intoption;prerelease:stringoption;extra:stringoption}letv?patch?prerelease?extramajorminor={major;minor;patch;prerelease;extra}letmajor{major;_}=majorletminor{minor;_}=minorletpatch{patch;_}=patchletextra{extra;_}=extraletprerelease{prerelease;_}=prereleaseletchoose_seps~prerelease_sep~sep=matchprerelease_sep,sepwith|None,None->"~","+"|Somex,Somey->String.make1x,String.make1y|Somex,None->String.make1x,"+"|None,Somex->String.make2x,String.make1xletwith_sep~sep=function|None->""|Somex->sep^xletto_string?prerelease_sep?sepv=letpresep,sep=choose_seps~prerelease_sep~sepinletprerelease=with_sep~sep:presepv.prereleaseinletextra=with_sep~sepv.extrainletminor_fmt=format_of_string(ifv.major>=5then"%d"else"%02d")inmatchv.patchwith|None->Printf.sprintf"%d.%(%d%)%s%s"v.majorminor_fmtv.minorprereleaseextra|Somepatch->Printf.sprintf"%d.%(%d%).%d%s%s"v.majorminor_fmtv.minorpatchprereleaseextraletparses=letbuildpatchmajorminorsepextra=matchsep,extrawith|"~",extra->beginmatchString.index_optextra'+'with|None->v?patch~prerelease:extramajorminor|Somer->letprerelease=String.subextra0rinletafter_plus=r+1inletextra=String.subextraafter_plus(String.lengthextra-after_plus)inv?patch~prerelease~extramajorminorend|"+",extra->v?patch~extra:extramajorminor|"",""->v?patchmajorminor|_->raise(Scanf.Scan_failure("invalid ocaml version: "^s))intryScanf.sscanfs"%d.%d.%d%1[+~]%s"(funmajorminorpatch->build(Somepatch)majorminor)withEnd_of_file|Scanf.Scan_failure_->Scanf.sscanfs"%d.%d%1[+~]%s"(buildNone)letof_strings=tryOk(parses)with|_->Error(`Msg(Printf.sprintf"Unable to parse OCaml version '%s'"s))letof_string_exns=tryparseswith|_->raise(Invalid_argument(Printf.sprintf"Unable to parse OCaml version '%s'"s))letppppfv=Format.pp_print_stringppf(to_stringv)let(++)xfn=matchxwith|0->fn()|r->rletequal{major;minor;patch;prerelease;extra}a=(major:int)=a.major&&(minor:int)=a.minor&&(patch:intoption)=a.patch&&(prerelease:stringoption)=a.prerelease&&(extra:stringoption)=a.extraletcompare_prerelease(x:stringoption)(y:stringoption)=matchx,ywith|Somex,Somey->comparexy(* reversed order None > Some _ *)|None,None->0|None,Some_->1|Some_,None->-1letcompare{major;minor;patch;prerelease;extra}a=comparemajora.major++fun()->compareminora.minor++fun()->comparepatcha.patch++fun()->compare_prereleaseprereleasea.prerelease++fun()->compareextraa.extraletsys_version=of_string_exnSys.ocaml_versionletwith_varianttextra={twithextra}letwithout_variantt={twithextra=None}letwith_patchtpatch={twithpatch}letwithout_patcht={twithpatch=None}letwith_just_major_and_minort={twithpatch=None;extra=None}moduleReleases=structletv3_07_0=of_string_exn"3.07"letv3_07_1=of_string_exn"3.07+1"letv3_07_2=of_string_exn"3.07+2"letv3_07=v3_07_2letv3_08_0=of_string_exn"3.08.0"letv3_08_1=of_string_exn"3.08.1"letv3_08_2=of_string_exn"3.08.2"letv3_08_3=of_string_exn"3.08.3"letv3_08_4=of_string_exn"3.08.4"letv3_08=v3_08_4letv3_09_0=of_string_exn"3.09.0"letv3_09_1=of_string_exn"3.09.1"letv3_09_2=of_string_exn"3.09.2"letv3_09_3=of_string_exn"3.09.3"letv3_09=v3_09_3letv3_10_0=of_string_exn"3.10.0"letv3_10_1=of_string_exn"3.10.1"letv3_10_2=of_string_exn"3.10.2"letv3_10=v3_10_2letv3_11_0=of_string_exn"3.11.0"letv3_11_1=of_string_exn"3.11.1"letv3_11_2=of_string_exn"3.11.2"letv3_11=v3_11_2letv3_12_0=of_string_exn"3.12.0"letv3_12_1=of_string_exn"3.12.1"letv3_12=v3_12_1letv4_00_0=of_string_exn"4.00.0"letv4_00_1=of_string_exn"4.00.1"letv4_00=v4_00_1letv4_01_0=of_string_exn"4.01.0"letv4_01=v4_01_0letv4_02_0=of_string_exn"4.02.0"letv4_02_1=of_string_exn"4.02.1"letv4_02_2=of_string_exn"4.02.2"letv4_02_3=of_string_exn"4.02.3"letv4_02=v4_02_3letv4_03_0=of_string_exn"4.03.0"letv4_03=v4_03_0letv4_04_0=of_string_exn"4.04.0"letv4_04_1=of_string_exn"4.04.1"letv4_04_2=of_string_exn"4.04.2"letv4_04=v4_04_2letv4_05_0=of_string_exn"4.05.0"letv4_05=v4_05_0letv4_06_0=of_string_exn"4.06.0"letv4_06_1=of_string_exn"4.06.1"letv4_06=v4_06_1letv4_07_0=of_string_exn"4.07.0"letv4_07_1=of_string_exn"4.07.1"letv4_07=v4_07_1letv4_08_0=of_string_exn"4.08.0"letv4_08_1=of_string_exn"4.08.1"letv4_08=v4_08_1letv4_09_0=of_string_exn"4.09.0"letv4_09_1=of_string_exn"4.09.1"letv4_09=v4_09_1letv4_10_0=of_string_exn"4.10.0"letv4_10_1=of_string_exn"4.10.1"letv4_10_2=of_string_exn"4.10.2"letv4_10=v4_10_2letv4_11_0=of_string_exn"4.11.0"letv4_11_1=of_string_exn"4.11.1"letv4_11_2=of_string_exn"4.11.2"letv4_11=v4_11_2letv4_12_0=of_string_exn"4.12.0"letv4_12_1=of_string_exn"4.12.1"letv4_12=v4_12_1letv4_13_0=of_string_exn"4.13.0"letv4_13_1=of_string_exn"4.13.1"letv4_13=v4_13_1letv4_14_0=of_string_exn"4.14.0"letv4_14_1=of_string_exn"4.14.1"letv4_14_2=of_string_exn"4.14.2"letv4_14=v4_14_2letv5_0_0=of_string_exn"5.0.0"letv5_0=v5_0_0letv5_1_0=of_string_exn"5.1.0"letv5_1_1=of_string_exn"5.1.1"letv5_1=v5_1_1letv5_2_0=of_string_exn"5.2.0"letv5_2_1=of_string_exn"5.2.1"letv5_2=v5_2_1letv5_3_0=of_string_exn"5.3.0"letv5_3=v5_3_0letv5_4_0=of_string_exn"5.4.0"letv5_4=v5_4_0letall_patches=[v3_07_0;v3_07_1;v3_07_2;v3_08_0;v3_08_1;v3_08_2;v3_08_3;v3_08_4;v3_09_0;v3_09_1;v3_09_2;v3_09_3;v3_10_0;v3_10_1;v3_10_2;v3_11_0;v3_11_1;v3_11_2;v3_12_0;v3_12_1;v4_00_0;v4_00_1;v4_01_0;v4_02_0;v4_02_1;v4_02_2;v4_02_3;v4_03_0;v4_04_0;v4_04_1;v4_04_2;v4_05_0;v4_06_0;v4_06_1;v4_07_0;v4_07_1;v4_08_0;v4_08_1;v4_09_0;v4_09_1;v4_10_0;v4_10_1;v4_10_2;v4_11_0;v4_11_1;v4_11_2;v4_12_0;v4_12_1;v4_13_0;v4_13_1;v4_14_0;v4_14_1;v4_14_2;v5_0_0;v5_1_0;v5_1_1;v5_2_0;v5_2_1;v5_3_0]letall=[v3_07;v3_08;v3_09;v3_10;v3_11;v3_12;v4_00;v4_01;v4_02;v4_03;v4_04;v4_05;v4_06;v4_07;v4_08;v4_09;v4_10;v4_11;v4_12;v4_13;v4_14;v5_0;v5_1;v5_2;v5_3]letrecent=[v4_08;v4_09;v4_10;v4_11;v4_12;v4_13;v4_14;v5_0;v5_1;v5_2;v5_3]letlatest=v5_3letunreleased_betas=[]letdev=[v5_4]lettrunk=matchdevwith|[]->latest|[v]->v|_->List.hd@@List.sort(funxy->-(comparexy))devletis_devt=lett=with_just_major_and_minortinletdev=List.mapwith_just_major_and_minordevinList.memtdevletrecent_with_dev=List.concat[recent;dev]endtypearch=[`I386|`X86_64|`Aarch64|`Ppc64le|`Aarch32|`S390x|`Riscv64]letarches=[`I386;`X86_64;`Aarch64;`Ppc64le;`Aarch32;`S390x;`Riscv64]letarch_is_32bit=function`I386|`Aarch32->true|_->falseletstring_of_arch=function|`Aarch64->"arm64"|`Aarch32->"arm32v7"|`X86_64->"amd64"|`Ppc64le->"ppc64le"|`I386->"i386"|`S390x->"s390x"|`Riscv64->"riscv64"letarch_of_string=function|"arm64"|"aarch64"->Ok`Aarch64|"amd64"|"x86_64"->Ok`X86_64|"i386"|"i686"|"686"|"386"->Ok`I386|"arm32"|"arm32v7"|"aarch32"->Ok`Aarch32|"ppc64le"->Ok`Ppc64le|"s390x"->Ok`S390x|"riscv64"->Ok`Riscv64|arch->Error(`Msg("Unknown architecture "^arch))letarch_of_string_exna=matcharch_of_stringawith|Oka->a|Error(`Msgm)->raise(Invalid_argumentm)letto_opam_arch=function|`I386->"x86_32"|`X86_64->"x86_64"|`Ppc64le->"ppc64"|`Aarch32->"arm32"|`Aarch64->"arm64"|`S390x->"s390x"|`Riscv64->"riscv64"letof_opam_arch=function|"x86_32"->Some`I386|"x86_64"->Some`X86_64|"ppc64"->Some`Ppc64le|"arm32"->Some`Aarch32|"arm64"->Some`Aarch64|"s390x"->Some`S390x|"riscv64"->Some`Riscv64|_->Noneletto_docker_arch=function|`I386->"386"|`X86_64->"amd64"|`Ppc64le->"ppc64le"|`Aarch32->"arm"|`Aarch64->"arm64"|`S390x->"s390x"|`Riscv64->"riscv64"letof_docker_arch=function|"386"->Some`I386|"amd64"->Some`X86_64|"ppc64le"->Some`Ppc64le|"arm"->Some`Aarch32|"arm64"->Some`Aarch64|"s390x"->Some`S390x|"riscv64"->Some`Riscv64|_->NonemoduleSince=structletbytes=Releases.v4_03_0letarch(a:arch)=matchawith|`I386->Releases.v3_07_0|`Aarch32->Releases.v4_02_3|`Aarch64->Releases.v4_02_3|`Ppc64le->Releases.v4_03_0|`S390x->Releases.v4_03_0|`Riscv64->Releases.v4_11_0|`X86_64->Releases.v3_07_0letautoconf=Releases.v4_08_0letoptions_packages=Releases.v4_12_0endmoduleHas=structletbytesv=matchcompareSince.bytesvwith|(-1)|0->true|_->falseletarch(a:arch)v=matchcompare(Since.archa)vwith|(-1)|0->true|_->falseletautoconfv=matchcompareSince.autoconfvwith|(-1)|0->true|_->falseletoptions_packagesv=matchcompareSince.options_packagesvwith|(-1)|0->true|_->falseletmulticorev=matchv.major,v.minorwith|4,10->true|4,12->true|_->falseendmoduleConfigure_options=structtypeo=[`Afl|`Default_unsafe_string|`Disable_flat_float_array|`Domains|`Effects|`Flambda|`Force_safe_string|`Frame_pointer|`Multicore|`Multicore_no_effect_syntax|`No_naked_pointers|`No_naked_pointers_checker]letto_description(t:o)=matchtwith|`Afl->"AFL (fuzzing) support"|`Flambda->"flambda inlining"|`Default_unsafe_string->"default to unsafe strings"|`Domains->"experimental multicore parallelism"|`Effects->"experimental multicore parallelism and effects-based concurrency"|`Force_safe_string->"force safe string mode"|`Frame_pointer->"frame pointer"|`Multicore->"experimental multicore parallelism"|`Multicore_no_effect_syntax->"experimental multicore with syntax matching vanilla OCaml"|`No_naked_pointers->"forbid unboxed pointers"|`No_naked_pointers_checker->"enable the naked pointers checker"|`Disable_flat_float_array->"disable float array unboxing"letto_stringt=matchtwith|`Afl->"afl"|`Flambda->"flambda"|`Default_unsafe_string->"default-unsafe-string"|`Domains->"domains"|`Effects->"effects"|`Force_safe_string->"force-safe-string"|`Frame_pointer->"fp"|`Multicore->"multicore"|`Multicore_no_effect_syntax->"no-effect-syntax"|`No_naked_pointers->"nnp"|`No_naked_pointers_checker->"nnpchecker"|`Disable_flat_float_array->"no-flat-float-array"letof_string=function|"afl"->Some`Afl|"flambda"->Some`Flambda|"default-unsafe-string"->Some`Default_unsafe_string|"domains"->Some`Domains|"effects"->Some`Effects|"force-safe-string"->Some`Force_safe_string|"fp"->Some`Frame_pointer|"multicore"->Some`Multicore|"no-effect-syntax"->Some`Multicore_no_effect_syntax|"nnp"->Some`No_naked_pointers|"nnpchecker"->Some`No_naked_pointers_checker|"no-flat-float-array"->Some`Disable_flat_float_array|_->Noneletcompare_pre_optionsab=(* For backwards compat reasons, multicore and fp always comes first. *)matcha,bwith|`Frame_pointer,`Frame_pointer->0|`Multicore,`Multicore->0|`Multicore,_->(-1)|`Frame_pointer,_->(-1)|_,`Multicore->1|_,`Frame_pointer->1|a,b->Stdlib.compareabletcompare_post_optionsab=(* Lexically ordered options since 4.12.0 *)String.compare(to_stringa)(to_stringb)letcomparet=ifHas.options_packagestthencompare_post_optionselsecompare_pre_optionsletequaltab=comparetab=0letto_tt=function|[]->with_varianttNone|ol->List.sort(comparet)ol|>List.mapto_string|>String.concat"+"|>funs->with_variantt(Somes)letof_tt=matcht.extrawithNone->Ok[]|Someextra->String.split_on_char'+'extra|>List.map(funb->matchof_stringbwith|None->Error(`Msg("unknown variant: "^b))|Somev->Okv)|>List.fold_left(funab->matcha,bwith|Oka,Okb->Ok(List.sort(comparet)(b::a))|_,Errorb->Errorb|Errora,_->Errora)(Ok[])letof_t_exnt=matchof_ttwith|Okv->v|Error(`Msgm)->raise(Failurem)letto_configure_flagto=ifHas.autoconftthenmatchowith|`Afl->"--with-afl"|`Flambda->"--enable-flambda"|`Default_unsafe_string->"--enable-default-unsafe-string"|`Force_safe_string->"--force-safe-string"|`Frame_pointer->"--enable-frame-pointers"|`Multicore|`Domains|`Effects|`Multicore_no_effect_syntax->""|`No_naked_pointers->"--disable-naked-pointers"|`No_naked_pointers_checker->"--enable-naked-pointers-checker"|`Disable_flat_float_array->"--disable-flat-float-array"elsematchowith|`Afl->"-afl-instrument"|`Flambda->"-flambda"|`Default_unsafe_string->"-default-unsafe-string"|`Force_safe_string->"-force-safe-string"|`Frame_pointer->"-with-frame-pointer"|_->""letis_multicoret=of_t_exnt|>List.exists(function|`Multicore|`Domains->true|_->false)endmoduleSources=structlettrunk=Releases.trunkletgit_tag({major;minor;patch;_}asov)=matchmajor,minor,patchwith|major,minor,_whenmajor=trunk.major&&minor=trunk.minor->"trunk"|_->to_string(with_variantovNone)endlettrunk_variants(arch:arch)=letbase=ifarch=`X86_64||arch=`Aarch64then[[];[`Afl];[`Flambda];[`Disable_flat_float_array]]else[[];[`Disable_flat_float_array]]in(* Frame pointers aren't currently supported on trunk *)let_arch_opts=matcharchwith|`X86_64->[[`Frame_pointer];[`Frame_pointer;`Flambda]]|_->[]inList.map(Configure_options.to_tSources.trunk)(base(*@ arch_opts*))letcompiler_variantsarch({major;minor;_}ast)=letvariants=[]inletversion=(major,minor)inifversion=(Releases.trunk.major,Releases.trunk.minor)thentrunk_variantsarchelseletvariants=(* No variants for OCaml < 4.00 *)ifversion<(4,00)then[]else(* +nnpchecker for OCaml 4.12-4.14 on x86_64 *)letvariants=ifarch=`X86_64&&version>=(4,12)&&version<(5,0)then[`No_naked_pointers_checker]::variantselsevariantsin(* +nnp for OCaml 4.12-4.14 *)letvariants=ifversion>=(4,12)&&version<(5,0)then[`No_naked_pointers]::variantselsevariantsin(* +no-flat-float-array for OCaml 4.12+ *)letvariants=ifversion>=(4,12)then[`Disable_flat_float_array]::variantselsevariantsin(* +fp+flambda for OCaml 4.12+ on x86_64 *)letvariants=ifarch=`X86_64&&(version>=(4,12)&&version<(5,0))then[`Frame_pointer;`Flambda]::variantselsevariantsin(* +fp for OCaml 4.08+ on x86_64 *)letvariants=ifarch=`X86_64&&(version>=(4,08)&&version<(5,0))then[`Frame_pointer]::variantselsevariantsin(* +flambda for OCaml 4.03+ *)letvariants=ifversion>=(4,03)&&(version<(5,0)||arch=`X86_64||arch=`Aarch64)then[`Flambda]::variantselsevariantsin(* +afl for OCaml 4.05+ *)ifversion>=(4,05)&&(version<(5,0)||arch=`X86_64||arch=`Aarch64)then[`Afl]::variantselsevariantsinletf=List.map(Configure_options.to_tt)inf([]::variants)moduleOpam=structmoduleV2=structletpackaget=matcht.extrawith|SomeextrawhenReleases.is_devt->letversion=letversion=to_string(without_variantt)^"+trunk"inifHas.options_packagestthenversionelsePrintf.sprintf"%s+%s"versionextrain("ocaml-variants",version)|Some_->lett=(* multicore fork packages are at the lowest patch version *)ifConfigure_options.is_multicoretthenwith_patcht(Some0)elseifHas.options_packagestthenwith_variantt(Some"options")elsetin("ocaml-variants",to_stringt)|NonewhenReleases.is_devt->("ocaml-variants",Printf.sprintf"%s+trunk"(to_stringt))|None->("ocaml-base-compiler",to_stringt)letadditional_packagest=ifHas.options_packagest&¬(Configure_options.is_multicoret)thenmatchConfigure_options.of_ttwith|Ok[]|Error_->[]|Okoptions->letoptions_only_package=List.mapConfigure_options.to_stringoptions|>String.concat"-"|>(^)"ocaml-options-only-"in[options_only_package]else[]letnamet=let(name,version)=packagetinname^"."^versionletvariant_switchtvs=matchvswith|[]->with_varianttNone|vs->Configure_options.to_ttvsletswitchesarcht=compiler_variantsarchtendend