OPAM-UNINSTALL(1)
π OPAM-UNINSTALL π
okay bestie, welcome to the opam manual page for opam-uninstall β she's part of the Opam Manual squad, and ngl she's the chillest one here because she's literally just an alias. but don't let that fool you, there's a ton of options under the hood and we're going through every single one. no skipping. periodt.
β¨ NAME β¨
opam-uninstall β an alias for remove. that's it. that's the whole vibe. π
πΈ SYNOPSIS πΈ
opam uninstall [OPTION]β¦ [PACKAGES]β¦
π¦ DESCRIPTION π¦
so opam uninstall is literally just a cute lil alias for opam remove. same girl, different name, main character energy either way. π
if you want the full deets, run opam remove --help and she'll spill everything.
π PACKAGE BUILD OPTIONS π
--assume-depextsβ skip the whole installation step for any system packages you're missing, and just try to compile the opam packages anyway like it's fine. if it actually works out, opam won't nag you about those system packages ever again. heads up tho: this only does anything if external dependency handling is turned on. π«-b,--keep-build-dirβ keeps the build directories around after compiling your packages. think of it as not throwing away the receipts. this is the same as setting$OPAMKEEPBUILDDIRto"true".--build-docβ nope, removed in 2.1. use--with-docinstead bestie.--build-testβ also gone, removed in 2.1. use--with-testnow.-d,--with-docβ builds the package documentation. only affects the packages you actually listed on the command line (she's picky like that). equivalent to setting$OPAMWITHDOC(or the deprecated$OPAMBUILDDOC) to"true".--dry-runβ simulates the command but doesn't actually change anything. it's giving window shopping. ποΈ you can also toggle this with the$OPAMDEBUGenvironment variable.--fakeβ registers the actions into the opam database without actually performing them. WARNING: this one is dangerous and will very likely break your whole opam environment. you almost definitely want--dry-runinstead. you've been warned, don't come crying. π--ignore-available-on[=PACKAGES](default=) β forces opam to mark those listed packages as available. good for testing compatibility, but expect builds to break when you use it. also note that version constraints on the packages' dependencies are totally unaffected.--ignore-constraints-on[=PACKAGES](default=) β makes opam ignore version constraints on all dependencies of the listed packages. again, compatibility testing purposes only, and again, expect breakage. heads up: availability of the packages, plus version constraints on optional dependencies and conflicts, are all unaffected. same as setting$OPAMIGNORECONSTRAINTS.--inplace-buildβ when a package's source is bound to a local directory, this runs the build and install actions right there in that directory instead of in a clean copy that opam manages. only affects packages explicitly listed on the command line. equivalent to setting$OPAMINPLACEBUILDto"true".-j JOBS,--jobs=JOBSβ sets the max number of concurrent jobs. default is calculated from your number of cores (she's smart like that β¨). you can also set this with the$OPAMJOBSenvironment variable.--lock-suffix=SUFFIX(absent=locked) β sets the locked files suffix toSUFFIX.--lockedβ in commands that use opam files found from pinned sources, if there's a variant of the file with an added.lockedextension (likefoo.opam.lockedsitting next tofoo.opam), that one gets used instead. this is typically for offering a more specific set of dependencies and reproducing similar build contexts β hence the name. thelockoption can generate those files for you, based on the versions of dependencies currently installed on the host. equivalent to setting$OPAMLOCKED. note that this doesn't generally affect already pinned packages.-m MAKE,--make=MAKEβ gone as of 2.1. useopam config set[-global] make MAKEinstead.--no-checksumsβ doesn't verify the checksum of downloaded archives. equivalent to setting$OPAMNOCHECKSUMSto"true".--no-depextsβ temporarily disables handling of external dependencies. super useful if a package isn't available on your system package manager but you installed the required dependency by hand (DIY queen π ). implies--assume-depexts, and stores the exceptions upon success as well.--require-checksumsβ rejects installation of packages that don't provide a checksum for the upstream archives. equivalent to setting$OPAMREQUIRECHECKSUMSto"true".--reuse-build-dirβ reuses existing build directories (the ones you kept with--keep-build-dir) instead of compiling from a fresh clone of the source. can be faster, but lowkey can also cause failures if the packages' build systems don't handle dependency upgrades well. equivalent to setting$OPAMREUSEBUILDDIRto"true".--show-actionsβ calls the solver and shows you the actions. doesn't perform any changes. equivalent to setting$OPAMSHOW.--skip-updatesβ when you run an install, upgrade or reinstall on source-pinned packages, they normally get updated from their origin first. this flag says "no thank you" to that behaviour and keeps them at their cached version. equivalent to setting$OPAMSKIPUPDATE.-t,--with-testβ builds and runs the package unit-tests. only affects packages listed on the command line. equivalent to setting$OPAMWITHTEST(or the deprecated$OPAMBUILDTEST) to"true".--unlock-baseβ removed in 2.1, use--update-invariantinstead.--update-invariantβ allows changes to the set of packages designated as switch base (usually the main compiler). use with caution, this is not a casual move. equivalent to setting the$OPAMUNLOCKBASEenvironment variable.--verbose-on=PACKAGESβ gets more verbose on specific packages. equivalent to setting$OPAMVERBOSE.--with-dev-setupβ includes development-tools-only dependencies.
π ARGUMENTS π
PACKAGESβ a list of package names, with an optional version or constraint, e.g.`pkg',`pkg.1.0'or`pkg>=0.5'; or directory names containing a package description, with an explicit directory (e.g.`./srcdir'or`.').
π OPTIONS π
-a,--auto-removeβ removes all the packages that weren't explicitly installed and that aren't necessary anymore. if you want to protect an already-installed package from getting swept up, you can runopam install <pkg> --set-root. this flag can also be set using the$OPAMAUTOREMOVEconfiguration variable.--destdir=DIRβ instead of uninstalling the packages, this reverts the action ofopam install --destdir: it removes files corresponding to what the listed packages installed to the current switch, from the givenDIR. quick note: the package needs to still be installed to the same version that was used forinstall --destdirfor this to work reliably. also, the packages are not removed from the current opam switch when this is specified.--forceβ executes the remove commands of the given packages directly, even if opam doesn't consider them installed. she's not asking questions, she's just doing it. π₯--formula=FORMULA(absent=[]) β experimental. specifies a dependency formula to be verified by the solution, in addition to the switch invariant. the format is the same as for expressing dependencies in package definition files, e.g.'"foo" {>= "1.1"}'.--recursiveβ allows recursive lookups of*.opamfiles. cf.--subpathtoo.--subpath=PATHβ*.opamfiles get retrieved from the given sub directory instead of the top directory. sources are then taken from the targeted sub directory β internally, only this subdirectory is copied/fetched. you can combine it with--recursiveto get a recursive lookup on the subpath. π§
π COMMON OPTIONS π
okay bestie these are the options that literally every opam command has, like the shared friend group of flags π«Ά. Same ones everywhere you go.
--best-effortβ this one's the "we tried our best, and that's what matters" flag π₯Ί. Instead of just dying when it can't install all the packages you asked for, it installs as many as it possibly can. Heads up though: not every external solver supports this (recent versions ofaspcudormccsshould, no cap). Setting it is the same as setting the$OPAMBESTEFFORTenvironment variable.--cli=MAJOR.MINOR(absent=2.6) β use the command-line interface syntax and semantics ofMAJOR.MINOR. This one's for anyone doing persistent opam stuff β scripts, blog posts, whatever β because any opam in the sameMAJORseries will behave like that specificMINORrelease β¨. Real talk though: this flag did not exist in opam 2.0, so if you wanna select the 2.0 CLI you gotta set theOPAMCLIenvironment variable to2.0instead of using this parameter. iykyk π--color=WHENβ colorizes your output π.WHENmust be one ofalways,neverorauto.--confirm-level=LEVELβ sets the confirmation level :)LEVELmust be one ofask,no,yesorunsafe-yesπ³. You can pass this more than once. And if--yesor--noare also given, whichever--confirm-levelcame last is the one that counts. Equivalent to setting$OPAMCONFIRMLEVEL.--criteria=CRITERIAβ this is where you tell opam your ~preferences~ for dependency solving, just for this run π . It overrides$OPAMCRITERIA,$OPAMFIXUPCRITERIAand$OPAMUPGRADECRITERIA. For the deets on the supported language and which external solvers exist, peep http://opam.ocaml.org/doc/External_solvers.html. And there's a whole general guide to solver preferences at http://www.dicosmo.org/Articles/usercriteria.pdf if you wanna go full nerd mode π§--cudf=FILENAMEβ debug gorl option π: saves the CUDF requests sent to the solver intoFILENAME-<n>.cudf, where<n>is the n-th call to the solver during the opam run.--debugβ prints debug messages to stderr. Equivalent to setting$OPAMDEBUGto"true".--debug-level=LEVELβ same vibe as--debug, except you get to pick the debug level (--debugjust sets it to1). Equivalent to setting$OPAMDEBUGto a positive integer.--git-versionβ prints the git version of opam if it's set (i.e. you're running a development version), then exits βοΈ.--help[=FMT](default=auto) β shows this help in formatFMT.FMTmust be one ofauto,pager,grofforplain. Withauto, the format becomespagerorplainwhenever theTERMenv var isdumbor undefined.--ignore-pin-dependsβ ignores the extra pins that packages require when they get pinned, whether you did it manually viaopam pinor throughopam install DIRπ. Equivalent to settingIGNOREPINDEPENDS=true.--json=FILENAMEβ saves the results of your opam run into a computer-readable file π€. And listen: if the filename contains the character%, that gets replaced by an index that won't overwrite an existing file. Basically the same as setting the$OPAMJSONvariable.--noβ answers no to every single opam yes/no question, no prompting, no hesitation π ββοΈ. See also--confirm-level. Equivalent to setting$OPAMNOto"true".--no-aspcudβ bestie... this one was removed in 2.1 π. It's giving ghost of flags past.--no-auto-upgradeβ so when opam configures or updates a repository written for an earlier opam version (1.2), it internally converts it to the current format. This flag disables that behaviour, periodt. Note that repositories should define their format version in a'repo'file at their root, or else they get assumed to be in the older format π. And honestly? It's preferable to upgrade the repositories manually usingopam admin upgrade [--mirror URL]whenever you can.--no-self-upgradeβ by default opam will replace itself with a newer binary found atOPAMROOT/opamif one's there π. This disables that behaviour (no glow-up for you today).-q,--quietβ disables--verbose. shhh π€«--root=ROOTβ usesROOTas the current root path. Equivalent to setting$OPAMROOTtoROOT.--safe,--readonlyβ makes sure nothing gets automatically updated or rewritten, which is super useful for calling from completion scripts and stuff like that π‘οΈ. It will fail whenever such an operation is needed ; it also avoids waiting for locks, skips interactive questions and overrides the$OPAMDEBUGvariable. Equivalent to setting the environment variable$OPAMSAFE.--solver=CMDβ specify the CUDF solver used to resolve package installation problems π§©. This is either a predefined solver (this version of opam supportsbuiltin-mccs+lp(),builtin-mccs+glpk,builtin-dummy-z3-solver,builtin-0install,aspcud,mccs,aspcud-old,packup), or a custom command that should contain the variables%{input}%,%{output}%,%{criteria}%, and optionally%{timeout}%. Equivalent to setting$OPAMEXTERNALSOLVER.--strictβ fails whenever an error shows up in a package definition or a configuration file π¨. The default behaviour is to just continue silently if possible. (we love a no-drama default β¨)--switch=SWITCHβ usesSWITCHas the current compiler switch. Equivalent to setting$OPAMSWITCHtoSWITCH.--use-internal-solverβ disables any external solver and uses the built-in one instead (this requires that opam has been compiled with a built-in solver!). Equivalent to setting$OPAMNOASPCUDor$OPAMUSEINTERNALSOLVER.-v,--verboseβ be more verbose π£οΈ. One-vshows all package commands, and repeating it also displays commands called internally (liketar,curl,patchetc.). Repeating itntimes is equivalent to setting$OPAMVERBOSEto"n".--versionβ shows version information π.-w,--working-dirβ whenever opam updates packages that are bound to a local, version-controlled directory, this updates to the current working state of their source instead of the last committed state, or the ref they're pointing to π₯. But watch out: since the source directory gets copied as it is, if it isn't clean it may result in an opam build failure π. This only affects packages explicitly listed on the command-line. It can also be set with$OPAMWORKINGDIR.-y,--yesβ answers yes to all opam yes/no questions without prompting π. See also--confirm-level. Equivalent to setting$OPAMYESto"true".
β¨ ENVIRONMENT β¨
okay so this section is a lot, bestie, but it's literally just the master list of every environment variable opam looks at π and there are... many. So many. Grab a snack π
First, the rule for the boolean ones: set them to "0", "no", "false" or the empty string to disable them, and "1", "yes" or "true" to enable them. That's it, that's the whole vibe check β
OPAMALLPARENSβ surround all filters with parenthesis.OPAMASSUMEDEPEXTSβ see option--assume-depexts.OPAMAUTOANSWERβ internal use only, bestie, don't touch πOPAMAUTOREMOVEβ see remove option--auto-remove.OPAMBESTEFFORTβ see option--best-effort.OPAMBESTEFFORTPREFIXCRITERIAβ sets the string that must be prepended to the criteria when the--best-effortoption is set, and is expected to maximise theopam-queryproperty in the solution.OPAMBUILDDOCβ Removed in 2.1.OPAMBUILDTESTβ Removed in 2.1.OPAMCLIβ see option--cli.OPAMCOLORβ when set toalwaysornever, sets a default value for the--coloroption.OPAMCONFIRMLEVELβ see option--confirm-level. Heads up:OPAMCONFIRMLEVELhas priority overOPAMYESandOPAMNOπOPAMCRITERIAβ specifies user preferences for dependency solving. The default value depends on the solver version, useconfig reportto know the current setting. See also option--criteria.OPAMCUDFFILEβ save the cudf graph tofile-actions-explicit.dot.OPAMCUDFTRIMβ controls the filtering of unrelated packages during CUDF preprocessing.OPAMCURLβ can be used to select a givencurlprogram. SeeOPAMFETCHfor more options.OPAMDEBUGβ see options--debugand--debug-level.OPAMDEBUGSECTIONSβ if set, limits debug messages to the space-separated list of sections. Sections can optionally have a specific debug level (for example,CLIENT:2orCLIENT CUDF:2), but otherwise use--debug-level.OPAMDIGDEPTHβ defines how aggressive the lookup for conflicts during CUDF preprocessing is.OPAMDOWNLOADJOBSβ sets the maximum number of simultaneous downloads.OPAMDROPWORKINGDIRβ overrides packages previously updated with--working-diron update. Without this variable set, opam would keep them unchanged unless explicitly named on the command-line.OPAMDRYRUNβ see option--dry-run.OPAMEDITORβ sets the editor to use for opam file editing, overrides$EDITORand$VISUAL.OPAMERRLOGLENβ sets the number of log lines printed when a sub-process fails.0to print all.OPAMEXTERNALSOLVERβ see option--solver.OPAMFAKEβ see option--fake.OPAMFETCHβ specifies how to download files: eitherwget,curlor a custom command where variables%{url}%,%{out}%,%{retry}%,%{compress}%and%{checksum}%will be replaced. Overrides thedownload-commandvalue from the main config file.OPAMFIXUPCRITERIAβ same asOPAMUPGRADECRITERIA, but specific to fixup and reinstall.OPAMIGNOREAVAILABLEβ see install option--ignore-available-on.OPAMIGNORECONSTRAINTSβ see install option--ignore-constraints-on.OPAMIGNOREPINDEPENDSβ see option--ignore-pin-depends.OPAMINPLACEBUILDβ see option--inplace-build.OPAMJOBSβ sets the maximum number of parallel workers to run.OPAMJSONβ log json output to the given file (use character%to index the files).OPAMKEEPBUILDDIRβ see install option--keep-build-dir.OPAMKEEPLOGSβ tells opam to not remove some temporary command logs and some backups. This skips some finalisers and may also help to get more reliable backtraces.OPAMLOCKEDβ combination of--lockedand--lock-suffixoptions.OPAMLOGSβ logdir sets log directory, default is a temporary directory in/tmp.OPAMMAKECMDβ set the system make command to use.OPAMMERGEOUTβ merge process outputs, stderr on stdout.OPAMNOβ answer no to any question asked, see options--noand--confirm-level.OPAMNOis ignored if eitherOPAMCONFIRMLEVELorOPAMYESis set.OPAMNOAGGREGATEβ withopam admin check, don't aggregate packages.OPAMNOASPCUDβ Deprecated. πOPAMNOAUTOUPGRADEβ disables automatic internal upgrade of repositories in an earlier format to the current one, on 'update' or 'init'.OPAMNOCHECKSUMSβ enables option--no-checksumswhen available.OPAMNODEPEXTSβ disables system dependencies handling, see option--no-depexts.OPAMNOENVNOTICEβ Internal.OPAMNOSELFUPGRADEβ see option--no-self-upgrade.OPAMPINKINDAUTOβ sets whether version control systems should be detected when pinning to a local path. Enabled by default since 1.3.0.OPAMPRECISETRACKINGβ fine grain tracking of directories.OPAMPREPROβ set this to false to disable CUDF preprocessing. Less efficient, but might help debugging solver issue.OPAMREPOSITORYTARRINGβ internally store all non-vcs repositories as tar.gz files (by default, http repositories are stored as archive). This can be much faster on filesystems that don't cope well with scanning large trees. All operation are done in-memory, no I/O for scanning the repository.OPAMREQUIRECHECKSUMSβ Enables option--require-checksumswhen available (e.g. foropam install).OPAMRETRIESβ sets the number of tries before failing downloads.OPAMREUSEBUILDDIRβ see option--reuse-build-dir.OPAMROOTβ see option--root. This is automatically set byopam env --root=DIR --set-root.OPAMROOTISOKβ don't complain when running as root.OPAMSAFEβ see option--safe.OPAMSHOWβ see option--show.OPAMSKIPUPDATEβ see option--skip-updates.OPAMSKIPVERSIONCHECKSβ bypasses some version checks. Unsafe, for compatibility testing only π¨OPAMSOLVERALLOWSUBOPTIMALβ (defaulttrue) allows some solvers to still return a solution when they reach timeout; while the solution remains assured to be consistent, there is no guarantee in this case that it fits the expected optimisation criteria. Iftrue, opam will continue with a warning, iffalsea timeout is an error. Currently only the builtin-z3 backend handles this degraded case.OPAMSOLVERTIMEOUTβ change the time allowance of the solver. Default is60.0, set to0for unlimited. Note that all solvers may not support this option.OPAMSOLVERTOLERANCEβ changes the tolerance towards the solver choosing an unoptimized solution (i.e. might pull outdated packages). Typical values range from0.0(best solution known to the solver) to1.0(unoptimized solution). Default is0.0. This option is useful in case the solver can't find a solution in a reasonable time (see$OPAMSOLVERTIMEOUT). Note that all solvers may not support this option.OPAMSTATSβ Removed in 2.4.OPAMSTATUSLINEβ display a dynamic status line showing what's currently going on on the terminal. (one ofalways,neverorauto)OPAMSTRICTβ fail on inconsistencies (file reading, switch import, etc.).OPAMSWITCHβ see option--switch. Automatically set byopam env --switch=SWITCH --set-switch.OPAMUNLOCKBASEβ see install option--unlock-base.OPAMUPGRADECRITERIAβ specifies user preferences for dependency solving when performing an upgrade. OverridesOPAMCRITERIAin upgrades if both are set. See also option--criteria.OPAMUSEINTERNALSOLVERβ see option--use-internal-solver.OPAMUSEOPENSSLβ Removed in 2.2.OPAMUTF8β use UTF8 characters in output (one ofalways,neverorauto). By defaultauto, which is determined from the locale).OPAMUTF8MSGSβ use extended UTF8 characters (camels) in opam messages. ImpliesOPAMUTF8. This is set by default on macOS only. πͺOPAMVALIDATIONHOOKβ if set, uses the%{hook}%command to validate an opam repository update.OPAMVERBOSEβ see option--verbose.OPAMVERBOSEONβ see option--verbose-on.OPAMVERSIONLAGPOWERβ do not use.OPAMWITHDEVSETUPβ see install option--with-dev-setup.OPAMWITHDOCβ see install option--with-doc.OPAMWITHTESTβ see install option--with-test.OPAMWORKINGDIRβ see option--working-dir.OPAMYESβ see options--yesand--confirm-level.OPAMYEShas priority overOPAMNOand is ignored ifOPAMCONFIRMLEVELis set.OPAMVAR_varβ overrides the contents of the variable var when substituting%{var}%strings inopamfiles.OPAMVAR_package_varβ overrides the contents of the variable package:var when substituting%{package:var}%strings inopamfiles.
π CLI VERSION π
okay bestie, this part is short but it matters, and it's giving "future-proof yourself" energy β¨
All scripts and programmatic invocations of opam should use --cli in order to ensure that they work seamlessly with future versions of the opam client. And genuinely? Blog posts and other documentation benefit too, because it prevents information from becoming stale. Obsessed with a flag that keeps your docs from rotting π
Although opam only supports roots (~/.opam/) for the current version, it does provide backwards compatibility for its command-line interface.
Since CLI version support was only added in opam 2.1, use OPAMCLI to select 2.0 support (as opam 2.0 will just ignore it), and --cli=2.1 for 2.1 (or later) versions, since an environment variable controlling the parsing of syntax is brittle. To this end, opam displays a warning if OPAMCLI specifies a valid version other than 2.0, and also if --cli=2.0 is specified. So yes, it will absolutely call you out π’
The command-line version is selected by using the --cli option or the OPAMCLI environment variable. --cli may be specified more than once, where the last instance takes precedence. OPAMCLI is only inspected if --cli is not given. Last one wins, no cap π
π EXIT STATUS π
okay bestie, so here's the tea on exit codes β this is how you find out what went wrong when things go wrong π«Ά
BUT first, a lil exception because of course there is one:
theexeccommand is built different π it returns127if the command was not found or couldn't be executed, and otherwise it just hands you the command's own exit value. iconic behaviour tbh.
now the actual list, no cap:
0β Success! β¨ ortruefor boolean queries. slay.1β False. you get this when a boolean return value is expected, like when you run with--check, or for queries likeopam lint.2β Bad command-line arguments π or command-line arguments pointing to an invalid context (e.g. a file that doesn't follow the expected format).5β Not found. you asked for something (package, version, repository, etc.) and it just... wasn't there π10β Aborted. the operation needed confirmation and you didn't give it π15β Could not acquire the locks required for the operation π20β There is no solution to the user request. this can happen when you ask to install two incompatible packages, for example. pick a lane bestie π30β Error in package definition, or other metadata files. using--strictraises this error more often.31β Package script error. some package operations were unsuccessful. this may be an error in the packages or an incompatibility with your system, and it can be a partial error.40β Sync error. could not fetch some remotes from the network π this can be a partial error.50β Configuration error. opam or system configuration doesn't allow the operation, and it needs fixing.60β Solver failure. the solver failed to return a sound answer. it can be due to a broken external solver, or an error in solver configuration.99β Internal error. something went wrong, likely due to a bug in opam itself π130β User interrupt.SIGINTwas received, generally because the user pressed Ctrl+C. you did this. it was you π0β on success. yes again. periodt.123β on indiscriminate errors reported on standard error.124β on command line parsing errors.125β on unexpected internal errors (bugs).
π FURTHER DOCUMENTATION π
like, there's a whole website bestie, go read it:
- See
https://opam.ocaml.org/docπΈ
π AUTHORS π
the literal icons who made this happen, put some respect on their names π«Ά
- David Allsopp
<david@tarides.com> - Vincent Bernardoff
<vb@luminar.eu.org> - Raja Boujbel
<raja.boujbel@ocamlpro.com> - Kate Deplaix
<kit-ty-kate@exn.st> - Roberto Di Cosmo
<roberto@dicosmo.org> - Thomas Gazagnaire
<thomas@gazagnaire.org> - Louis Gesbert
<louis.gesbert@ocamlpro.com> - Fabrice Le Fessant
<Fabrice.Le_fessant@inria.fr> - Anil Madhavapeddy
<anil@recoil.org> - Guillem Rieu
<guillem.rieu@ocamlpro.com> - Ralf Treinen
<ralf.treinen@pps.jussieu.fr> - Frederic Tuong
<tuong@users.gforge.inria.fr>
π SEE ALSO π
like, go read the main one, it's giving main character energy π
π BUGS π
found something cursed? spill it here:
- Check bug reports at
https://github.com/ocaml/opam/issues
ngl if you found a bug, reporting it is highkey the most helpful thing you can do π«Ά don't be shy.
and that's the whole page bestie, you ate that π
this was Opam 2.6.1's OPAM-UNINSTALL(1) manual page β now go forth and uninstall things responsibly, mwah πβ¨π¦
π¦ where this page comes from
- arch rolling: opam 2.6.1-1 Β· LGPL-2.1-only
- fedora 44: opam 2.6.1-1.fc44 Β· LGPL-2.1-only WITH OCaml-LGPL-linking-exception
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms