123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476(*
* Copyright (c) 2016-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.
*
*)(** Distro selection for various OPAM combinations. *)openSexplib0.Sexp_convtypedistro=[`Alpineof[`V3_3|`V3_4|`V3_5|`V3_6|`V3_7|`V3_8|`V3_9|`V3_10|`V3_11|`V3_12|`V3_13|`V3_14|`V3_15|`V3_16|`V3_17|`V3_18|`V3_19|`V3_20|`V3_21|`V3_22]|`Archlinuxof[`Latest]|`CentOSof[`V6|`V7|`V8|`V9|`V10]|`Debianof[`V13|`V12|`V11|`V10|`V9|`V8|`V7|`Testing|`Unstable]|`Fedoraof[`V21|`V22|`V23|`V24|`V25|`V26|`V27|`V28|`V29|`V30|`V31|`V32|`V33|`V34|`V35|`V36|`V37|`V38|`V39|`V40|`V41|`V42|`V43]|`OracleLinuxof[`V7|`V8|`V9|`V10]|`OpenSUSEof[`V42_1|`V42_2|`V42_3|`V15_0|`V15_1|`V15_2|`V15_3|`V15_4|`V15_5|`V15_6|`V16_0|`Tumbleweed]|`Ubuntuof[`V12_04|`V14_04|`V15_04|`V15_10|`V16_04|`V16_10|`V17_04|`V17_10|`V18_04|`V18_10|`V19_04|`V19_10|`V20_04|`V20_10|`V21_04|`V21_10|`V22_04|`V22_10|`V23_04|`V23_10|`V24_04|`V24_10|`V25_04|`V25_10]|`Cygwinof[`Ltsc2016|`Ltsc2019|`Ltsc2022]|`Windowsof[`Mingw|`Msvc]*[`Ltsc2019]|`WindowsServerof[`Mingw|`Msvc]*[`Ltsc2022|`Ltsc2025]][@@derivingsexp]typet=[`Alpineof[`V3_3|`V3_4|`V3_5|`V3_6|`V3_7|`V3_8|`V3_9|`V3_10|`V3_11|`V3_12|`V3_13|`V3_14|`V3_15|`V3_16|`V3_17|`V3_18|`V3_19|`V3_20|`V3_21|`V3_22|`Latest]|`Archlinuxof[`Latest]|`CentOSof[`V6|`V7|`V8|`V9|`V10|`Latest]|`Debianof[`V13|`V12|`V11|`V10|`V9|`V8|`V7|`Stable|`Testing|`Unstable]|`Fedoraof[`V21|`V22|`V23|`V24|`V25|`V26|`V27|`V28|`V29|`V30|`V31|`V32|`V33|`V34|`V35|`V36|`V37|`V38|`V39|`V40|`V41|`V42|`V43|`Latest]|`OracleLinuxof[`V7|`V8|`V9|`V10|`Latest]|`OpenSUSEof[`V42_1|`V42_2|`V42_3|`V15_0|`V15_1|`V15_2|`V15_3|`V15_4|`V15_5|`V15_6|`V16_0|`Tumbleweed|`Latest]|`Ubuntuof[`V12_04|`V14_04|`V15_04|`V15_10|`V16_04|`V16_10|`V17_04|`V17_10|`V18_04|`V18_10|`V19_04|`V19_10|`V20_04|`V20_10|`V21_04|`V21_10|`V22_04|`V22_10|`V23_04|`V23_10|`V24_04|`V24_10|`V25_04|`V25_10|`Latest|`LTS]|`Cygwinof[`Ltsc2016|`Ltsc2019|`Ltsc2022|`Latest]|`Windowsof[`Mingw|`Msvc]*[`Ltsc2019|`Latest]|`WindowsServerof[`Mingw|`Msvc]*[`Ltsc2022|`Ltsc2025|`Latest]][@@derivingsexp]typeos_family=[`Cygwin|`Linux|`Windows][@@derivingsexp]letos_family_of_distro(t:t):os_family=matchtwith|`Alpine_|`Archlinux_|`CentOS_|`Debian_|`Fedora_|`OracleLinux_|`OpenSUSE_|`Ubuntu_->`Linux|`Cygwin_->`Cygwin|`Windows_->`Windows|`WindowsServer_->`Windowsletos_family_to_string(os:os_family)=matchoswith|`Linux->"linux"|`Windows->"windows"|`Cygwin->"cygwin"letopam_repository(os:os_family)=matchoswith|`Cygwin|`Linux->"https://github.com/ocaml/opam-repository.git"|`Windows->"https://github.com/ocaml-opam/opam-repository-mingw.git#sunset"letpersonalityos_familyarch=matchos_familywith|`LinuxwhenOcaml_version.arch_is_32bitarch->Some"/usr/bin/linux32"|_->Nonetypestatus=[`Deprecated|`Activeof[`Tier1|`Tier2|`Tier3]|`Alias|`Not_available][@@derivingsexp](* These should be version-sorted within each distribution *)letdistros:tlist=[`Alpine`V3_3;`Alpine`V3_4;`Alpine`V3_5;`Alpine`V3_6;`Alpine`V3_7;`Alpine`V3_8;`Alpine`V3_9;`Alpine`V3_10;`Alpine`V3_11;`Alpine`V3_12;`Alpine`V3_13;`Alpine`V3_14;`Alpine`V3_15;`Alpine`V3_16;`Alpine`V3_17;`Alpine`V3_18;`Alpine`V3_19;`Alpine`V3_20;`Alpine`V3_21;`Alpine`V3_22;`Alpine`Latest;`Archlinux`Latest;`CentOS`V6;`CentOS`V7;`CentOS`V8;`CentOS`V9;`CentOS`V10;`CentOS`Latest;`Debian`V7;`Debian`V8;`Debian`V9;`Debian`V10;`Debian`V11;`Debian`V12;`Debian`V13;`Debian`Stable;`Debian`Testing;`Debian`Unstable;`Fedora`V23;`Fedora`V24;`Fedora`V25;`Fedora`V26;`Fedora`V27;`Fedora`V28;`Fedora`V29;`Fedora`V30;`Fedora`V31;`Fedora`V32;`Fedora`V33;`Fedora`V34;`Fedora`V35;`Fedora`V36;`Fedora`V37;`Fedora`V38;`Fedora`V39;`Fedora`V40;`Fedora`V41;`Fedora`V42;`Fedora`V43;`Fedora`Latest;`OracleLinux`V7;`OracleLinux`V8;`OracleLinux`V9;`OracleLinux`V10;`OracleLinux`Latest;`OpenSUSE`V42_1;`OpenSUSE`V42_2;`OpenSUSE`V42_3;`OpenSUSE`V15_0;`OpenSUSE`V15_1;`OpenSUSE`V15_2;`OpenSUSE`V15_3;`OpenSUSE`V15_4;`OpenSUSE`V15_5;`OpenSUSE`V15_6;`OpenSUSE`V16_0;`OpenSUSE`Latest;`OpenSUSE`Tumbleweed;`Ubuntu`V12_04;`Ubuntu`V14_04;`Ubuntu`V15_04;`Ubuntu`V15_10;`Ubuntu`V16_04;`Ubuntu`V16_10;`Ubuntu`V17_04;`Ubuntu`V17_10;`Ubuntu`V18_04;`Ubuntu`V18_10;`Ubuntu`V19_04;`Ubuntu`V19_10;`Ubuntu`V20_04;`Ubuntu`V20_10;`Ubuntu`V21_04;`Ubuntu`V21_10;`Ubuntu`V22_04;`Ubuntu`V22_10;`Ubuntu`V23_04;`Ubuntu`V23_10;`Ubuntu`V24_04;`Ubuntu`LTS(* Latest LTS *);`Ubuntu`V24_10;`Ubuntu`V25_04;`Ubuntu`V25_10;`Ubuntu`Latest;`Cygwin`Ltsc2016;`Cygwin`Ltsc2019;`Cygwin`Ltsc2022;`Cygwin`Latest;`Windows(`Mingw,`Ltsc2019);`Windows(`Mingw,`Latest);`Windows(`Msvc,`Ltsc2019);`Windows(`Msvc,`Latest);`WindowsServer(`Mingw,`Ltsc2022);`WindowsServer(`Mingw,`Ltsc2025);`WindowsServer(`Mingw,`Latest);`WindowsServer(`Msvc,`Ltsc2022);`WindowsServer(`Msvc,`Ltsc2025);`WindowsServer(`Msvc,`Latest);]letresolve_alias(d:t):distro=matchdwith|`Alpine`Latest->`Alpine`V3_22|`CentOS`Latest->`CentOS`V10|`Debian`Stable->`Debian`V13|`Fedora`Latest->`Fedora`V43|`OracleLinux`Latest->`OracleLinux`V10|`OpenSUSE`Latest->`OpenSUSE`V16_0|`Ubuntu`Latest->`Ubuntu`V25_10|`Ubuntu`LTS->`Ubuntu`V24_04|`Cygwin`Latest->`Cygwin`Ltsc2022|`Windows(cc,`Latest)->`Windows(cc,`Ltsc2019)|`WindowsServer(cc,`Latest)->`WindowsServer(cc,`Ltsc2025)|(`Alpine(`V3_3|`V3_4|`V3_5|`V3_6|`V3_7|`V3_8|`V3_9|`V3_10|`V3_11|`V3_12|`V3_13|`V3_14|`V3_15|`V3_16|`V3_17|`V3_18|`V3_19|`V3_20|`V3_21|`V3_22)|`Archlinux`Latest|`CentOS(`V6|`V7|`V8|`V9|`V10)|`Debian(`V7|`V8|`V9|`V10|`V11|`V12|`V13|`Testing|`Unstable)|`Fedora(`V21|`V22|`V23|`V24|`V25|`V26|`V27|`V28|`V29|`V30|`V31|`V32|`V33|`V34|`V35|`V36|`V37|`V38|`V39|`V40|`V41|`V42|`V43)|`OracleLinux(`V7|`V8|`V9|`V10)|`OpenSUSE(`V42_1|`V42_2|`V42_3|`V15_0|`V15_1|`V15_2|`V15_3|`V15_4|`V15_5|`V15_6|`V16_0|`Tumbleweed)|`Ubuntu(`V12_04|`V14_04|`V15_04|`V15_10|`V16_04|`V16_10|`V17_04|`V17_10|`V18_04|`V18_10|`V19_04|`V19_10|`V20_04|`V20_10|`V21_04|`V21_10|`V22_04|`V22_10|`V23_04|`V23_10|`V24_04|`V24_10|`V25_04|`V25_10)|`Cygwin(`Ltsc2016|`Ltsc2019|`Ltsc2022)|`Windows(_,`Ltsc2019)|`WindowsServer(_,(`Ltsc2022|`Ltsc2025)))asd->dletdistro_status(d:t):status=letresolved=resolve_aliasdinif(resolved:distro:>t)<>dthen`Aliaselsematchresolve_aliasdwith|`Alpine(`V3_3|`V3_4|`V3_5|`V3_6|`V3_7|`V3_8|`V3_9|`V3_10|`V3_11|`V3_12|`V3_13|`V3_14|`V3_15|`V3_16|`V3_17|`V3_18|`V3_19|`V3_20|`V3_21)->`Deprecated|`Alpine`V3_22->`Active`Tier1|`Archlinux`Latest->`Active`Tier3|`CentOS(`V9|`V10)->`Active`Tier3|`CentOS(`V6|`V7|`V8)->`Deprecated|`Debian(`V7|`V8|`V9|`V10|`V11)->`Deprecated|`Debian`V12->`Active`Tier2|`Debian`V13->`Active`Tier1|`Debian`Testing->`Active`Tier3|`Debian`Unstable->`Active`Tier3|`Fedora(`V21|`V22|`V23|`V24|`V25|`V26|`V27|`V28|`V29|`V30|`V31|`V32|`V33|`V34|`V35|`V36|`V37|`V38|`V39|`V40|`V41)->`Deprecated|`Fedora(`V42|`V43)->`Active`Tier2|`OracleLinux(`V7|`V8|`V9)->`Deprecated|`OracleLinux`V10->`Active`Tier3|`OpenSUSE(`V42_1|`V42_2|`V42_3|`V15_0|`V15_1|`V15_2|`V15_3|`V15_4|`V15_5)->`Deprecated|`OpenSUSE(`V15_6|`V16_0)->`Active`Tier2|`OpenSUSE`Tumbleweed->`Active`Tier2|`Ubuntu(`V22_04|`V24_04|`V25_04|`V25_10)->`Active`Tier2|`Ubuntu(`V12_04|`V14_04|`V15_04|`V15_10|`V16_04|`V16_10|`V17_04|`V17_10|`V18_04|`V18_10|`V19_04|`V19_10|`V20_04|`V20_10|`V21_04|`V21_10|`V22_10|`V23_04|`V23_10|`V24_10)->`Deprecated|`Cygwin(`Ltsc2016|`Ltsc2019)->`Deprecated|`Cygwin`Ltsc2022->`Active`Tier3|`Windows(_,`Ltsc2019)->`Active`Tier3|`WindowsServer(_,(`Ltsc2022|`Ltsc2025))->`Active`Tier3letlatest_distros=[`Alpine`Latest;`Archlinux`Latest;`CentOS`Latest;`Debian`Stable;`OracleLinux`Latest;`OpenSUSE`Latest;`OpenSUSE`Tumbleweed;`Fedora`Latest;`Ubuntu`Latest;`Ubuntu`LTS;`Cygwin`Latest;`Windows(`Mingw,`Latest);`Windows(`Msvc,`Latest);`WindowsServer(`Mingw,`Latest);`WindowsServer(`Msvc,`Latest);]letmaster_distro=`Debian`StablemoduleOV=Ocaml_versionletdistro_archesov(d:t)=match(resolve_aliasd,ov)with|(`CentOS(`V6|`V7)|`OracleLinux`V7),ovwhenOV.majorov>=5->[]|`Debian`V13,ovwhenOV.(compareReleases.v4_11_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32;`Ppc64le;`S390x;`Riscv64]|`Debian`V13,ovwhenOV.(compareReleases.v4_03_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32;`Ppc64le;`S390x]|`Debian`V13,ovwhenOV.(compareReleases.v4_02_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32]|`Debian`V12,ovwhenOV.(compareReleases.v4_03_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32;`Ppc64le;`S390x]|`Debian`V12,ovwhenOV.(compareReleases.v4_02_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32]|`Debian`V11,ovwhenOV.(compareReleases.v4_02_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32]|`Debian`V10,ovwhenOV.(compareReleases.v4_03_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32]|`Debian`V10,ovwhenOV.(compareReleases.v4_02_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32]|`Debian`V9,ovwhenOV.(compareReleases.v4_03_0ov)=-1->[`I386;`X86_64;`Aarch64;`Aarch32]|(`Alpine(`V3_6|`V3_7|`V3_8|`V3_9|`V3_10|`V3_11|`V3_12|`V3_13|`V3_14|`V3_15|`V3_16|`V3_17|`V3_18|`V3_19|`V3_20|`V3_21|`V3_22),ov)whenOV.(compareReleases.v4_05_0ov)=-1->[`X86_64;`Aarch64]|`Ubuntu`V18_04,ovwhenOV.(compareReleases.v4_05_0ov)=-1->[`X86_64;`Aarch64;`Ppc64le;`S390x]|(`Ubuntu(`V20_04|`V20_10|`V21_04|`V21_10|`V22_04|`V22_10|`V23_04|`V23_10|`V24_04|`V24_10|`V25_04),ov)whenOV.(compareReleases.v4_05_0ov)=-1->letbase=[`X86_64;`Aarch64;`Ppc64le;`S390x]inifOV.(compareReleases.v4_11_0ov)<=0then`Riscv64::baseelsebase|`Ubuntu`V25_10,ovwhenOV.(compareReleases.v4_05_0ov)=-1->(* Ubuntu 25.10's Only Supported RISC-V Platform is QEMU Virtualization *)[`X86_64;`Aarch64;`Ppc64le;`S390x]|(`Fedora(`V33|`V34|`V35|`V36|`V37|`V38|`V39|`V40|`V41|`V42|`V43),ov)whenOV.(compareReleases.v4_08_0ov)=-1->[`X86_64;`Aarch64]|`OpenSUSE(`V15_4|`V15_5|`V15_6|`V16_0),ovwhenOV.(compareReleases.v4_02_0ov)=-1->[`X86_64;`Aarch64](* OCaml for Windows doesn't package OCaml 5.0.
TODO: remove when upstream opam gains OCaml packages on Windows. *)|(`Windows(`Mingw,_),ov|`WindowsServer(`Mingw,_),ov)whenOV.majorov>=5->[](* OCaml 5 doesn't support MSVC: https://github.com/ocaml/ocaml/pull/11835. *)|(`Windows(`Msvc,_),ov|`WindowsServer(`Msvc,_),ov)whenOV.majorov>=5->[](* 2021-04-19: should be 4.03 but there's a linking failure until 4.06. *)|(`Windows(`Msvc,_),ov|`WindowsServer(`Msvc,_),ov)whenOV.(compareReleases.v4_06_0ov)=1->[]|_->[`X86_64]letdistro_supported_onaov(d:t)=List.mema(distro_archesovd)letdistro_active_forarch(d:t)=match(arch,d)with|`X86_64,`Windows_|`X86_64,`WindowsServer_->true|_->distro_supported_onarchOV.Releases.latestdletactive_distrosarch=List.filter(fund->matchdistro_statusdwith`Active_->true|_->false)distros|>List.filter(distro_active_forarch)letactive_tier1_distrosarch=List.filter(fund->matchdistro_statusdwith`Active`Tier1->true|_->false)distros|>List.filter(distro_active_forarch)letactive_tier2_distrosarch=List.filter(fund->matchdistro_statusdwith`Active`Tier2->true|_->false)distros|>List.filter(distro_active_forarch)letactive_tier3_distrosarch=List.filter(fund->matchdistro_statusdwith`Active`Tier3->true|_->false)distros|>List.filter(distro_active_forarch)(* The distro-supplied version of OCaml *)letbuiltin_ocaml_of_distro(d:t):stringoption=matchresolve_aliasdwith|`Debian`V7->Some"3.12.1"|`Debian`V8->Some"4.01.0"|`Debian`V9->Some"4.02.3"|`Debian`V10->Some"4.05.0"|`Debian`V11->Some"4.11.1"|`Debian`V12->Some"4.13.1"|`Debian`V13->Some"5.3.0"|`Ubuntu`V12_04->Some"3.12.1"|`Ubuntu`V14_04->Some"4.01.0"|`Ubuntu`V15_04->Some"4.01.0"|`Ubuntu`V15_10->Some"4.01.0"|`Ubuntu`V16_04->Some"4.02.3"|`Ubuntu`V16_10->Some"4.02.3"|`Ubuntu`V17_04->Some"4.02.3"|`Ubuntu`V17_10->Some"4.04.0"|`Ubuntu`V18_04->Some"4.05.0"|`Ubuntu`V18_10->Some"4.05.0"|`Ubuntu`V19_04->Some"4.05.0"|`Ubuntu`V19_10->Some"4.05.0"|`Ubuntu`V20_04->Some"4.08.1"|`Ubuntu`V20_10->Some"4.08.1"|`Ubuntu`V21_04->Some"4.11.1"|`Ubuntu`V21_10->Some"4.11.1"|`Ubuntu`V22_04->Some"4.13.1"|`Ubuntu`V22_10->Some"4.13.1"|`Ubuntu`V23_04->Some"4.13.1"|`Ubuntu`V23_10->Some"4.13.1"|`Ubuntu`V24_04->Some"4.14.1"|`Ubuntu`V24_10->Some"5.2.0"|`Ubuntu`V25_04->Some"5.3.0"|`Ubuntu`V25_10->Some"5.3.0"|`Alpine`V3_3->Some"4.02.3"|`Alpine`V3_4->Some"4.02.3"|`Alpine`V3_5->Some"4.04.0"|`Alpine`V3_6->Some"4.04.1"|`Alpine`V3_7->Some"4.04.2"|`Alpine`V3_8->Some"4.06.1"|`Alpine`V3_9->Some"4.06.1"|`Alpine`V3_10->Some"4.07.0"|`Alpine`V3_11->Some"4.08.1"|`Alpine`V3_12->Some"4.08.1"|`Alpine`V3_13->Some"4.08.1"|`Alpine`V3_14->Some"4.12.0"|`Alpine`V3_15->Some"4.13.1"|`Alpine`V3_16->Some"4.14.0"|`Alpine`V3_17->Some"4.14.0"|`Alpine`V3_18->Some"4.14.1"|`Alpine`V3_19->Some"4.14.1"|`Alpine`V3_20->Some"4.14.2"|`Alpine`V3_21->Some"4.14.2"|`Alpine`V3_22->Some"4.14.2"|`Archlinux`Latest->Some"5.1.0"|`Fedora`V21->Some"4.01.0"|`Fedora`V22->Some"4.02.0"|`Fedora`V23->Some"4.02.2"|`Fedora`V24->Some"4.02.3"|`Fedora`V25->Some"4.02.3"|`Fedora`V26->Some"4.04.0"|`Fedora`V27->Some"4.05.0"|`Fedora`V28->Some"4.06.0"|`Fedora`V29->Some"4.07.0"|`Fedora`V30->Some"4.07.0"|`Fedora`V31->Some"4.08.1"|`Fedora`V32->Some"4.10.0"|`Fedora`V33->Some"4.11.1"|`Fedora`V34->Some"4.11.1"|`Fedora`V35->Some"4.12.0"|`Fedora`V36->Some"4.13.1"|`Fedora`V37->Some"4.13.1"|`Fedora`V38->Some"4.14.0"|`Fedora`V39->Some"5.0.0"|`Fedora`V40->Some"5.1.1"|`Fedora`V41->Some"5.2.1"|`Fedora`V42->Some"5.3.0"|`Fedora`V43->Some"5.3.0"|`CentOS`V6->Some"3.11.2"|`CentOS`V7->Some"4.01.0"|`CentOS`V8->Some"4.07.0"|`CentOS`V9->None|`CentOS`V10->None|`OpenSUSE`V42_1->Some"4.02.3"|`OpenSUSE`V42_2->Some"4.03.0"|`OpenSUSE`V42_3->Some"4.03.0"|`OpenSUSE`V15_0->Some"4.05.0"|`OpenSUSE`V15_1->Some"4.05.0"|`OpenSUSE`V15_2->Some"4.05.0"|`OpenSUSE`V15_3->Some"4.05.0"|`OpenSUSE`V15_4->Some"4.05.0"|`OpenSUSE`V15_5->Some"4.05.0"|`OpenSUSE`V15_6->Some"4.14.2"|`OpenSUSE`V16_0->Some"4.14.2"|`OpenSUSE`Tumbleweed->Some"4.14.1"|`OracleLinux`V7->Some"4.01.0"|`OracleLinux`V8->Some"4.07.0"|`OracleLinux`V9->Some"4.11.1"|`OracleLinux`V10->None|`Cygwin_->None|`Windows_->None|`WindowsServer_->None|`Debian(`Testing|`Unstable)->assertfalse(* The Docker tag for this distro *)lettag_of_distro(d:t)=matchdwith|`Ubuntu`V12_04->"ubuntu-12.04"|`Ubuntu`V14_04->"ubuntu-14.04"|`Ubuntu`V15_04->"ubuntu-15.04"|`Ubuntu`V15_10->"ubuntu-15.10"|`Ubuntu`V16_04->"ubuntu-16.04"|`Ubuntu`V16_10->"ubuntu-16.10"|`Ubuntu`V17_04->"ubuntu-17.04"|`Ubuntu`V17_10->"ubuntu-17.10"|`Ubuntu`V18_04->"ubuntu-18.04"|`Ubuntu`V18_10->"ubuntu-18.10"|`Ubuntu`V19_04->"ubuntu-19.04"|`Ubuntu`V19_10->"ubuntu-19.10"|`Ubuntu`V20_04->"ubuntu-20.04"|`Ubuntu`V20_10->"ubuntu-20.10"|`Ubuntu`V21_04->"ubuntu-21.04"|`Ubuntu`V21_10->"ubuntu-21.10"|`Ubuntu`V22_04->"ubuntu-22.04"|`Ubuntu`V22_10->"ubuntu-22.10"|`Ubuntu`V23_04->"ubuntu-23.04"|`Ubuntu`V23_10->"ubuntu-23.10"|`Ubuntu`V24_04->"ubuntu-24.04"|`Ubuntu`V24_10->"ubuntu-24.10"|`Ubuntu`V25_04->"ubuntu-25.04"|`Ubuntu`V25_10->"ubuntu-25.10"|`Ubuntu`Latest->"ubuntu"|`Ubuntu`LTS->"ubuntu-lts"|`Debian`Stable->"debian-stable"|`Debian`Unstable->"debian-unstable"|`Debian`Testing->"debian-testing"|`Debian`V13->"debian-13"|`Debian`V12->"debian-12"|`Debian`V11->"debian-11"|`Debian`V10->"debian-10"|`Debian`V9->"debian-9"|`Debian`V8->"debian-8"|`Debian`V7->"debian-7"|`CentOS`V6->"centos-6"|`CentOS`V7->"centos-7"|`CentOS`V8->"centos-8"|`CentOS`V9->"centos-9"|`CentOS`V10->"centos-10"|`CentOS`Latest->"centos"|`Fedora`Latest->"fedora"|`Fedora`V21->"fedora-21"|`Fedora`V22->"fedora-22"|`Fedora`V23->"fedora-23"|`Fedora`V24->"fedora-24"|`Fedora`V25->"fedora-25"|`Fedora`V26->"fedora-26"|`Fedora`V27->"fedora-27"|`Fedora`V28->"fedora-28"|`Fedora`V29->"fedora-29"|`Fedora`V30->"fedora-30"|`Fedora`V31->"fedora-31"|`Fedora`V32->"fedora-32"|`Fedora`V33->"fedora-33"|`Fedora`V34->"fedora-34"|`Fedora`V35->"fedora-35"|`Fedora`V36->"fedora-36"|`Fedora`V37->"fedora-37"|`Fedora`V38->"fedora-38"|`Fedora`V39->"fedora-39"|`Fedora`V40->"fedora-40"|`Fedora`V41->"fedora-41"|`Fedora`V42->"fedora-42"|`Fedora`V43->"fedora-43"|`OracleLinux`V7->"oraclelinux-7"|`OracleLinux`V8->"oraclelinux-8"|`OracleLinux`V9->"oraclelinux-9"|`OracleLinux`V10->"oraclelinux-10"|`OracleLinux`Latest->"oraclelinux"|`Alpine`V3_3->"alpine-3.3"|`Alpine`V3_4->"alpine-3.4"|`Alpine`V3_5->"alpine-3.5"|`Alpine`V3_6->"alpine-3.6"|`Alpine`V3_7->"alpine-3.7"|`Alpine`V3_8->"alpine-3.8"|`Alpine`V3_9->"alpine-3.9"|`Alpine`V3_10->"alpine-3.10"|`Alpine`V3_11->"alpine-3.11"|`Alpine`V3_12->"alpine-3.12"|`Alpine`V3_13->"alpine-3.13"|`Alpine`V3_14->"alpine-3.14"|`Alpine`V3_15->"alpine-3.15"|`Alpine`V3_16->"alpine-3.16"|`Alpine`V3_17->"alpine-3.17"|`Alpine`V3_18->"alpine-3.18"|`Alpine`V3_19->"alpine-3.19"|`Alpine`V3_20->"alpine-3.20"|`Alpine`V3_21->"alpine-3.21"|`Alpine`V3_22->"alpine-3.22"|`Alpine`Latest->"alpine"|`Archlinux`Latest->"archlinux"|`OpenSUSE`V42_1->"opensuse-42.1"|`OpenSUSE`V42_2->"opensuse-42.2"|`OpenSUSE`V42_3->"opensuse-42.3"|`OpenSUSE`V15_0->"opensuse-15.0"|`OpenSUSE`V15_1->"opensuse-15.1"|`OpenSUSE`V15_2->"opensuse-15.2"|`OpenSUSE`V15_3->"opensuse-15.3"|`OpenSUSE`V15_4->"opensuse-15.4"|`OpenSUSE`V15_5->"opensuse-15.5"|`OpenSUSE`V15_6->"opensuse-15.6"|`OpenSUSE`V16_0->"opensuse-16.0"|`OpenSUSE`Tumbleweed->"opensuse-tumbleweed"|`OpenSUSE`Latest->"opensuse"|`Cygwin`Ltsc2016->"cygwin-2016"|`Cygwin`Ltsc2019->"cygwin-2019"|`Cygwin`Ltsc2022->"cygwin-2022"|`Cygwin`Latest->"cygwin"|`Windows(`Mingw,`Ltsc2019)->"windows-mingw-ltsc2019"|`Windows(`Mingw,`Latest)->"windows-mingw"|`Windows(`Msvc,`Ltsc2019)->"windows-msvc-ltsc2019"|`Windows(`Msvc,`Latest)->"windows-msvc"|`WindowsServer(`Mingw,`Ltsc2022)->"windows-server-mingw-ltsc2022"|`WindowsServer(`Mingw,`Ltsc2025)->"windows-server-mingw-ltsc2025"|`WindowsServer(`Mingw,`Latest)->"windows-server-mingw"|`WindowsServer(`Msvc,`Ltsc2022)->"windows-server-msvc-ltsc2022"|`WindowsServer(`Msvc,`Ltsc2025)->"windows-server-msvc-ltsc2025"|`WindowsServer(`Msvc,`Latest)->"windows-server-msvc"letdistro_of_tagx:toption=matchxwith|"ubuntu-12.04"->Some(`Ubuntu`V12_04)|"ubuntu-14.04"->Some(`Ubuntu`V14_04)|"ubuntu-15.04"->Some(`Ubuntu`V15_04)|"ubuntu-15.10"->Some(`Ubuntu`V15_10)|"ubuntu-16.04"->Some(`Ubuntu`V16_04)|"ubuntu-16.10"->Some(`Ubuntu`V16_10)|"ubuntu-17.04"->Some(`Ubuntu`V17_04)|"ubuntu-17.10"->Some(`Ubuntu`V17_10)|"ubuntu-18.04"->Some(`Ubuntu`V18_04)|"ubuntu-18.10"->Some(`Ubuntu`V18_10)|"ubuntu-19.04"->Some(`Ubuntu`V19_04)|"ubuntu-19.10"->Some(`Ubuntu`V19_10)|"ubuntu-20.04"->Some(`Ubuntu`V20_04)|"ubuntu-20.10"->Some(`Ubuntu`V20_10)|"ubuntu-21.04"->Some(`Ubuntu`V21_04)|"ubuntu-21.10"->Some(`Ubuntu`V21_10)|"ubuntu-22.04"->Some(`Ubuntu`V22_04)|"ubuntu-22.10"->Some(`Ubuntu`V22_10)|"ubuntu-23.04"->Some(`Ubuntu`V23_04)|"ubuntu-23.10"->Some(`Ubuntu`V23_10)|"ubuntu-24.04"->Some(`Ubuntu`V24_04)|"ubuntu-24.10"->Some(`Ubuntu`V24_10)|"ubuntu-25.04"->Some(`Ubuntu`V25_04)|"ubuntu-25.10"->Some(`Ubuntu`V25_10)|"ubuntu"->Some(`Ubuntu`Latest)|"ubuntu-lts"->Some(`Ubuntu`LTS)|"debian-stable"->Some(`Debian`Stable)|"debian-unstable"->Some(`Debian`Unstable)|"debian-testing"->Some(`Debian`Testing)|"debian-13"->Some(`Debian`V13)|"debian-12"->Some(`Debian`V12)|"debian-11"->Some(`Debian`V11)|"debian-10"->Some(`Debian`V10)|"debian-9"->Some(`Debian`V9)|"debian-8"->Some(`Debian`V8)|"debian-7"->Some(`Debian`V7)|"centos-6"->Some(`CentOS`V6)|"centos-7"->Some(`CentOS`V7)|"centos-8"->Some(`CentOS`V8)|"centos-9"->Some(`CentOS`V9)|"centos-10"->Some(`CentOS`V10)|"fedora-21"->Some(`Fedora`V21)|"fedora-22"->Some(`Fedora`V22)|"fedora-23"->Some(`Fedora`V23)|"fedora-24"->Some(`Fedora`V24)|"fedora-25"->Some(`Fedora`V25)|"fedora-26"->Some(`Fedora`V26)|"fedora-27"->Some(`Fedora`V27)|"fedora-28"->Some(`Fedora`V28)|"fedora-29"->Some(`Fedora`V29)|"fedora-30"->Some(`Fedora`V30)|"fedora-31"->Some(`Fedora`V31)|"fedora-32"->Some(`Fedora`V32)|"fedora-33"->Some(`Fedora`V33)|"fedora-34"->Some(`Fedora`V34)|"fedora-35"->Some(`Fedora`V35)|"fedora-36"->Some(`Fedora`V36)|"fedora-37"->Some(`Fedora`V37)|"fedora-38"->Some(`Fedora`V38)|"fedora-39"->Some(`Fedora`V39)|"fedora-40"->Some(`Fedora`V40)|"fedora-41"->Some(`Fedora`V41)|"fedora-42"->Some(`Fedora`V42)|"fedora-43"->Some(`Fedora`V43)|"fedora"->Some(`Fedora`Latest)|"oraclelinux-7"->Some(`OracleLinux`V7)|"oraclelinux-8"->Some(`OracleLinux`V8)|"oraclelinux-9"->Some(`OracleLinux`V9)|"oraclelinux-10"->Some(`OracleLinux`V10)|"oraclelinux"->Some(`OracleLinux`Latest)|"alpine-3.3"->Some(`Alpine`V3_3)|"alpine-3.4"->Some(`Alpine`V3_4)|"alpine-3.5"->Some(`Alpine`V3_5)|"alpine-3.6"->Some(`Alpine`V3_6)|"alpine-3.7"->Some(`Alpine`V3_7)|"alpine-3.8"->Some(`Alpine`V3_8)|"alpine-3.9"->Some(`Alpine`V3_9)|"alpine-3.10"->Some(`Alpine`V3_10)|"alpine-3.11"->Some(`Alpine`V3_11)|"alpine-3.12"->Some(`Alpine`V3_12)|"alpine-3.13"->Some(`Alpine`V3_13)|"alpine-3.14"->Some(`Alpine`V3_14)|"alpine-3.15"->Some(`Alpine`V3_15)|"alpine-3.16"->Some(`Alpine`V3_16)|"alpine-3.17"->Some(`Alpine`V3_17)|"alpine-3.18"->Some(`Alpine`V3_18)|"alpine-3.19"->Some(`Alpine`V3_19)|"alpine-3.20"->Some(`Alpine`V3_20)|"alpine-3.21"->Some(`Alpine`V3_21)|"alpine-3.22"->Some(`Alpine`V3_22)|"alpine"->Some(`Alpine`Latest)|"archlinux"->Some(`Archlinux`Latest)|"opensuse-42.1"->Some(`OpenSUSE`V42_1)|"opensuse-42.2"->Some(`OpenSUSE`V42_2)|"opensuse-42.3"->Some(`OpenSUSE`V42_3)|"opensuse-15.0"->Some(`OpenSUSE`V15_0)|"opensuse-15.1"->Some(`OpenSUSE`V15_1)|"opensuse-15.2"->Some(`OpenSUSE`V15_2)|"opensuse-15.3"->Some(`OpenSUSE`V15_3)|"opensuse-15.4"->Some(`OpenSUSE`V15_4)|"opensuse-15.5"->Some(`OpenSUSE`V15_5)|"opensuse-15.6"->Some(`OpenSUSE`V15_6)|"opensuse-16.0"->Some(`OpenSUSE`V16_0)|"opensuse-tumbleweed"->Some(`OpenSUSE`Tumbleweed)|"opensuse"->Some(`OpenSUSE`Latest)|"cygwin-ltsc2016"->Some(`Cygwin`Ltsc2016)|"cygwin-ltsc2019"->Some(`Cygwin`Ltsc2019)|"cygwin-ltsc2022"->Some(`Cygwin`Ltsc2022)|"cygwin"->Some(`Cygwin`Latest)|"windows-mingw-ltsc2019"->Some(`Windows(`Mingw,`Ltsc2019))|"windows-mingw"->Some(`Windows(`Mingw,`Latest))|"windows-msvc-ltsc2019"->Some(`Windows(`Msvc,`Ltsc2019))|"windows-msvc"->Some(`Windows(`Msvc,`Latest))|"windows-server-mingw-ltsc2022"->Some(`WindowsServer(`Mingw,`Ltsc2022))|"windows-server-mingw-ltsc2025"->Some(`WindowsServer(`Mingw,`Ltsc2025))|"windows-server-mingw"->Some(`WindowsServer(`Mingw,`Latest))|"windows-server-msvc-ltsc2022"->Some(`WindowsServer(`Msvc,`Ltsc2022))|"windows-server-msvc-ltsc2025"->Some(`WindowsServer(`Msvc,`Ltsc2025))|"windows-server-msvc"->Some(`WindowsServer(`Msvc,`Latest))|_->Nonelethuman_readable_string_of_distro(d:t)=ifd=`Debian`Stablethen"Debian Stable"elsematchresolve_aliasdwith|`Ubuntu`V12_04->"Ubuntu 12.04"|`Ubuntu`V14_04->"Ubuntu 14.04"|`Ubuntu`V15_04->"Ubuntu 15.04"|`Ubuntu`V15_10->"Ubuntu 15.10"|`Ubuntu`V16_04->"Ubuntu 16.04"|`Ubuntu`V16_10->"Ubuntu 16.10"|`Ubuntu`V17_04->"Ubuntu 17.04"|`Ubuntu`V17_10->"Ubuntu 17.10"|`Ubuntu`V18_04->"Ubuntu 18.04"|`Ubuntu`V18_10->"Ubuntu 18.10"|`Ubuntu`V19_04->"Ubuntu 19.04"|`Ubuntu`V19_10->"Ubuntu 19.10"|`Ubuntu`V20_04->"Ubuntu 20.04"|`Ubuntu`V20_10->"Ubuntu 20.10"|`Ubuntu`V21_04->"Ubuntu 21.04"|`Ubuntu`V21_10->"Ubuntu 21.10"|`Ubuntu`V22_04->"Ubuntu 22.04"|`Ubuntu`V22_10->"Ubuntu 22.10"|`Ubuntu`V23_04->"Ubuntu 23.04"|`Ubuntu`V23_10->"Ubuntu 23.10"|`Ubuntu`V24_04->"Ubuntu 24.04"|`Ubuntu`V24_10->"Ubuntu 24.10"|`Ubuntu`V25_04->"Ubuntu 25.04"|`Ubuntu`V25_10->"Ubuntu 25.10"|`Debian`Unstable->"Debian Unstable"|`Debian`Testing->"Debian Testing"|`Debian`V13->"Debian 13 (Trixie)"|`Debian`V12->"Debian 12 (Bookworm)"|`Debian`V11->"Debian 11 (Bullseye)"|`Debian`V10->"Debian 10 (Buster)"|`Debian`V9->"Debian 9 (Stretch)"|`Debian`V8->"Debian 8 (Jessie)"|`Debian`V7->"Debian 7 (Wheezy)"|`CentOS`V6->"CentOS 6"|`CentOS`V7->"CentOS 7"|`CentOS`V8->"CentOS 8"|`CentOS`V9->"CentOS Stream 9"|`CentOS`V10->"CentOS Stream 10"|`Fedora`V21->"Fedora 21"|`Fedora`V22->"Fedora 22"|`Fedora`V23->"Fedora 23"|`Fedora`V24->"Fedora 24"|`Fedora`V25->"Fedora 25"|`Fedora`V26->"Fedora 26"|`Fedora`V27->"Fedora 27"|`Fedora`V28->"Fedora 28"|`Fedora`V29->"Fedora 29"|`Fedora`V30->"Fedora 30"|`Fedora`V31->"Fedora 31"|`Fedora`V32->"Fedora 32"|`Fedora`V33->"Fedora 33"|`Fedora`V34->"Fedora 34"|`Fedora`V35->"Fedora 35"|`Fedora`V36->"Fedora 36"|`Fedora`V37->"Fedora 37"|`Fedora`V38->"Fedora 38"|`Fedora`V39->"Fedora 39"|`Fedora`V40->"Fedora 40"|`Fedora`V41->"Fedora 41"|`Fedora`V42->"Fedora 42"|`Fedora`V43->"Fedora 43"|`OracleLinux`V7->"OracleLinux 7"|`OracleLinux`V8->"OracleLinux 8"|`OracleLinux`V9->"OracleLinux 9"|`OracleLinux`V10->"OracleLinux 10"|`Alpine`V3_3->"Alpine 3.3"|`Alpine`V3_4->"Alpine 3.4"|`Alpine`V3_5->"Alpine 3.5"|`Alpine`V3_6->"Alpine 3.6"|`Alpine`V3_7->"Alpine 3.7"|`Alpine`V3_8->"Alpine 3.8"|`Alpine`V3_9->"Alpine 3.9"|`Alpine`V3_10->"Alpine 3.10"|`Alpine`V3_11->"Alpine 3.11"|`Alpine`V3_12->"Alpine 3.12"|`Alpine`V3_13->"Alpine 3.13"|`Alpine`V3_14->"Alpine 3.14"|`Alpine`V3_15->"Alpine 3.15"|`Alpine`V3_16->"Alpine 3.16"|`Alpine`V3_17->"Alpine 3.17"|`Alpine`V3_18->"Alpine 3.18"|`Alpine`V3_19->"Alpine 3.19"|`Alpine`V3_20->"Alpine 3.20"|`Alpine`V3_21->"Alpine 3.21"|`Alpine`V3_22->"Alpine 3.22"|`Archlinux`Latest->"Archlinux"|`OpenSUSE`V42_1->"OpenSUSE 42.1"|`OpenSUSE`V42_2->"OpenSUSE 42.2"|`OpenSUSE`V42_3->"OpenSUSE 42.3"|`OpenSUSE`V15_0->"OpenSUSE 15.0 (Leap)"|`OpenSUSE`V15_1->"OpenSUSE 15.1 (Leap)"|`OpenSUSE`V15_2->"OpenSUSE 15.2 (Leap)"|`OpenSUSE`V15_3->"OpenSUSE 15.3 (Leap)"|`OpenSUSE`V15_4->"OpenSUSE 15.4 (Leap)"|`OpenSUSE`V15_5->"OpenSUSE 15.5 (Leap)"|`OpenSUSE`V15_6->"OpenSUSE 15.6 (Leap)"|`OpenSUSE`V16_0->"OpenSUSE 16.0 (Leap)"|`OpenSUSE`Tumbleweed->"OpenSUSE Tumbleweed"|`Cygwin`Ltsc2016->"Cygwin Ltsc2016"|`Cygwin`Ltsc2019->"Cygwin Ltsc2019"|`Cygwin`Ltsc2022->"Cygwin Ltsc2022"|`Windows(`Mingw,`Ltsc2019)->"Windows Ltsc2019 mingw"|`Windows(`Msvc,`Ltsc2019)->"Windows Ltsc2019 msvc"|`WindowsServer(`Mingw,`Ltsc2022)->"Windows Server Ltsc2022 mingw"|`WindowsServer(`Mingw,`Ltsc2025)->"Windows Server Ltsc2025 mingw"|`WindowsServer(`Msvc,`Ltsc2022)->"Windows Server Ltsc2022 msvc"|`WindowsServer(`Msvc,`Ltsc2025)->"Windows Server Ltsc2025 msvc"lethuman_readable_short_string_of_distro(t:t)=matchtwith|`Ubuntu_->"Ubuntu"|`Debian_->"Debian"|`CentOS_->"CentOS"|`Fedora_->"Fedora"|`OracleLinux_->"OracleLinux"|`Alpine_->"Alpine"|`Archlinux_->"Archlinux"|`OpenSUSE_->"OpenSUSE"|`Cygwin_->"Cygwin"|`Windows(`Mingw,_)->"Windows mingw"|`Windows(`Msvc,_)->"Windows mvsc"|`WindowsServer(`Mingw,_)->"Windows Server mingw"|`WindowsServer(`Msvc,_)->"Windows Server mvsc"letis_same_distro(d1:t)(d2:t)=match(d1,d2)with|`Ubuntu_,`Ubuntu_|`Debian_,`Debian_|`CentOS_,`CentOS_|`Fedora_,`Fedora_|`OracleLinux_,`OracleLinux_|`Alpine_,`Alpine_|`Archlinux_,`Archlinux_|`OpenSUSE_,`OpenSUSE_|`Cygwin_,`Cygwin_->true|`Windows(p1,_),`Windows(p2,_)whenp1=p2->true|`WindowsServer(p1,_),`WindowsServer(p2,_)whenp1=p2->true|_->false(* The alias tag for the latest stable version of this distro *)letlatest_tag_of_distro(t:t)=letlatest=List.find(is_same_distrot)latest_distrosintag_of_distrolatesttypepackage_manager=[`Apt|`Yum|`Apk|`Zypper|`Pacman|`Cygwin|`Windows][@@derivingsexp]letpackage_manager(t:t)=matchtwith|`Ubuntu_->`Apt|`Debian_->`Apt|`CentOS_->`Yum|`Fedora_->`Yum|`OracleLinux_->`Yum|`Alpine_->`Apk|`Archlinux_->`Pacman|`OpenSUSE_->`Zypper|`Cygwin_->`Cygwin|`Windows_->`Windows|`WindowsServer_->`Windowsletbubblewrap_version(t:t)=matchresolve_aliastwith|`Ubuntu`V12_04->None|`Ubuntu`V14_04->None|`Ubuntu`V15_04->None|`Ubuntu`V15_10->None|`Ubuntu`V16_04->None|`Ubuntu`V16_10->None(* Not actually checked *)|`Ubuntu`V17_04->None(* Not actually checked *)|`Ubuntu`V17_10->None(* Not actually checked *)|`Ubuntu`V18_04->Some(0,2,1)|`Ubuntu`V18_10->Some(0,2,1)(* Not actually checked *)|`Ubuntu`V19_04->Some(0,2,1)(* Not actually checked *)|`Ubuntu`V19_10->Some(0,2,1)(* Not actually checked *)|`Ubuntu`V20_04->Some(0,4,0)|`Ubuntu`V20_10->Some(0,4,0)(* Not actually checked *)|`Ubuntu`V21_04->Some(0,4,1)|`Ubuntu`V21_10->Some(0,4,1)|`Ubuntu`V22_04->Some(0,6,1)|`Ubuntu`V22_10->Some(0,6,2)|`Ubuntu`V23_04->Some(0,8,0)|`Ubuntu`V23_10->Some(0,8,0)|`Ubuntu`V24_04->Some(0,9,0)|`Ubuntu`V24_10->Some(0,10,0)|`Ubuntu`V25_04->Some(0,11,0)|`Ubuntu`V25_10->Some(0,11,0)|`Debian`V7->None(* Not actually checked *)|`Debian`V8->None(* Not actually checked *)|`Debian`V9->Some(0,1,7)|`Debian`V10->Some(0,3,1)|`Debian`V11->Some(0,4,1)|`Debian`V12->Some(0,8,0)|`Debian`V13->Some(0,11,0)|`Debian`Testing->Some(0,8,0)|`Debian`Unstable->Some(0,8,0)|`CentOS`V6->None|`CentOS`V7->None|`CentOS`V8->Some(0,4,0)|`CentOS`V9->Some(0,6,3)|`CentOS`V10->Some(0,10,0)|`Fedora`V21->None(* Not actually checked *)|`Fedora`V22->None(* Not actually checked *)|`Fedora`V23->None(* Not actually checked *)|`Fedora`V24->None(* Not actually checked *)|`Fedora`V25->None(* Not actually checked *)|`Fedora`V26->Some(0,2,0)|`Fedora`V27->Some(0,2,1)|`Fedora`V28->Some(0,3,0)|`Fedora`V29->Some(0,3,1)|`Fedora`V30->Some(0,3,3)|`Fedora`V31->Some(0,4,1)|`Fedora`V32->Some(0,4,1)|`Fedora`V33->Some(0,4,1)|`Fedora`V34->Some(0,4,1)|`Fedora`V35->Some(0,5,0)|`Fedora`V36->Some(0,5,0)|`Fedora`V37->Some(0,5,0)|`Fedora`V38->Some(0,7,0)|`Fedora`V39->Some(0,10,0)|`Fedora`V40->Some(0,10,0)|`Fedora`V41->Some(0,10,0)|`Fedora`V42->Some(0,11,0)|`Fedora`V43->Some(0,11,0)|`OracleLinux`V7->None|`OracleLinux`V8->Some(0,4,0)|`OracleLinux`V9->Some(0,4,1)|`OracleLinux`V10->Some(0,10,0)|`Alpine`V3_3->None(* Not actually checked *)|`Alpine`V3_4->None(* Not actually checked *)|`Alpine`V3_5->None(* Not actually checked *)|`Alpine`V3_6->None(* Not actually checked *)|`Alpine`V3_7->None(* Not actually checked *)|`Alpine`V3_8->Some(0,2,0)|`Alpine`V3_9->Some(0,3,1)|`Alpine`V3_10->Some(0,3,3)|`Alpine`V3_11->Some(0,4,1)|`Alpine`V3_12->Some(0,4,1)|`Alpine`V3_13->Some(0,4,1)|`Alpine`V3_14->Some(0,4,1)|`Alpine`V3_15->Some(0,5,0)|`Alpine`V3_16->Some(0,6,2)|`Alpine`V3_17->Some(0,7,0)|`Alpine`V3_18->Some(0,8,0)|`Alpine`V3_19->Some(0,8,0)|`Alpine`V3_20->Some(0,10,0)|`Alpine`V3_21->Some(0,11,0)|`Alpine`V3_22->Some(0,11,0)|`Archlinux`Latest->Some(0,8,0)|`OpenSUSE`V42_1->None(* Not actually checked *)|`OpenSUSE`V42_2->None(* Not actually checked *)|`OpenSUSE`V42_3->None(* Not actually checked *)|`OpenSUSE`V15_0->Some(0,2,0)|`OpenSUSE`V15_1->Some(0,3,3)|`OpenSUSE`V15_2->Some(0,4,1)|`OpenSUSE`V15_3->Some(0,4,1)|`OpenSUSE`V15_4->Some(0,4,1)|`OpenSUSE`V15_5->Some(0,7,0)|`OpenSUSE`V15_6->Some(0,8,0)|`OpenSUSE`V16_0->Some(0,11,0)|`OpenSUSE`Tumbleweed->Some(0,8,0)|`Cygwin_->None|`Windows_->None|`WindowsServer_->Noneletbase_distro_tag?(arch=`X86_64)d=matchresolve_aliasdwith|`Alpinev->(lettag=matchvwith|`V3_3->"3.3"|`V3_4->"3.4"|`V3_5->"3.5"|`V3_6->"3.6"|`V3_7->"3.7"|`V3_8->"3.8"|`V3_9->"3.9"|`V3_10->"3.10"|`V3_11->"3.11"|`V3_12->"3.12"|`V3_13->"3.13"|`V3_14->"3.14"|`V3_15->"3.15"|`V3_16->"3.16"|`V3_17->"3.17"|`V3_18->"3.18"|`V3_19->"3.19"|`V3_20->"3.20"|`V3_21->"3.21"|`V3_22->"3.22"inmatcharchwith`I386->("i386/alpine",tag)|_->("alpine",tag))|`Archlinux`Latest->("archlinux","latest")|`Debianv->(lettag=matchvwith|`V7->"7"|`V8->"8"|`V9->"9"|`V10->"10"|`V11->"11"|`V12->"12"|`V13->"13"|`Testing->"testing"|`Unstable->"unstable"inmatch(arch,v)with|`I386,`V7->("i386/debian",tag)|`Aarch32,(`V7|`V8)->("arm32v7/debian",tag)|`Ppc64le,(`V8|`V9|`V10)->("ppc64le/debian",tag)|`S390x,(`V8|`V9|`V10)->("s390x/debian",tag)|_->("debian",tag))|`Ubuntuv->lettag=matchvwith|`V12_04->"precise"|`V14_04->"trusty"|`V15_04->"vivid"|`V15_10->"wily"|`V16_04->"xenial"|`V16_10->"yakkety"|`V17_04->"zesty"|`V17_10->"artful"|`V18_04->"bionic"|`V18_10->"cosmic"|`V19_04->"disco"|`V19_10->"eoan"|`V20_04->"focal"|`V20_10->"groovy"|`V21_04->"hirsute"|`V21_10->"impish"|`V22_04->"jammy"|`V22_10->"kinetic"|`V23_04->"lunar"|`V23_10->"mantic"|`V24_04->"noble"|`V24_10->"oracular"|`V25_04->"plucky"|`V25_10->"questing"in("ubuntu",tag)|`CentOSv->lettag=matchvwith|`V6->"6"|`V7->"7"|`V8->"8"|`V9->"stream9"|`V10->"stream10"in((matchvwith`V9|`V10->"quay.io/centos/centos"|_->"centos"),tag)|`Fedorav->lettag=matchvwith|`V21->"21"|`V22->"22"|`V23->"23"|`V24->"24"|`V25->"25"|`V26->"26"|`V27->"27"|`V28->"28"|`V29->"29"|`V30->"30"|`V31->"31"|`V32->"32"|`V33->"33"|`V34->"34"|`V35->"35"|`V36->"36"|`V37->"37"|`V38->"38"|`V39->"39"|`V40->"40"|`V41->"41"|`V42->"42"|`V43->"43"in("fedora",tag)|`OracleLinuxv->lettag=matchvwith`V7->"7"|`V8->"8"|`V9->"9"|`V10->"10"in("oraclelinux",tag)|`OpenSUSE`Tumbleweed->("opensuse/tumbleweed","latest")|`OpenSUSEv->lettag=matchvwith|`V42_1->"42.1"|`V42_2->"42.2"|`V42_3->"42.3"|`V15_0->"15.0"|`V15_1->"15.1"|`V15_2->"15.2"|`V15_3->"15.3"|`V15_4->"15.4"|`V15_5->"15.5"|`V15_6->"15.6"|`V16_0->"16.0"|`Tumbleweed->assertfalsein("opensuse/leap",tag)|`Cygwinv->lettag=matchvwith|`Ltsc2016->"ltsc2016"|`Ltsc2019->"ltsc2019"|`Ltsc2022->"ltsc2022"in("mcr.microsoft.com/windows/servercore",tag)|`Windowsv->lettag=matchvwith_,`Ltsc2019->"ltsc2019"in("mcr.microsoft.com/windows",tag)|`WindowsServerv->lettag=matchvwith_,`Ltsc2022->"ltsc2022"|_,`Ltsc2025->"ltsc2025"in("mcr.microsoft.com/windows/server",tag)letsort_key_of_distro(d:t)=ifd=`Debian`Stablethen(* "Compatibility" with use of human_readable_string_of_distro
before, giving `Debian `Stable < `Debian `Testing but greater
than all numbered releases. *)50997elsematchresolve_aliasdwith|`Alpine`V3_3->10001|`Alpine`V3_4->10002|`Alpine`V3_5->10003|`Alpine`V3_6->10004|`Alpine`V3_7->10005|`Alpine`V3_8->10005|`Alpine`V3_9->10005|`Alpine`V3_10->10005|`Alpine`V3_11->10005|`Alpine`V3_12->10005|`Alpine`V3_13->10005|`Alpine`V3_14->10005|`Alpine`V3_15->10005|`Alpine`V3_16->10005|`Alpine`V3_17->10005|`Alpine`V3_18->10005|`Alpine`V3_19->10005|`Alpine`V3_20->10005|`Alpine`V3_21->10005|`Alpine`V3_22->10005|`Archlinux`Latest->20000|`CentOS`V6->30000|`CentOS`V7->30001|`CentOS`V8->30002|`CentOS`V9->30003|`CentOS`V10->30004|`Cygwin`Ltsc2016->40000|`Cygwin`Ltsc2019->40001|`Cygwin`Ltsc2022->40002|`Debian`V7->50000|`Debian`V8->50001|`Debian`V9->50002|`Debian`V10->50003|`Debian`V11->50004|`Debian`V12->50005|`Debian`V13->50006|`Debian`Testing->50998|`Debian`Unstable->50999|`Fedora`V21->60000|`Fedora`V22->60001|`Fedora`V23->60002|`Fedora`V24->60003|`Fedora`V25->60004|`Fedora`V26->60005|`Fedora`V27->60006|`Fedora`V28->60007|`Fedora`V29->60008|`Fedora`V30->60009|`Fedora`V31->60010|`Fedora`V32->60011|`Fedora`V33->60012|`Fedora`V34->60013|`Fedora`V35->60014|`Fedora`V36->60015|`Fedora`V37->60016|`Fedora`V38->60017|`Fedora`V39->60018|`Fedora`V40->60019|`Fedora`V41->60020|`Fedora`V42->60021|`Fedora`V43->60022|`OpenSUSE`V42_1->70000|`OpenSUSE`V42_2->70001|`OpenSUSE`V42_3->70002|`OpenSUSE`V15_0->70003|`OpenSUSE`V15_1->70004|`OpenSUSE`V15_2->70005|`OpenSUSE`V15_3->70006|`OpenSUSE`V15_4->70007|`OpenSUSE`V15_5->70008|`OpenSUSE`V15_6->70009|`OpenSUSE`V16_0->70010|`OpenSUSE`Tumbleweed->70999|`OracleLinux`V7->80000|`OracleLinux`V8->80001|`OracleLinux`V9->80002|`OracleLinux`V10->80003|`Ubuntu`V12_04->90000|`Ubuntu`V14_04->90001|`Ubuntu`V15_04->90002|`Ubuntu`V15_10->90003|`Ubuntu`V16_04->90004|`Ubuntu`V16_10->90005|`Ubuntu`V17_04->90006|`Ubuntu`V17_10->90007|`Ubuntu`V18_04->90008|`Ubuntu`V18_10->90009|`Ubuntu`V19_04->90010|`Ubuntu`V19_10->90011|`Ubuntu`V20_04->90012|`Ubuntu`V20_10->90013|`Ubuntu`V21_04->90014|`Ubuntu`V21_10->90015|`Ubuntu`V22_04->90016|`Ubuntu`V22_10->90017|`Ubuntu`V23_04->90018|`Ubuntu`V23_10->90019|`Ubuntu`V24_04->90020|`Ubuntu`V24_10->90021|`Ubuntu`V25_04->90022|`Ubuntu`V25_10->90023|`Windows(`Mingw,`Ltsc2019)->100000|`Windows(`Msvc,`Ltsc2019)->100001|`WindowsServer(`Mingw,`Ltsc2022)->110000|`WindowsServer(`Mingw,`Ltsc2025)->110001|`WindowsServer(`Msvc,`Ltsc2022)->110002|`WindowsServer(`Msvc,`Ltsc2025)->110003letcompareab=Int.compare(sort_key_of_distroa)(sort_key_of_distrob)