Is there a way to set the current opam switch
locally to a folder? It seems this command has global effect, which means that I can't work on projects with different requirements at the same time
Concretely: to browse the coq
sources I need ocaml 4.14 and to browse metacoq
I need coq 8.18 which uses ocaml 4.12. I would like to look at both of them
eval $(opam env --switch=foo --set-switch)
sets the switch locally in the current shell
I guess there isn't any way to store the information in a file so that I can just run coqc
or make
or dune
or whatever and it just works with the right version?
you may want to look at the Coq Nix Toolbox if you want that kind of functionality
There is opam switch link
, which is exactly what you asked for (except that you still need to eval $(opam env)
everytime)
I am spoiled by elan
, which just makes this work out of the box (people put a lean-toolchain
file in the project to indicate which version they want)
opam switch link
is a good solution for me personally, although it's not something I can commit to a project IIUC
You can also create a local-only switch using opam switch create .
, and you can even symlink them around (if you have different developments that need the same switch)
Mario Carneiro said:
I am spoiled by
elan
, which just makes this work out of the box (people put alean-toolchain
file in the project to indicate which version they want)
Looks a lot like what the nix toolbox offers.
I think so, except that it's not nix so it works on windows too
Johannes Hostert said:
There is
opam switch link
, which is exactly what you asked for (except that you still need toeval $(opam env)
everytime)
this, but IIRC there is something you can add to your shell configuration to avoid having to do eval $(opam env)
every time. I think opam offers to do it for you when you install it
It just puts eval $(opam env)
in your .bash-profile
or equivalent
I now see what the _opam
folder here was about. It would be nice if this opam switch link
invocation was mentioned in project setup instructions if it is recommended
Mario Carneiro said:
It just puts
eval $(opam env)
in your.bash-profile
or equivalent
Yes, and that's unfortunately not good enough unless there is a way to execute it whenever you cd
, since your opam switch now depends on your current directory.
And even then, sometimes I want to cd
without this getting in the way.
oh, good point
When the opam integration works, the switch gets set dynamically when you change cwd
Another way: in VSCoq you can choose the opam switch (the coqc bin folder) per project or folder. This will switch all coq tools, but no other things you might have in opam, so it is not quite the same as setting an opam switch.
In more complex setups (e.g. if you have other envars to export or if you edit several projects at once), you can also use direnv, which integrates with bash/zsh/...
It allows you to updates the current environment variables on the fly (what opam env
does) depending on your directory.
NB : there is a mode for direnv in emacs and a similar thing for VSCode.
emacs has this for opam: https://github.com/ProofGeneral/opam-switch-mode
is this information in _CoqProject
?
Karl Palmskog said:
emacs has this for opam: https://github.com/ProofGeneral/opam-switch-mode
Is there a way to set it up automatically for a given directory (like with directory variables or something similar) such that switching between two buffers living in different projects updates the opam switch automatically ?
Oh I noticed that the version is listed in e.g. https://github.com/MetaCoq/metacoq/blob/coq-8.18/coq-metacoq-pcuic.opam . Is this file standard practice?
maybe not, seems like that's just a project local name and not something you can give to opam
Arnaud DABY-SEESARAM said:
Karl Palmskog said:
emacs has this for opam: https://github.com/ProofGeneral/opam-switch-mode
Is there a way to set it up automatically for a given directory (like with directory variables or something similar) such that switching between two buffers living in different projects updates the opam switch automatically ?
No idea, you could try asking in the #Proof General users stream.
in opam, one can define the version or omit it, depending on what is most convenient for order sorting
Would it be unreasonable to ask for some standardized way of putting the coq version in git repos so that tools can pick up on it? :sad:
Coq and opam are distinct. The canonical versions of packages live in our opam repo (and in a corresponding Nix repo): https://github.com/coq/opam
I am reminded of a talk at this year's ITP which was nominally about testing a proof repair tool on coq projects but was actually 80% "how to figure out how to compile coq projects in the wild"
anyone who builds from repos are effectively on their own, the standard recommendation is to use the Coq Platform
they were trying to build projects across 10+ Coq versions, without any reference to their opam packages or other metadata
for advanced users, we maintain a set of Git-based opam packages (again Nix has its own): https://github.com/coq/platform/
are "opam packages and other metadata" sufficient to reliably and automatically orient oneself in a git repo which follows current best practices?
there are many forms of "best practices". Some people have an opam package in their repo, some don't
I don't know what that means. Let's say this is a coq project, with coq source files that one expects to be able to compile. Can we figure out how to do that? I don't know whether this entails it being an "opam package", I don't think it does
some people build everything with Dune, some use from-scratch Makefiles, some use coq_makefile-generated Makefiles. We recommend people to do and rely on releases instead of relying on master
/main
from a repo. The Coq Platform is effectively one big tested release of most utility packages one can want.
my focus is on source repos because I want to look at the code not just refer to it
there is no one single way to build every Coq project. The situation is similar for OCaml and similar languages - the language is distinct from package/repo management
Okay, but that doesn't mean you can't have a recommendation which is followed by the big projects
and that doesn't even have to be a recommended build tool, metadata alone is sufficient
we maintain various recommendations and tools in Coq-community for maintaining a Coq project: https://github.com/coq-community/templates
Since you brought up the Coq Platform: is it the case that we can automatically determine how to build projects on the Coq Platform from source?
but that [having recommendations] doesn't really mean that people follow them. CompCert is a commercial product, they will build it however they want. But they publish opam packages to the Coq opam archive which makes it possible to include in the Coq Platform
the Coq Platform is based on opam, which at its core is a tool for building from source
sure, once you have a recommendation it's a complex social situation whether it actually gets adopted in practice
the closest thing that I've seen to a project file so far is _CoqProject
, although it seems to be makefile generated?
it's not generated typically. It's a convention to have a _CoqProject
file since editors can use it to determine the logical path of a Coq project, such as compcert
.
yes, that's what I'm talking about. "Editors break if you don't use it" is a great motivator to set things up appropriately
if there is a list of files in _CoqProject
, it can be handed to coq_makefile
to generate the Makefile. I compare different ways to build Coq projects here: https://github.com/coq-community/coq-program-verification-template#building-instructions
OCaml recently said they will eventually use Dune to build+interact with anything OCaml. It's not unlikely Coq will follow in OCaml's footsteps eventually, but right now Dune doesn't support all editor workflows.
Does this mean that the template builds on coq 0.8?
Mario Carneiro said:
the closest thing that I've seen to a project file so far is
_CoqProject
, although it seems to be makefile generated?
it's the other way around, coq_makefile generates makefiles from _coqproject files
coq 0.8
is the Coq support level in the Dune build tool. It signifies what features are available when building Coq projects. It's mostly indendent of the Coq version.
I see. So how does dune know what version of coq to use?
oh, the .opam
file does have a "coq" {>= "8.14"}
line
Dune works the same as opam by default, it uses coqc
from the PATH. It can be configured to use another one, of course
it seems the OCaml people have decided that projects should generate their .opam
files from their dune-project
files (dune build
does this generation automatically when opam metadata is declared). Coq projects can also do this, but typically don't.
While all these tools to specify and manage version dependencies are quite handy, I find it sad to see how little effort is spent comparatively on improving support for compatibility across versions.
Coq already has much stronger backwards compat than Lean, which already enshrines for years behavior that is known to be bonkers
And in a theorem prover, changing most definitions is an API break
Anyway, "better backwards compat" is a separate thread in any case.
On the other hand, elan
is very stable, which means you can jump into any lean project and compile it using the same elan binary (which fetches the appropriate version of lean if needed)
@Mario Carneiro I'd say the only unofficial recommendation is yo provide opam packages, ideally also as part of the source repository, and ideally even test them in CI
but in coq I don't see how one could even write such a program because there isn't any clean alternative to the lean-toolchain
file except grepping the readme
If that happens, the same opam binary can mostly compile any project.
so I should grep the .github/ci.yml
file then?
"opam files in the source repo" is the closest thing to a programmatic interface
is it something an editor could parse, or do you need to ask opam to give you the information
Something like "opam switch create ." (and/or specifying the opam packages) might be close to what you want, except I think it's too wasteful
but if you're willing to rebuild opam and coqc for each project, it might mostly work.
yes, the trouble with relying on build tools for project configuration is that build tools like building things, and usually querying the project layout is not a high priority
Hm, why does the project layout matter here?
I've also learned to distrust opam's solver for a bunch of reasons
well, the location of source files is also important (but this is already mostly covered by _CoqProject
)
metacoq has a whole collection of .opam
files. I can't imagine what would happen if they describe different coq versions
"what are the external dependencies" (opam files) and "how to find sources/internal dependencies" (_CoqProject) are orthogonal questions today
opam would fail to solve the constraints, if you use a correct workflow
It's not the case that opam install a b
can be split into opam install a; opam install b
— that's not true with any package manager (outside Nix, because the question doesn't make sense), but opam is especially bad at it
For your original question, BTW, did anybody point out Coq 8.18 works on opam 4.14?
I'm not entirely sure I diagnosed the problem correctly
I tried to browse the coq sources with the coq.8.18
switch enabled after having previously compiled it with whatever dev version was in use, and the vscode ocaml plugin started complaining about a version mismatch
That description is very incomplete, but IME no two distinct Coq binaries can exchange .vo files, and this might or might not be relevant
the issue happened in the ocaml plugin because I was looking at .ml files from the coq sources
Well, if you mixed ocaml 4.14 and .12 as you said, that'd explain it, no?
I don't really know how to determine the ocaml version <-> coq version mapping so I made a best guess
but the error message mentioned 4.14 and 4.12
If you browse with a switch, build with the same switch
well yes, I agree with that and the error is most logical. But global switches make no sense in this context hence the question
The OCaml vscoq plugin already lets you select switch per project
For Coq plugins, you can give the path to the Coq binary, and you'd typically give a path to the binary in the right switch
the vscode plugin is "OCaml Platform", it's pretty good but I don't see anything directly referencing opam in the preferences
it seems to work with opam switch link
well enough so that's what I'm doing
I'm not judging if this is ideal — it probably isn't — but it can be handled by managing things manually...
Let me screenshot the right pane, it's not in the preferences
Why do you need more than one OCaml version ?
beats me, I didn't design this build nightmare
I just follow instructions and then complain when they don't work
and then incredibly helpful people come out of the woodwork and make it actually work :)
@Yann Leray dependencies can vary, so one needs different switches, and for each switch something must pick the version
@Mario Carneiro as you see, I clicked on the "OCaml" button on the left bar, and then all that stuff shows up for me
I also see something like that
second item lists "opam switches" :-)
oh nice, my coq.8.16
switch has coq 8.18 installed on it
indeed, switch names are just comments
(not literally, but opam should respect alpha-renaming switches, so this can happen)
I'm not sure I understand, recent enough versions of Coq support all modern versions of OCaml, so sticking to either 4.14 or 5 should do.
The installation for source is opam install . --deps-only
and if there is a conflict you create another (possibly local) switch; at least that's how I do
@Yann Leray yes, and unless you manually pick the same OCaml version for all such switches, you can get a different OCaml version for each switch
but not sure it matters much — I wouldn't try to exchange binary artifacts across two switches, just because they have the same OCaml
Going back to the first message, you can have a single switch to browse both Coq and MetaCoq, since their dependencies overlap
I assure you I have no idea how to do that
agreed here with both Yann and Mario :-)
In general:
opam switch link
before building, then the appropriate switch to use is at least recorded so that the editor _may_ use it (OCaml editors do, but no Coq editor does that today AFAIK)if only the editor could read your file instead...
but without opam switch link
, that makes no sense
MetaCoq makes VSCode read from the local switch; if it is linked through opam switch link
it should work. Does it not ? (I have a local switch there and it works fine)
it does, except that the readme doesn't say anything about setting up a local switch so it just fails because _opam
is missing
@Mario Carneiro https://github.com/MetaCoq/metacoq/blob/coq-8.16/INSTALL.md#setting-up-an-opam-switch mentions both local switches and opam switch link
ah, so it does. It makes it sound more optional than it is
well, it is optional
it is required for certain use cases
nope
I can have a single switch, or I can have multiple switches and tell my editor
let me say this: it's nice if in Lean you needn't worry about any of this.
But IME, neither OCaml nor Coq is like that today.
It is the usual way to ensure VSCode knows where to look for vscoq/coq-lsp, but is not the only one. You could change the path from the editor instead (and would probably have to for other editors than VSCode)
Paolo Giarrusso said:
I can have a single switch, or I can have multiple switches and tell my editor
That's what I tried, and it fails because the vscode config makes explicit reference to _opam
ugh
"ugh" as in "who thought committing .vscode
files was a good idea"
who thought it would be a good idea to make every editor reimplement the build logic
that file replicates part of _CoqProject
as well
They are required for the arguments, since _CoqProject
isn't picked up from our tests
@Mario Carneiro you're implying editor-build integration was designed organically, I'm afraid that's not true
it looks very much like the editors came on the scene late and had to make the best of a very haphazard world
Mario Carneiro said:
Paolo Giarrusso said:
I can have a single switch, or I can have multiple switches and tell my editor
That's what I tried, and it fails because the vscode config makes explicit reference to
_opam
You can have a single switch, link it locally and it would work
@Yann Leray if you open workspace foo
, then _CoqProject
is loaded by default from that folder — that's tweakable by customizing coq.coqProjectRoot
so, either open each folder, or have a _CoqProject
in the MetaCoq root just for use by the editors.
@Yann Leray well, but then Mario's right that the README is incomplete
Note that it works fine if you open the subfolders, the .vscode thing seems to be working around issues with the "workspace" structure of the metacoq repo
makes sense — the build turns _CoqProject.in
into _CoqProject
I guess
and there's a genuine problem — the _CoqProject
I suggest isn't the right one for building (since it allows any library to depend on any other); today you need dune to specify such workspace structure.
Still, even if things are diverse now, I don't see major obstacles with creating a new standard and having it be picked up by the biggest / most well maintained packages, as long as it's just about project structure and metadata and not actual building. But I'm coming from an ecosystem that is significantly more centralized (which BTW relates to why it is less focused on forward/backward compatibility, because we can actually "fix the world", at least for now)
I mean, the actual bug here is about building Coq code
the opam
build files are complete
I'm not sure what you mean by that
most Coq projects have okay docs for building the code itself, but an editor needs to know how to call commands that aren't regular coqc invocations and e.g. may not be in the makefile
the only problem with opam is "nothing says you must create a local switch", but the fix is to not rely on the switch being local.
and metacoq only needs that because of accidents/limitations with _CoqProject
that are fixed by dune
.
Mario Carneiro said:
most Coq projects have okay docs for building the code itself, but an editor needs to know how to call commands that aren't regular coqc invocations and e.g. may not be in the makefile
if you mean "the editor should install dependencies", .opam
files give the info on how to do that. If we were all okay with automatically creating a new opam switch per project, and rebuilding ocaml
and coqc
each time, we could add support to editors today.
Is it possible to test whether a switch could compile the project?
checking deps match is roughly something like opam --switch $target_switch install --dry-run <opam files>
you could then tell the user to run opam --switch $target_switch install <opam files>
, but that's a large side effect that I wouldn't want to automate
in which case you could do something like:
opam switch link
so that it doesn't prompt next timewait.
who installs the missing deps?
opam
I guess?
but running opam --switch $target_switch install
isn't safe — opam
might at least decide to rebuild other packages, change installed deps, rebuild coqc (breaking binary compat with existing .vo
files), maybe uninstall packages (not sure on this)
yikes
tho I think that's true of _ANY_ package manager with multiple versions of the same package
well that's why it's a prompt and not just a done deal
in elan
toolchains are basically the equivalent of switches, but they are just a package deal, you get the compiler and projects are not managed by the switch
that could work. I fear users would click through too easily and suffer, but that already happens today.
"just a package deal"?
you get the "core distribution" i.e. lean
+ lake
as binaries, projects are not managed by elan
although elan
is based on rustup
which has a concept of "components" which might be analogous to coq plugins
it sounds like opam
is split across elan
+ lake
?
elan
for the compiler and lake
for packages?
opam
is lake
, elan
doesn't exist AFAICT
opam
will install ocamlc from source
(er, it can — it can also use the distro package, but that's IMHO a bad idea for different reasons)
lake
builds dependencies from source, elan
is binary distribution
no binary distribution in opam, indeed
although I don't think it's an essential difference whether it is binary or builds from source
so how do you deal with 2 switches that share ocaml version but have different versions of dependency A?
you could do a similar architecture either way
Each switch has another compiler and all dependencies
I'm not sure what you mean — I'm asking if lake
gives you some way to have multiple switches on the same toolchain
the switches are the toolchains
so, I can create two toolchains with the same compiler?
the toolchain contains the compiler in the package
I suppose you could symlink stuff if you are short on space but generally no
oh, I'm ambiguous too.
if this was a major concern I can imagine elan
doing it transparently
I'm asking if you can create lean.4.0.1, lib-foo.0.1
and lean.4.0.1, lib-foo.0.2
.
but with lean the main reason you need another switch/toolchain is because the compiler changed
Oh yes you can do that
but lean
doesn't depend on lib-foo
I assume my projects depend on different versions of lib-foo
yes, it would be lake
handling that
which maybe is similar to dune
here?
it builds lean projects including dependencies
today that's similar to opam
I'm ignoring the dune-opam
integration because I haven't looked into it
Is dune
the newfangled thing that hasn't caught on then?
I just meant that dune's is just a build tool not a package manager (outside of this integration)
so, installing lib-foo
into a switch is opam
's job, and building your source project is dune
's job
lake
is mainly a build tool, but it does know how to locate dependencies in git repos
every OCaml project uses dune these days, while few Coq projects do yet
So if you have two local projects and one depends on the other, do you need to install the dep into your switch to use it downstream?
I assume metacoq is doing something like that
it depends
honestly, I'm still missing something, because it's not clear if in Lean you can do opam --switch A install lib-foo.0.1; opam --switch B install lib-foo.0.2
maybe in Lean you _can't_ install dependencies globally?
lib-foo.0.1
says "I use lean v4.1
" and lib-foo.0.2
says "I use lean v4.2
", and elan makes sure that the right lean is used to compile each project
which means you will end up with two toolchains if you compile both
no, I'm assuming they both use lean v4.1
Like I said, the equivalent of switches are toolchains, there is one toolchain labeled lean v4.1
and another one labeled lean v4.2
and that's what they have in them
so if they are both using v4.1
then there is only one switch
well, that sounds like lean doesn't support my scenario
it's not even clear if you _can_ install lib-foo
into the toolchain — if the name is accurate, maybe you can't?
The whole idea behind this design is to avoid needing to say --switch A
, projects tell you what they build on not the other way around
That's right, you can't install external projects on the toolchain
this may change in the future, but for now elan
is just about delivering the core tooling (the build tool and compiler)
so, if lib-bar
and lib-baz
depend on lib-foo
, it sounds like they can't share the build of lib-foo
?
if Lean is solving a simpler problem, I'm not surprised the tooling is simpler to use
building of lean projects and dependencies among them are handled by lake
. There is ongoing work to support build caching in lake
but currently there is a cache tool specialized to mathlib
, which is by far the largest package (and is everyone's dependency so we need that part to work)
the reason I ask is because Lean doesn't have a package ecosystem comparable to Coq, so my scenario might be mostly/entirely hypothetical in Lean
we're moving towards that direction especially in this latest iteration, so we are taking notes regarding how to scale up here
lake
will normally just recompile all your dependencies in the project folder, so kinda opam switch create .
IIUC
so, _any artifact_ is either a toolchain _or_ locally installed?
right now, yes
okay, so toolchains are more restricted compared to opam switches
I hope we can get the build cache stored globally with some kind of content addressing scheme similar to what we use for the mathlib cache
I think that would make it similar to nix
but I think that installs that follow you around like an opam switch are an antipattern. elan
does support this, you can set the default toolchain, but the current recommendation is for everyone to use a lean-toolchain
to define a specific version of lean that they use
in our world, both nix
and dune
have some build caching — but nix
only caches entire packages, while dune
has working caching but doesn't "standardize" builds as much
that "antipattern" is necessary unless you solve nontrivial problems
arguably, Nix solves them, but the solution doesn't seem simple enough to use for large-scale adoption
The solution to the nontrivial problem is a file like this, it's not rocket science
literally just put the version you use in a file in a standardized location that can be picked up by tooling
but that's not the problem
that solves the eval $(opam env)
problem
no
you can write an opam file listing all dependencies
so why can't my tooling figure it out?
For reference, here is the equivalent file in a coq project: https://github.com/uwplse/StructTact/blob/master/coq-struct-tact.opam
you explained how it could work today
but even if we had auto-downloadable binary Coq packages, that wouldn't automatically synthesize an opam switch fitting your constraints.
let alone a switch fitting the constraints of two projects.
Suppose we just create a local switch for every project. Would that not work? (Ignoring that this is a waste of space)
if we ignored space and build time, it would.
that doesn't solve "I want to build two projects locally and use them in a third one", and that matters in practice, but let's set that aside to scope the discussion.
the way I would do that in both rust and lean is to change the project config to use a path dependency to the other local project(s)
I can't say why this isn't implemented, but ignoring build time isn't such a great solution that somebody will jump to implement it, IMHO.
Note that I spend way more time debugging stupid build incompatibilities than I spend on build time
I think Rust gets away with it because they can use aggressive caching, that's just complicated to implement.
I agree there's definitely a learning curve to opam and build tools to avoid such problems.
sharing build artifacts should be an optimization, it should not change observable behavior and it definitely shouldn't cause an error
I find opam easy and Nix hard, but YMMV, and I carry far too much cursed knowledge about debugging build issues in general :sweat_smile:
I think opam supports installing packages from path, right? So it might be implementable with the current metadata from .opam files, you would just need to write an opam wrapper script. The only problem I forsee is that not all projects specify their dependencies very tightly, because they don't have to, chicken-and-egg problem. And caching, while it's just an optimization, is often the difference between usable and completely unusable.
So, the unfortunate answer might just be "PR's welcome" :). Not that that's very satisfying, but Coq isn't a software product, it's research software. The way things get implemented is that someone gets frustrated enough with them to implement them. The same is true of Lean, but the cultures are different and there is more corporate sponsorship in lean, so there is more resources allocated towards tooling.
for builds to be really pure, you need to handle system deps as well (like Nix does). Ignoring that, if your package manager wants to rebuild packages transparently, then your editor must at least know how to rebuild your project. Which might take several more hours.
or you could download binaries
and those hours are required even with perfect build caching — adding package X might add constraints on a Coq dependency and require rebuilding Coq and everything depending on it
Hmm, you might be able to ignore the system dependencies problem in the first draft though, I don't usually have to switch system dependencies between coq projects. I just install a few system dependencies when I first install opam, and then everything else just gets built through opam. I've only built about 200 coq packages though, there could be other ones that change the system dependencies I haven't run into.
system dependencies meaning what exactly?
the Coq platform picks package versions, so if we had sth like https://github.com/OCamlPro/opam-bin, and storage, one could have binaries for selected package combos.
System dependencies meaning like, GMP for big-int support. Things you would install through your OS that provide a dynamic library.
or perl
deps for packages using that for their build — but luckily, I think camlp5 isn't used any more :-)
but yeah, you could often set aside system deps in practice
but I'm not confident you can ship an OCaml toolchain without an entire SDK, C headers and all — OCaml _source_ packages definitely don't support that
In terms of binaries, binaries alone aren't enough in a proof assistant, right? The interface to a proof library isn't just functions, it's a bunch of types based on those functions and definitions that you might need to unfold at the source level to prove things.
all that is part of binaries
Ah sure, binaries as in vo files.
yeah, the lean toolchain comes with .olean
files (for import
) and .lean
files (so that go-to-definition works)
but stuff like jump-to-definition requires compiled .glob
and source .v
files
but it doesn't take half an hour to install because it's unzipping not building
So with lean, they basically include the source files so that you can jump to them, but also include their pre-built artifacts so that you don't need to rebuild. That makes sense.
I guess some people would be worried about some sort of soundness attack, but you could always add a switch for the paranoid.
for soundness you needn't rebuild from source
yes, there is a separate tool for rechecking (I think this is coqchk?)
typechecking the .vo
/.olean
files is enough in principle, indeed — coqchk
does that, altho today's implementation is far from adversary-resistant
for the truly paranoid, no switch is enough :)
if I sold you a large proof as .vo
files, you should probably bet on me corrupting them
ideally you would be able to use metacoq as a .vo
checker
Ah, sounds "trivial" then :laughing:
separate topic, but AFAIK a few more PhDs are needed, to reconcile what Coq does and what we can sanely reason about :sweat_smile:
https://github.com/coq/coq/issues/7839 lists challenges with making coqchk safer — the joke about corrupted .vo comes from the same person who filed that issue
but this is OT
binary distribution for Coq is blocked on binary distribution for OCaml
unless you solve both via Docker
Incidentally, I implemented a .vo
parser in rust yesterday (and found some bugs in the process). Not sure if I'll make a checker but I'm contemplating it, it seems like a good way to learn what's going on
Paolo Giarrusso said:
no binary distribution in opam, indeed
We have this in Nix with cachix.
Last updated: Oct 13 2024 at 01:02 UTC