OPAM-LINT(1)

🌸 OPAM-LINT(1) β€” the Opam Manual, bestie edition 🌸

okay so you opened the manual page for opam-lint, part of the Opam Manual, and honestly? it's giving quality control queen. Let's go. πŸ’…


✨ NAME ✨

opam-lint β€” checks and validates package description (opam) files. yes it's literally the vibes-check for your .opam files and it WILL tell you what's wrong πŸ”


✨ SYNOPSIS ✨

opam lint [OPTION]… [FILES]…

✨ DESCRIPTION ✨

so here's the deal: you hand it an opam file, and it runs a whole bunch of quality checks on it. then it tells you what it thinks β€” recommendations, warnings, errors β€” and it prints all of that to stderr, not stdout, so don't be out here wondering why your pipe is empty, bestie 😭🫢


✨ ARGUMENTS ✨

  • FILES β€” the names of the opam files you wanna check, or a directory that contains them. if you don't specify anything at all, it just uses the current directory. lowkey convenient fr fr.

✨ OPTIONS ✨

  • --check-upstream β€” checks upstream, plus archive availability and checksum(s). like a lil wellness check on the source you're pointing at 🌐
  • --normalise β€” spits out a normalised version of the opam file to stdout. glow-up mode ✨
  • --package=PKG β€” lint the current definition of the package you name, instead of pointing at an opam file directly. no file path needed, just say the name πŸ’…
  • --recursive β€” allows recursive lookups of *.opam files. and yeah, see --subpath too, they're besties 🀝
  • -s, --short β€” only prints the warning/error numbers, space-separated, if there are any. minimalism, we love her πŸŽ€
  • --subpath=PATH β€” the *.opam files get retrieved from the sub directory you give instead of from the top directory. sources are then taken from that targeted sub directory, and internally only that subdirectory is copied/fetched. you can combine it with --recursive to get a recursive lookup on that subpath. nesting but make it intentional πŸͺ†
  • -W WARNS, --warnings=WARNS β€” picks which warnings to show or hide. WARNS should be a concatenation of +N, -N, @N, +N..M, -N..M, @N..M, which respectively enable, disable or enable-as-error warning or error number N, or every warning with numbers between N and M inclusive. by default all warnings are enabled β€” UNLESS WARNS starts with + or @, in which case all of them get disabled except the ones you selected. so + and @ are the "actually, only these" girlies πŸ’…

✨ LINT CODES ✨

here's the whole roster of codes it can throw at you. no skips, no cuts, we're listing every single one πŸ‘‘

  • W20 β€” Field opam-version refers to the patch version of opam, it should be of the form MAJOR.MINOR
  • E21 β€” Field opam-version doesn't match the current version, validation may not be accurate
  • E22 β€” Some fields are present but empty; remove or fill them
  • E23 β€” Missing field maintainer
  • E24 β€” Field maintainer has the old default value
  • W25 β€” Missing field authors
  • W26 β€” No field install, but a field remove: install instructions probably part of build. Use the install field or a .install file
  • E28 β€” Unknown package flags found
  • E29 β€” Package dependencies or conflicts mention package variables
  • E31 β€” Fields depends and depopts refer to the same package names
  • E32 β€” Field ocaml-version: and variable ocaml-version are deprecated, use a dependency towards the ocaml package instead for availability, and the ocaml:version package variable for scripts
  • E33 β€” Field os is deprecated, use available and the os variable instead
  • E34 β€” Field available: contains references to package-local variables. It should only be determined from global configuration variables
  • W35 β€” Missing field homepage
  • W36 β€” Missing field bug-reports
  • W37 β€” Missing field dev-repo
  • E39 β€” Command make called directly, use the built-in variable instead
  • W41 β€” Some packages are mentioned in package scripts or features, but there is no dependency or depopt toward them
  • E42 β€” The dev-repo: field doesn't use version control. You should use URLs of the form "git://", "git+https://", "hg+https://"…
  • E43 β€” Conjunction used in conflicts: field. Only | is allowed
  • W44 β€” The plugin package flag is set but the package name doesn't begin with opam-
  • E45 β€” Unclosed variable interpolations in strings
  • E46 β€” Package is flagged "conf" but has source, install or remove instructions
  • W47 β€” Synopsis should start with a capital and not end with a dot
  • W48 β€” The fields build-test: and build-doc: are deprecated, and should be replaced by uses of the with-test and with-doc filter variables in the build: and install: fields, and by the newer run-test: field
  • W49 β€” The following URLs don't use version control but look like version control URLs
  • W50 β€” The post flag doesn't make sense with build or optional dependencies
  • E51 β€” The behaviour for negated dependency flags build or post is unspecified
  • E52 β€” Package is needlessly flagged "light-uninstall", since it has no remove instructions
  • E53 β€” Mismatching extra-files: field
  • W54 β€” External dependencies should not contain spaces nor empty string
  • E55 β€” Non-normalised OS or arch string being tested
  • E57 β€” Synopsis must not be empty
  • W58 β€” Found variable, predefined one
  • W59 β€” url doesn't contain a checksum
  • E60 β€” Upstream check failed
  • W61 β€” with-test variable in run-test is out of scope, it will be ignored
  • W62 β€” License doesn't adhere to the SPDX standard, see https://spdx.org/licenses/
  • E63 β€” subpath field needs a restriction in available field: opam-version > 2.1
  • E65 β€” URLs must be absolute
  • W66 β€” String that can't be resolved to bool in filtered package formula
  • E67 β€” Checksum specified with a non archive url
  • W68 β€” Missing field license
  • W69 β€” Package name in variable in string interpolation contains several '+', use
  • E70 β€” Field extra-files contains duplicated files
  • E71 β€” Field url.checksum contains duplicated checksums
  • E72 β€” Field extra-sources contains duplicated checksums
  • E73 β€” Field extra-files contains path with '..'
  • W74 β€” Field 'pin-depends' contains packages that are neither in 'depends' nor in 'depopts'

ok that was a LOT of codes but you survived, icon behaviour fr fr 🫢 don't go anywhere β€” there's more of this page coming 🌈

✨ COMMON OPTIONS ✨

okay bestie these are the glow-up options that literally every opam command gets πŸ’– like they're the shared accessory every outfit comes with. same for all commands, no cap.


  • --best-effort β€” don't just give up when some packages refuse to install 😀 try to install as many as humanly possible instead. heads up tho: not all external solvers support this (recent versions of aspcud or mccs should, slay). it's giving the exact same energy as setting the $OPAMBESTEFFORT environment variable.
  • --cli=MAJOR.MINOR (absent=2.6) β€” tells opam to use the command-line interface syntax and semantics of MAJOR.MINOR. made for any persistent use of opam (scripts, blog posts, etc. β€” the stuff that lives forever online πŸ™ˆ), so any version of opam in the same MAJOR series will behave like that specified MINOR release. important tea: this flag was NOT available in opam 2.0, so if you wanna select the 2.0 CLI you gotta set the OPAMCLI environment variable to 2.0 instead of using this parameter. iykyk.
  • --color=WHEN β€” colorize that output bestie 🌈 WHEN must be one of always, never or auto.
  • --confirm-level=LEVEL β€” the confirmation level, and LEVEL must be one of ask, no, yes or unsafe-yes. can be specified more than once! if --yes or --no are also given, the value of the last --confirm-level is the one that counts. equivalent to setting $OPAMCONFIRMLEVEL.
  • --criteria=CRITERIA β€” set your personal preferences for dependency solving, just for this run πŸ‘‘ overrides $OPAMCRITERIA, $OPAMFIXUPCRITERIA and $OPAMUPGRADECRITERIA. for the details on the supported language and the external solvers available, see http://opam.ocaml.org/doc/External_solvers.html. and there's a whole general guide to using solver preferences at http://www.dicosmo.org/Articles/usercriteria.pdf πŸ“š.
  • --cudf=FILENAME β€” debug option πŸ› saves the CUDF requests sent to the solver into FILENAME-<n>.cudf, where <n> is the n-th call to the solver during the opam run.
  • --debug β€” print debug messages to stderr. equivalent to setting $OPAMDEBUG to "true".
  • --debug-level=LEVEL β€” like --debug but you get to pick the debug level (--debug sets it to 1). equivalent to setting $OPAMDEBUG to a positive integer.
  • --git-version β€” print the git version of opam, if set (i.e. you're running a development version), and exit. main character dev energy πŸ’…
  • --help[=FMT] (default=auto) β€” show this help in format FMT. the value FMT must be one of auto, pager, groff or plain. with auto, the format is pager or plain whenever the TERM env var is dumb or undefined.
  • --ignore-pin-depends β€” ignore the extra pins required by packages that get pinned, whether manually through opam pin or through opam install DIR. equivalent to setting IGNOREPINDEPENDS=true.
  • --json=FILENAME β€” save the results of the opam run into a computer-readable file πŸ€– if the filename contains the character %, it gets replaced by an index that doesn't overwrite an existing file. similar to setting the $OPAMJSON variable.
  • --no β€” answer no to every single opam yes/no question, no prompting 🚫 see also --confirm-level. equivalent to setting $OPAMNO to "true".
  • --no-aspcud β€” removed in 2.1. she's gone bestie, rest in peace πŸ’€
  • --no-auto-upgrade β€” when configuring or updating a repository that was written for an earlier opam version (1.2), opam internally converts it to the current format. this disables that behaviour. note: repositories should define their format version in a 'repo' file at their root, or they'll just be assumed to be in the older format. it's, in any case, preferable to upgrade the repositories manually using opam admin upgrade [--mirror URL] when you can 🫢
  • --no-self-upgrade β€” opam will replace itself with a newer binary found at OPAMROOT/opam if present. this disables that behaviour. rude of opam honestly 😭
  • -q, --quiet β€” disables --verbose. shhh 🀫
  • --root=ROOT β€” use ROOT as the current root path. equivalent to setting $OPAMROOT to ROOT.
  • --safe, --readonly β€” makes sure nothing gets automatically updated or rewritten, periodt. super useful for calling from completion scripts, for example. will fail whenever such an operation is needed ; it also avoids waiting for locks, skips interactive questions and overrides the $OPAMDEBUG variable. equivalent to setting the environment variable $OPAMSAFE.
  • --solver=CMD β€” specify the CUDF solver to use for resolving package installation problems 🧩 this is either a predefined solver (this version of opam supports builtin-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 β€” fail whenever an error is found in a package definition or a configuration file. the default is to just continue silently if possible πŸ™ˆ
  • --switch=SWITCH β€” use SWITCH as the current compiler switch. equivalent to setting $OPAMSWITCH to SWITCH.
  • --use-internal-solver β€” disable any external solver and use the built-in one instead (this requires that opam has been compiled with a built-in solver, no cap). equivalent to setting $OPAMNOASPCUD or $OPAMUSEINTERNALSOLVER.
  • -v, --verbose β€” be more verbose πŸ’¬ one -v shows all package commands, repeat it to also display commands called internally (e.g. tar, curl, patch etc.). repeating it n times is equivalent to setting $OPAMVERBOSE to "n".
  • --version β€” show version information.
  • -w, --working-dir β€” whenever updating packages that are bound to a local, version-controlled directory, update to the current working state of their source instead of the last committed state, or the ref they're pointing to. ⚠️ note: as the source directory is copied as it is, if it isn't clean it may result on a opam build failure. this only affects packages explicitly listed on the command-line. it can also be set with $OPAMWORKINGDIR.
  • -y, --yes β€” answer yes to all opam yes/no questions without prompting πŸ’― see also --confirm-level. equivalent to setting $OPAMYES to "true".

🌈 ENVIRONMENT 🌈

okay so bestie, opam is very into environment variables, and this is the whole list πŸ’–. Here's the deal on the boolean ones: set them to "0", "no", "false" or just the empty string to turn them off, and "1", "yes" or "true" to turn them on. That's the whole vibe check ✨.

  • OPAMALLPARENS β€” wraps all the filters in parenthesis. cute and contained fr πŸ’…
  • OPAMASSUMEDEPEXTS β€” see the `--assume-depexts' option.
  • OPAMAUTOANSWER β€” internal use only πŸ™ˆ like don't touch her, she's working.
  • OPAMAUTOREMOVE β€” see the remove option `--auto-remove'.
  • OPAMBESTEFFORT β€” see the `--best-effort' option.
  • OPAMBESTEFFORTPREFIXCRITERIA β€” sets the string that has to be prepended to the criteria when --best-effort' is set, and it's expected to maximise the opam-query' property in the solution. lowkey powerful πŸ‘‘
  • OPAMBUILDDOC β€” Removed in 2.1. she's gone, respect the memory πŸͺ¦
  • OPAMBUILDTEST β€” Removed in 2.1. also gone, also missed.
  • OPAMCLI β€” see the `--cli' option.
  • OPAMCOLOR β€” when it's set to always or never, it gives the `--color' option a default value. πŸŽ€
  • OPAMCONFIRMLEVEL β€” see the --confirm-level option. And plot twist: OPAMCONFIRMLEVEL has priority over OPAMYES and OPAMNO πŸ‘‘
  • OPAMCRITERIA β€” this one specifies your user preferences for dependency solving. The default value depends on the solver version, so run config report if you wanna know the current setting. Also see the --criteria option.
  • OPAMCUDFFILE β€” saves the cudf graph to file-actions-explicit.dot. she's documenting the drama πŸ’…
  • OPAMCUDFTRIM β€” controls the filtering of unrelated packages during CUDF preprocessing.
  • OPAMCURL β€” use this to pick a given curl program. See OPAMFETCH for more options.
  • OPAMDEBUG β€” see the --debug and --debug-level options.
  • OPAMDEBUGSECTIONS β€” if set, it limits debug messages to that space-separated list of sections. Sections can optionally carry a specific debug level (like CLIENT:2 or CLIENT CUDF:2) 🧐, but otherwise just use --debug-level.
  • OPAMDIGDEPTH β€” defines how aggressive the lookup for conflicts is during CUDF preprocessing. she digs deep fr ⛏️
  • OPAMDOWNLOADJOBS β€” sets the maximum number of simultaneous downloads. main character energy but for bandwidth 🌊
  • OPAMDROPWORKINGDIR β€” overrides packages that were previously updated with --working-dir on update. Without this variable set, opam would keep them unchanged unless you explicitly named them on the command-line.
  • OPAMDRYRUN β€” see the `--dry-run' option.
  • OPAMEDITOR β€” sets the editor used for opam file editing, and it overrides $EDITOR and $VISUAL. she doesn't ask, she tells πŸ’…
  • OPAMERRLOGLEN β€” sets the number of log lines printed when a sub-process fails. Set it to 0 to print all of them 😭
  • OPAMEXTERNALSOLVER β€” see the `--solver' option.
  • OPAMFAKE β€” see the `--fake' option.
  • OPAMFETCH β€” specifies how to download files: either wget, curl, or a custom command where the variables %{url}%, %{out}%, %{retry}%, %{compress}% and %{checksum}% will be replaced. Overrides the 'download-command' value from the main config file ⭐
  • OPAMFIXUPCRITERIA β€” same as OPAMUPGRADECRITERIA, but specific to fixup and reinstall.
  • OPAMIGNOREAVAILABLE β€” see the install option `--ignore-available-on'.
  • OPAMIGNORECONSTRAINTS β€” see the install option `--ignore-constraints-on'.
  • OPAMIGNOREPINDEPENDS β€” see the `--ignore-pin-depends' option.
  • OPAMINPLACEBUILD β€” see the `--inplace-build' option.
  • OPAMJOBS β€” sets the maximum number of parallel workers to run. go off, parallelism πŸš€
  • OPAMJSON β€” logs json output to the given file (use the character % to index the files).
  • OPAMKEEPBUILDDIR β€” see the install option `--keep-build-dir'.
  • OPAMKEEPLOGS β€” tells opam to not remove some temporary command logs and some backups. Heads up: this skips some finalisers and may also help you get more reliable backtraces.
  • OPAMLOCKED β€” a combination of the --locked' and --lock-suffix' options.
  • OPAMLOGS β€” sets the log directory (logdir), default is a temporary directory in /tmp.
  • OPAMMAKECMD β€” sets the system make command to use.
  • OPAMMERGEOUT β€” merges process outputs, putting stderr on stdout.
  • OPAMNO β€” answers no to any question asked; see the --no and --confirm-level options. OPAMNO is ignored if either OPAMCONFIRMLEVEL or OPAMYES is set. she gets overruled 😀
  • OPAMNOAGGREGATE β€” with opam admin check, don't aggregate packages.
  • OPAMNOASPCUD β€” Deprecated. ⚠️ do not use.
  • OPAMNOAUTOUPGRADE β€” disables the automatic internal upgrade of repositories in an earlier format to the current one, on 'update' or 'init'.
  • OPAMNOCHECKSUMS β€” enables the --no-checksums option when it's available.
  • OPAMNODEPEXTS β€” disables system dependencies handling, see the `--no-depexts' option.
  • OPAMNOENVNOTICE β€” Internal. πŸ™ˆ
  • OPAMNOSELFUPGRADE β€” see the `--no-self-upgrade' option.
  • 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. very detail-oriented of her πŸŽ€
  • OPAMPREPRO β€” set this to false to disable CUDF preprocessing. Less efficient, but it might help with debugging a 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 operations are done in-memory, with no I/O for scanning the repository πŸ”₯
  • OPAMREQUIRECHECKSUMS β€” enables the --require-checksums' option when available (e.g. for opam install`).
  • OPAMRETRIES β€” sets the number of tries before failing downloads. she's persistent, okay? πŸ’ͺ
  • OPAMREUSEBUILDDIR β€” see the `--reuse-build-dir' option.
  • OPAMROOT β€” see the --root' option. This is automatically set by opam env --root=DIR --set-root`.
  • OPAMROOTISOK β€” don't complain when running as root. she's chill about it 🌸
  • OPAMSAFE β€” see the `--safe' option.
  • OPAMSHOW β€” see the `--show' option.
  • OPAMSKIPUPDATE β€” see the `--skip-updates' option.
  • OPAMSKIPVERSIONCHECKS β€” bypasses some version checks. ⚠️ Unsafe, for compatibility testing only.
  • OPAMSOLVERALLOWSUBOPTIMAL β€” (default true) allows some solvers to still return a solution when they reach timeout; while the solution remains assured to be consistent, there's no guarantee in this case that it fits the expected optimisation criteria. If true, opam will continue with a warning; if false, a timeout is an error. Currently only the builtin-z3 backend handles this degraded case.
  • OPAMSOLVERTIMEOUT β€” change the time allowance of the solver. Default is 60.0, set it to 0 for unlimited. Note that not all solvers may support this option 😭
  • OPAMSOLVERTOLERANCE β€” changes the tolerance towards the solver choosing an unoptimized solution (i.e. it might pull outdated packages). Typical values range from 0.0 (best solution known to the solver) to 1.0 (unoptimized solution). Default is 0.0. This one is useful in case the solver can't find a solution in a reasonable time (see $OPAMSOLVERTIMEOUT). Note that not all solvers may support this option either 🫠
  • OPAMSTATS β€” Removed in 2.4. gone bestie πŸ’€
  • OPAMSTATUSLINE β€” display a dynamic status line showing what's currently going on on the terminal. (one of always, never or auto)
  • OPAMSTRICT β€” fails on inconsistencies (file reading, switch import, etc.). no chill, only correctness πŸ’…
  • OPAMSWITCH β€” see the --switch' option. Automatically set by opam env --switch=SWITCH --set-switch`.
  • OPAMUNLOCKBASE β€” see the install option `--unlock-base'.
  • OPAMUPGRADECRITERIA β€” specifies your user preferences for dependency solving when performing an upgrade. It overrides OPAMCRITERIA in upgrades if both are set. Also see the --criteria option.
  • OPAMUSEINTERNALSOLVER β€” see the `--use-internal-solver' option.
  • OPAMUSEOPENSSL β€” Removed in 2.2. rest in peace πŸͺ¦
  • OPAMUTF8 β€” use UTF8 characters in output (one of always, never or auto). By default it's auto, which is determined from the locale πŸ¦‹
  • OPAMUTF8MSGS β€” use extended UTF8 characters (camels πŸͺ) in opam messages. Implies OPAMUTF8. This is set by default on macOS only.
  • OPAMVALIDATIONHOOK β€” if set, uses the %{hook}% command to validate an opam repository update.
  • OPAMVERBOSE β€” see the `--verbose' option.
  • OPAMVERBOSEON β€” see the --verbose-on option.
  • OPAMVERSIONLAGPOWER β€” do not use. ⚠️ that's it, that's the whole instruction.
  • OPAMWITHDEVSETUP β€” see the install option `--with-dev-setup'.
  • OPAMWITHDOC β€” see the install option `--with-doc'.
  • OPAMWITHTEST β€” see the install option --with-test.
  • OPAMWORKINGDIR β€” see the `--working-dir' option.
  • OPAMYES β€” see the --yes' and --confirm-level' options. OPAMYES has priority over OPAMNO and is ignored if OPAMCONFIRMLEVEL is set πŸ‘‘
  • OPAMVAR_var β€” overrides the contents of the variable var when substituting the %{var}% strings in opam files. (yes, that _ is doing a lot of work here, she's iconic like that ✨)
  • OPAMVAR_package_var β€” overrides the contents of the variable package:var when substituting the %{package:var}% strings in opam files.

⭐ CLI VERSION ⭐

okay so here's the thing: all scripts and programmatic invocations of opam should use --cli, so they work seamlessly with future versions of the opam client. no cap, this is the move 🫢. And bonus: blog posts or other documentation benefit too, because it stops the info from going stale. petty protection πŸŽ€

Although opam only supports roots (~/.opam/) for the current version, it does provide backwards compatibility for its command-line interface. bestie is generous like that πŸ’…

Since CLI version support was only added in opam 2.1, use OPAMCLI to select 2.0 support (since opam 2.0 will just ignore it), and use --cli=2.1 for 2.1 (or later) versions β€” because 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.

The command-line version is selected by using the --cli option or the OPAMCLI environment variable. --cli may be specified more than once, and in that case the last instance takes precedence πŸ‘‘. OPAMCLI is only inspected if --cli is not given.

πŸ’€ EXIT STATUS πŸ’€

Okay bestie, real talk: when opam dips out, it leaves you a little number so you know why. ✨

Wait, one exception first 🚨 exec does its own thing. It returns 127 if the command was not found or couldn't be executed, and the command's own exit value otherwise.

Here's the whole mood ring of status codes:

  • 0 β€” Success, or true for boolean queries. πŸŽ‰
  • 1 β€” False. Returned when a boolean return value is expected, e.g. when running with --check, or for queries like opam lint.
  • 2 β€” Bad command-line arguments, or command-line arguments pointing to an invalid context (e.g. file not following the expected format).
  • 5 β€” Not found. You requested something (package, version, repository, etc.) that couldn't be found.
  • 10 β€” Aborted. The operation required confirmation, which wasn't given. πŸ™ˆ
  • 15 β€” Could not acquire the locks required for the operation.
  • 20 β€” There is no solution to the user request. This can be caused by asking to install two incompatible packages, for example.
  • 30 β€” Error in package definition, or other metadata files. Using --strict raises 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. This 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 operation, and 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. SIGINT was received, generally due to the user pressing Ctrl+C.

And then there's the extra little trio, for when a command exits with the exit code of some other program it ran:

  • 0 β€” on success.
  • 123 β€” on indiscriminate errors reported on standard error.
  • 124 β€” on command line parsing errors.
  • 125 β€” on unexpected internal errors (bugs).

πŸ“š FURTHER DOCUMENTATION πŸ“š

Need more? See https://opam.ocaml.org/doc. That's the spot. 🫢


πŸ‘‘ AUTHORS πŸ‘‘

These are the actual legends who built this thing. Show some respect:

  • 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 🌸

Go read that one too, bestie, it's the main character. πŸ’…


πŸ› BUGS πŸ›

Found something cursed? Check bug reports at https://github.com/ocaml/opam/issues. No cap, that's where the fix happens.


And that's a wrap on the whole page, babe!! 🌈 This one's from Opam 2.6.1 and it's the OPAM-LINT(1) page, dated right alongside that release. You read the entire thing, every flag, every code, every name β€” iconic behavior, honestly. βœ¨πŸŽ€ Now go lint something and make it slay. πŸ’–πŸ¦‹

πŸ“¦ where this page comes from