See full changelog
Added
- Add
--skip-lint
,--skip-build
,--skip-test
and--keep-build-dir
to the main command (#419, @NathanReb) - Added support for parsing changelogs written in the style of keepachangelog.com (#421, @ifazk)
Read the latest releases and updates from the OCaml ecosystem.
--skip-lint
, --skip-build
, --skip-test
and
--keep-build-dir
to the main command (#419, @NathanReb)Additions
Bugs fixed
val x : #c
) (@jonludlam, #809)mli
files.
(#339, #357, @julow, @Leonidas-from-XIV)dune
MDX 0.2 stanza by
setting the MDX_RUN_NON_DETERMINISTIC
environment variable. (#365,
#366, @Leonidas-from-XIV)Fix missing -linkall flag when linking library dune-sites.plugin ( #4348, @kakadu, @bobot, reported by @kakadu)
No longer reference deprecated Toploop functions when using dune files in OCaml syntax. (#4834, fixes #4830, @nojb)
Use the stag format API to be compatible with OCaml 5.0 (#5351, @emillon).
Fix post-processing of dune-package (fix #4389, @strub)
;;
to the output of toplevel phrases that were missing it.
(#346, @Leonidas-from-XIV)mdx
binary anymore (#274, @gpetiot)rule
command (#312, @gpetiot)require-package
label, use the mdx
stanza in dune
instead. This label was only used for the rule
command and can now be
safely removed. (#363, @Leonidas-from-XIV){@ocaml kind=toplevel env=e1[ code ]}
input_name
to the Expansion_context.Extension
and Expansion_context.Deriver
modules (#284, @tatchi)gen_symbol
to strip previous unique suffix before adding a new one (#285, @ceastlund)name_type_params_in_td
to use prefixes a
, b
, ... instead of v_x
. (#285, @ceastlund)type_is_recursive
and really_recursive
where they would
consider a type declaration recursive if the type appeared inside an attribute
payload (#299, @NathanReb);;
(#342, @Leonidas-from-XIV)We are pleased to announce the minor release of opam 2.1.2.
This opam release consists of backported fixes, including:
dnf
if yum
does not exist on RHEL-based systems (#4825)--no-depexts
in CLI 2.0 mode. This further improves the use of opam 2.1 as a drop-in replacement for opam 2.0 in CI, for example with setup-ocaml in GitHub Actions. (#4908)Opam installation instructions (unchanged):
From binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.1.2"
or download manually from the GitHub "Releases" page to your PATH. In this case, don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update you sandbox script.
From source, using opam:
opam update; opam install opam-devel
(then copy the opam binary to your PATH as explained, and don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update your sandbox script)
From source, manually: see the instructions in the README.
We hope you enjoy this new minor version, and remain open to bug reports and suggestions.
compact
and sparse
are now deprecated and will be removed by version 1.0 (#1803, @gpetiot)align-cases
, align-constructors-decl
and align-variants-decl
(#1793, @gpetiot)disambiguate-non-breaking-match
(#1805, @gpetiot)break-before-in
(#1888, @gpetiot)break-cases={toplevel,all}
(#1890, @gpetiot)break-collection-expressions
(#1891, @gpetiot)break-fun-decl=smart
(#1892, @gpetiot)break-fun-sig=smart
(#1893, @gpetiot)break-string-literals
(#1894, @gpetiot)break-struct
(#1895, @gpetiot)extension-indent
(#1896, @gpetiot)function-indent
(#1897, @gpetiot)function-indent-nested
(#1898, @gpetiot)if-then-else={fit-or-vertical,k-r}
(#1899, @gpetiot)indicate-multiline-delimiters=closing-on-separate-line
(#1900, @gpetiot)indent-after-in
(#1901, @gpetiot)let-binding-indent
(#1902, @gpetiot)let-binding-spacing=sparse
(#1903, @gpetiot)match-indent
(#1904, @gpetiot)match-indent-nested
(#1905, @gpetiot)module-item-spacing=preserve
(#1906, @gpetiot)nested-match
(#1907, @gpetiot)parens-tuple-patterns
(#1908, @gpetiot)sequence-style=before
(#1909, @gpetiot)stritem-extension-indent
(#1910, @gpetiot)type-decl-indent
(#1911, @gpetiot){|...|}
(#1754, @nojb, @hhugo)*
, %
, #
-ops) (#1776, @gpetiot)indicate-multiline-delimiters=closing-on-separate-line
(#1786, @gpetiot)foo ~(x:int)
instead of the explicit foo ~x:(x:int)
. (ocaml#10434) (#1756, #1759, @gpetiot).
This syntax is only produced when the output syntax is at least OCaml 4.14.ocaml-version
option to select the version of OCaml syntax of the output (#1759, @gpetiot)Additions
Bugs fixed
Additions
Disable functionality reliant on ocamlformat-rpc for now (#555)
4.13 compatiblity
occurences
to work when looking for locally abstract types
(#1382)-alert
compiler flag (#1401)-error-style
compiler flag (#1402, @nojb)Oops, we went looking but didn't find the changelog for this release 🙈
.merlin
files, and as a consequence no longer
depends on dot-merlin-reader. (#523)Feedback on this post is welcomed on Discuss!
We are pleased to announce the release of opam 2.1.1.
With opam 2.1.1, if you export OPAMCLI=2.0
into your environment then workflows expecting opam 2.0 should now behave even more equivalently.
opam 2.1.1 includes both the fixes in opam 2.0.10.
General fixes:
--packages
option for CLI version 2.0, e.g. OPAMCLI=2.0 opam switch create . 4.12.0+options --packages=ocaml-option-flambda
. In opam 2.1 and later, this syntax remains an error (#4843)opam switch set-invariant
: default repositories were loaded instead of the switch's repositories selection (#4869)Integrated depext support has a few updates:
And finally two regressions have been dealt with:
Unix.environment
on load (as a toplevel expression). This regression affected opam's libraries, rather than the binary itself (#4789)A few issues with the compilation of opam from sources have been fixed as well (e.g. mingw-w64 with g++ 11.2 now works)
Opam installation instructions (unchanged):
From binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.1.1"
or download manually from the Github "Releases" page to your PATH. In this case, don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update you sandbox script.
From source, using opam:
opam update; opam install opam-devel
(then copy the opam binary to your PATH as explained, and don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update your sandbox script)
From source, manually: see the instructions in the README.
We hope you enjoy this new minor version, and remain open to bug reports and suggestions.
--packages
option with cli 2.0, and a specific error message for cli 2.1
[#4853 @rjbou - fix #4843]Feedback on this post is welcomed on Discuss!
We are pleased to announce the release of opam 2.0.10.
Two subtle fixes are included in opam 2.0.10. These actually affect the ocaml
package. Both of these are Heisenbugs - investigating what's going wrong on your system may well have fixed them, they were both found on Windows!
$(opam env --revert)
is the reverse of the more familiar $(opam env)
but it's effectively called by opam whenever you change switch. It has been wrong since 2.0.0 for the case where several values are added to an environment variable in one setenv
update. For example, if a package included a setenv
field of the form [PATH += "dir1:dir2"]
, then this would not be reverted, but [[PATH += "dir1"] [PATH += "dir2"]]
would be reverted. As it happens, this bug affects the ocaml
package, but it was masked by another setenv
update in the same package.
The other fix is also to do with setenv
. It can be seen immediately after creating a switch but before any additional packages are installed, as this Dockerfile
shows:
FROM ocaml/opam@sha256:244b948376767fe91e2cd5caca3b422b2f8d332f105ef2c8e14fcc9a20b66e25
RUN sudo apt-get install -y ocaml-nox
RUN opam --version
RUN opam switch create show-issue ocaml-system
RUN eval $(opam env) ; echo $CAML_LD_LIBRARY_PATH
RUN opam install conf-which
RUN eval $(opam env) ; echo $CAML_LD_LIBRARY_PATH
Immediately after switch creation, $CAML_LD_LIBRARY_PATH
was set to /home/opam/.opam/show-issue/lib/stublibs:
, rather than /home/opam/.opam/show-issue/lib/stublibs:/usr/local/lib/ocaml/4.08.1/stublibs:/usr/lib/ocaml/stublibs
Opam installation instructions (unchanged):
From binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.0.10"
or download manually from the Github "Releases" page to your PATH. In this case, don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update you sandbox script.
From source, using opam:
opam update; opam install opam-devel
(then copy the opam binary to your PATH as explained, and don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update your sandbox script)
From source, manually: see the instructions in the README.
We hope you enjoy this new minor version, and remain open to bug reports and suggestions.
v
as prefix for tags but the project version omits it. Now
they share the same URL. (#402, #404, @Leonidas-from-XIV)dune-release
supported unannotated tags in a few places already, now it supports using
them for creating a release. (#383, @Leonidas-from-XIV)---V
command option to be -V
(#388, @Leonidas-from-XIV)dune-release
on projects that do not use the changelog or have it in a
different format. (#381, #383 @Leonidas-from-XIV)dune-release
couldn't retrieve a release on GitHub if the
tag and project version don't match (e.g. v1.0
vs 1.0
). dune-release
would in such case believe the release doesn't exist, attempt to create it
and subsequently fail. (#387, #395, @Leonidas-from-XIV)Hot on the heels of the OCaml 4.13 announcement(s!), the odoc
team is pleased to announce the release of odoc 2.0.0
!
tl;dr: The new version produces much better output than the old version, it's the engine at the core of the package docs in v3.ocaml.org, and it also has a new website.
This release has been a long time coming -- years! -- and contains several notable improvements over the odoc 1.5
series: a new language model, a new rendering layer allowing output in several formats, and improved control over the output structure.
The internal library used by odoc
that models the OCaml module system has been completely rewritten over a multi-year effort by @jonludlam and @Julow, according to a design by @lpw25. The rewrite gives odoc
a much better understanding of the module system compared to the original implementation. This library is used for two main processes:
odoc
takes complex module type expressions like this one from tyxml:module Make
(Xml : Xml_sigs.T with type ('a, 'b) W.ft = 'a -> 'b)
(Svg : Svg_sigs.T with module Xml := Xml)
: Html_sigs.Make(Xml)(Svg).T
with type +'a elt = Xml.elt
and type +'a attrib = Xml.attrib
Then turns it into an output page containing the correct types, values, modules, includes, and documentation.
odoc
handles complex paths found in OCaml source in order to calculate the correct definition link. For example, in the following snippet:module type A = sig
module M : sig module type S end
module N : M.S
end
module B : sig module type S = sig type t end end
module C : A with module M = B with type N.t = int
type t = C.N.t
resolution is the process by which odoc
determines which documentation page to take you when you click on C.N.t
.
The new model has logic to handle many features of the OCaml language, as can be explored here.
A particularly important improvement is in handling canonical modules (explained in the link above). The upshot of this is that there should never be any more odd double underscores leaking into your docs!
For some more info on this, as well as the new output renderers, see our talk at the OCaml workshop last year
@Drup put a considerable amount of work into replacing the odoc 1.5
custom HTML generator with a new rendering layer. This features a new intermediate format allowing new output formats to be added far more easily than before.
Included in odoc 2.0
are renderers for HTML and man pages (both contributed by @Drup) and LaTeX (contributed by @Octachron). The LaTeX renderer has already been integrated into the OCaml build process to generate docs (see https://github.com/ocaml/ocaml/pull/9997 and related PRs). @jonludlam also made an alternative HTML renderer designed specifically for v3.ocaml.org. Finally, a new markdown renderer is being prepared by @lubegasimon and should land in the next release.
We look forward to many new renderers being created for the varied use cases present in the community!
odoc 2.0
introduces a new mechanism to specify the structure of the files produced. Although it's a relatively simple new feature, it nevertheless has enabled odoc
to be used in new ways. In particular, it has allowed odoc
to construct the
package documentation for the new OCaml website, v3.ocaml.org. There is also an example driver, showing how odoc
can be used to construct a stand-alone website for an OCaml package that contains fully-linked documentation for a package and all of its dependencies. This has been used to create odoc
's new website.
Like the OCaml compiler itself, running odoc
on your code requires careful sequencing of the invocations to produce the correct result. Fortunately both dune
and odig
understand how to do this, so most users don't need to know the details. If you want more than these tools provide though, we've written a simple reference driver, documenting exactly what's necessary to use odoc
to produce rich documentation. A more complete (and more complex) example is the tool voodoo, which is being used to create the docs for v3.ocaml.org.
As previously posted, the new version of the OCaml website has been under development for some time now, and an important new feature is the integration of package listings, including documentation for every version of every package. More has been written about this elsewhere, but it's important to note that the new OCaml.org website required a preview version of odoc 2.0
to work. We've made a few bug fixes since then, so we will update the pipeline to use the released version very soon. For more info on the pipeline to build the docs, see our recent talk at this year's OCaml Workshop.
The website for odoc
has been improved with guides for documentation authors, integrators, and contributors. This site is intended to grow over time with more content to help people write docs for their packages.
This release, particularly because of the new output renderers, puts odoc
in a place where it supercedes OCamldoc in most respects. There are a few features we're missing (see the comparison in the docs), including
most notably that we don't render the source (OCamldoc's --keep-code
argument), and that there is no support for custom tags. If odoc
is lacking features that you're currently relying on in OCamldoc, we'd love to hear from you!
Finally, I'd like to use this opportunity to launch an invitation. With v3.ocaml.org now showing all the package docs in their current state, I'd like to invite all our package authors, maintainers, contributors, and users to take a look over their favourite packages and see what the documentation looks like. Good documentation is one of the most important requests from the previous OCaml developer surveys, and with v3.ocaml.org as a new documentation hub, now is a great time to be making improvements where they're required. With this new release of odoc
, previewing your docs should be as simple as dune build @doc
.
Some packages already have great docs - a few examples are:
many others have more patchy docs. Let's fix that!
We're also looking for more contributors to odoc
. It's much improved now, but there's still plenty more to do. Come and join the fun!
Breaking changes
Additions
{!modules:...}
(@Julow, #597)Bugs fixed
uwt
now can be documented (@jonludlam, #708)Fix debouncing of document updates. It was essentially completely broken in all but the most trivial cases. (#509 fixes #504)
Fix completion when passing named and functional arguments (#512)
On behalf of the ocaml-lsp team, I’m pleased to announce version 1.8.0. This release contains some quality of life bug fixes, better diagnostics locations, and a few new code actions. Happy hacking.
Add a new code action Add missing rec keyword
, which is available when
adding a rec
keyword can fix Unbound value ...
error, e.g.,
let fact n = if n = 0 then 1 else n * fact (n - 1)
(* ^^^^ Unbound value fact *)
Adding rec
to the definition of fact
will fix the problem. The new code
action offers adding rec
.
Use ocamlformat to properly format type snippets. This feature requires the
ocamlformat-rpc
opam package to be installed. (#386)
Add completion support for polymorphic variants, when it is possible to pin
down the precise type. Examples (<|>
stands for the cursor) when completion
will work (#473)
Function application:
let foo (a: [`Alpha | `Beta]) = ()
foo `A<|>
Type explicitly shown:
let a : [`Alpha | `Beta] = `B<|>
Note: this is actually a bug fix, since we were ignoring the backtick when constructing the prefix for completion.
Parse merlin errors (best effort) into a more structured form. This allows reporting all locations as "related information" (#475)
Add support for Merlin Construct
command as completion suggestions, i.e.,
show complex expressions that could complete the typed hole. (#472)
Add a code action Construct an expression
that is shown when the cursor is
at the end of the typed hole, i.e., _|
, where |
is the cursor. The code
action simply triggers the client (currently only VS Code is supported) to
show completion suggestions. (#472)
Change the formatting-on-save error notification to a warning notification (#472)
Code action to qualify ("put module name in identifiers") and unqualify ("remove module name from identifiers") module names in identifiers (#399)
Starting from:
open Unix
let times = Unix.times ()
let f x = x.Unix.tms_stime, x.Unix.tms_utime
Calling "remove module name from identifiers" with the cursor on the open statement will produce:
open Unix
let times = times ()
let f x = x.tms_stime, x.tms_utime
Calling "put module name in identifiers" will restore:
open Unix
let times = Unix.times ()
let f x = x.Unix.tms_stime, x.Unix.tms_utime
Handle workspace change notifications. Previously, the server would only use the set of workspaces given at startup to search for workspace symbols. After this change, workspace folders that are added later will also be considered. (#498)
Do not show "random" documentation on hover
Correctly rename a variable used as a named/optional argument (#478)
When reporting an error at the beginning of the file, use the first line not the second (#489)
;;
(#342, @Leonidas-from-XIV)Dear all,
on behalf of the Dune team I'm pleased to announce the release of Dune 2.9.1.
This is a minor release, fixing an important problem with opam file generation when (lang dune 2.9)
was set, and a few other minor fixes.
Don't use subst --root
in Opam files (https://github.com/ocaml/dune/pull/4806, @MisterDA)
Fix compilation on Haiku (https://github.com/ocaml/dune/pull/4885, @Sylvain78)
Allow depending on ocamldoc
library when ocamlfind
is not installed.
(https://github.com/ocaml/dune/pull/4811, fixes https://github.com/ocaml/dune/issues/4809, @nojb)
Fix (enabled_if ...)
for installed libraries (https://github.com/ocaml/dune/pull/4824, fixes https://github.com/ocaml/dune/issues/4821, @dra27)
Create more future-proof opam files using --promote-install-files=false
(https://github.com/ocaml/dune/pull/4860, @bobot)
Parser
from the API (#263, @pitag-ha)Location
: add set_filename
and Error.get_location
(#247, @pitag-ha)Syntaxerr
from the public API. Doesn't affect any user in the
ppx universe (#244, @pitag-ha)Keyword.is_keyword
to check if a string is an OCaml keyword
(#227, @pitag-ha)Lexer.keyword_table
: use Keyword.is_keyword
instead
(#227, @pitag-ha)Lexer
from the API: it was the same as the compiler-libs
Lexer
(#228, @pitag-ha)Ast_magic
, Compiler_version
, Js
, Find_version
,
Convert
, Extra_warnings
, Location_error
, Select_ast
and
Import_for_core
from the API: they are meant for internal use and
aren't used by any current downstream user in the
ppx universe (#230, @pitag-ha)Location
. They aren't used
by any current downstream user in the
ppx universe (#238, @pitag-ha)Location
: make raise_errorf
exception equivalent to exception
Error
(#242, @pitag-ha)Pprintast
: correctly pretty print local type substitutions, e.g.
type t := ... (#261, @matthewelse)Ast_pattern.esequence
, for matching on any number of sequenced
expressions e.g. do_a (); do_b (); ...
. (#264, @matthewelse)Ast_io
in order to allow reading AST values from binary
files (#270, @arozovyk)Feedback on this post is welcomed on Discuss!
We are happy to announce the release of opam 2.1.0.
Many new features made it in (see the pre-release changelogs or release notes for the details), but here are a few highlights.
opam-depext
plugin),
increasing their reliability as it integrates the solving stepopam-lock
plugin)option
and expanded var
subcommands)opam root
readability by newer and older versions, even if the format changedopam-update
, conflict messages, and many other
areasOpam has long included the ability to install system dependencies automatically via the depext plugin. This plugin has been promoted to a native feature of opam 2.1.0 onwards, giving the following benefits:
opam depext
, as opam always checks
depexts (there are options to disable this or automate it for CI use).
Installation of an opam package in a CI system is now as easy as opam install .
, without having to do the dance of opam pin add -n/depext/install
. Just
one command now for the common case!opam depext
stage and a
different solution for the opam install
stage, resulting in some depexts
missing.opam install mysql
will offer to install conf-mysql
and mysql
, but if you
have the MariaDB dev libraries installed, opam will offer to install
conf-mariadb
and mysql
.Hint: You can set OPAMCONFIRMLEVEL=unsafe-yes
or
--confirm-level=unsafe-yes
to launch non interactive system package commands.
When opam was first released, it had the mission of gathering together scattered OCaml source code to build a community repository. As time marches on, the size of the opam repository has grown tremendously to over 3000 unique packages with over 19500 unique versions. Opam looks at all these packages and is designed to solve for the best constraints for a given package, so your project can keep up with releases of your dependencies.
While this works well for libraries, we need a different strategy for projects
that need to test and ship using a fixed set of dependencies. To satisfy this
use case, opam 2.0.0 shipped with support for using project.opam.locked
files. These are normal opam files but with exact versions of dependencies. The
lock file can be used as simply as opam install . --locked
to have a
reproducible package installation.
With opam 2.1.0, the creation of lock files is also now integrated into the client:
opam lock
will create a .locked
file for your current switch and project,
that you can check into the repository.opam switch create . --locked
can be used by users to reproduce your
dependencies in a fresh switch.This lets a project simultaneously keep up with the latest dependencies (without lock files) while providing a stricter set for projects that need it (with lock files).
Hint: You can export the full configuration of a switch with opam switch export
new options, --full
to have all packages metadata included, and
--freeze
to freeze all VCS to their current commit.
In opam 2.0, when a switch is created the packages selected are put into the “base” of the switch. These packages are not normally considered for upgrade, in order to ease pressure on opam's solver. This was a much bigger concern early on in opam 2.0's development, but it is less of a problem with the default mccs solver.
However, it's a problem for system compilers. opam would detect that your
system compiler version had changed, but it's unable to upgrade the ocaml-system
package, unless you went through a slightly convoluted process with
--unlock-base
.
In opam 2.1, base packages have been replaced by switch invariants. The switch
invariant is a package formula which must be satisfied on every upgrade and
install. All existing switches' base packages could just be expressed as
package1 & package2 & package3
, etc., but opam 2.1 recognises many existing
patterns and simplifies them. Therefore, in most cases, the invariant will be
"ocaml-base-compiler" {= "4.11.1"}
, etc. This means that opam switch create my_switch ocaml-system
now creates a switch invariant of "ocaml-system"
rather than a specific version of the ocaml-system
package. If your system
OCaml package is updated, opam upgrade
will seamlessly switch to the new
package.
This also allows you to have switches which automatically install new point releases of OCaml. For example:
opam switch create ocaml-4.11 --formula='"ocaml-base-compiler" {>= "4.11.0" & < "4.12.0~"}' --repos=old=git+https://github.com/ocaml/opam-repository#a11299d81591
opam install utop
Creates a switch with OCaml 4.11.0 (the --repos=
was just to select a version
of opam-repository
from before 4.11.1 was released). Now issue:
opam repo set-url old git+https://github.com/ocaml/opam-repository
opam upgrade
Opam 2.1 will automatically offer to upgrade OCaml 4.11.1 along with a rebuild of the switch. There's not yet a clean CLI for specifying the formula, but we intend to iterate further on this with future opam releases so that there is an easier way of saying “install OCaml 4.11.x."
Hint: You can set up a default invariant that will apply for all new switches,
via a specific opamrc
. The default one is ocaml >= 4.05.0
Configuring opam is not a simple task: you need to use an opamrc
at init
stage, hack global/switch
config file, or use opam config var
for
additional variables. To ease that step, and permit a more consistent opam
config tweaking, a new command was added : opam option
.
For example:
opam option download-jobs
gives the global download-jobs
value (as it
exists only in global configuration)opam option jobs=6 --global
will set the number of parallel build
jobs opam is allowed to run (along with the associated jobs
variable)opam option depext-run-commands=false
disables the use of sudo
for
handling system dependencies. It will be replaced by a prompt to run the
installation commandsopam option depext-bypass=m4 --global
bypasses m4
system package check
globally, while opam option depext-bypass=m4 --switch myswitch
will only
bypass it in the selected switch.The command opam var
is extended with the same format, acting on switch and
global variables.
Hint: to revert your changes use opam option <field>=
, it will take its
default value.
A new --cli
switch was added to the first beta release, but it's only now
that it's being widely used. Opam is a complex enough system that sometimes bug
fixes need to change the semantics of some commands. For example:
opam show --file
needed to change behaviouropam config
was becoming cluttered and some things want to move to opam var
opam switch install 4.11.1
still works in opam 2.0, but it's really an opam
1.2.2 syntax.Changing the CLI is exceptionally painful since it can break scripts and tools
which themselves need to drive opam. CLI versioning is our attempt to solve
this. The feature is inspired by the (lang dune ...)
stanza in dune-project
files, which has allowed the Dune project to rename variables and alter
semantics without requiring every single package using Dune to upgrade their
dune
files on each release.
Now you can specify which version of opam you expected the command to be run
against. In day-to-day use of opam at the terminal, you wouldn't specify it,
so you'll get the latest version of the CLI. For example: opam var --global
is the same as opam var --cli=2.1 --global
. However, if you issue opam var --cli=2.0 --global
, you will have told it that --global
was added in 2.1, so it's
not available to you. You can see similar things with the renaming of opam upgrade --unlock-base
to opam upgrade --update-invariant
.
The intention is that --cli
should be used in scripts, user guides (e.g., blog
posts), and in software which calls opam. The only decision you have to take is
the oldest version of opam which you need to support. If your script is using
a new opam 2.1 feature (for example, opam switch create --formula=
) then you
simply don't support opam 2.0. If you need to support opam 2.0, then you can't
use --formula
and should use --packages
instead. Opam 2.0 does not have the
--cli
option, so for opam 2.0 instead of --cli=2.0
you should set the
environment variable OPAMCLI
to 2.0
. As with all opam command line
switches, OPAMCLI
is simply the equivalent of --cli
, which opam 2.1 will
pick-up but opam 2.0 will quietly ignore (and, as with other options, the
command line takes precedence over the environment).
Note that opam 2.1 sets OPAMCLI=2.0
when building packages, so on the rare
instances where you need to use the opam
command in a package build:
command (or in your build system), you must specify --cli=2.1
if you're
using new features.
Since 2.1.0~rc2, CLI versioning applies to opam environment variables. The previous behaviour was to ignore unknown or wrongly set environment variables. Now you will have a warning to let you know that the environment variable won't be handled by this version of opam.
To ensure not breaking compatibility of some widely used deprecated options,
a default CLI is introduced: when no CLI is specified, those deprecated
options are accepted. It concerns opam exec
and opam var
subcommands.
There's even more detail on this feature in our wiki. We're hoping that this feature will make it much easier in future releases for opam to make required changes and improvements to the CLI without breaking existing setups and tools.
Note: For opam libraries users, since 2.1 environment variable are no more loaded by the libraries, only by opam client. You need to load them explicitly.
opam root
Portabilityopam root
format changes during opam's life cycle. New fields are added or
removed, and new files are added. An older opam version sometimes can no longer
read an upgraded or newly created opam root
. opam root
format has been updated
to allow new versions of opam to indicate that the root may still be read by
older versions of the opam libraries. A plugin compiled against the 2.0.9 opam
libraries will therefore be able to read information about an opam 2.1 root
(plugins and tools compiled against 2.0.8 are unable to load opam 2.1.0 roots).
It is a read-only best effort access, any attempt to modify the opam root
fails.
Hint: for opam libraries users, you can safely load states with
OpamStateConfig
load functions.
Tremendous thanks to all involved people, who've developed, tested & retested, helped with issue reports, comments, feedback, etc...
In case you plan a possible rollback, you may want to first backup your
~/.opam
directory.
The upgrade instructions are unchanged:
Either from binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.1.0"
or download manually from the GitHub "Releases" page to your PATH.
Or from source, manually: see the instructions in the README.
You should then run:
opam init --reinit -ni
^
[#4736 @vzaliva]src_exts
and fix build compat with Dune 2.9.0 [#4754 @dra27]Feedback on this post is welcomed on Discuss!
We are pleased to announce the minor release of opam 2.0.9.
This new version contains some back-ported fixes.
OPAM_USER_PATH_RO
for adding a custom read-only directory to the sandbox [#4589, #4609]OPAMROOT
and OPAMSWITCH
now reflect the --root
and --switch
parameters in the package build [#4668]$TMPDIR
read-only, then sets the sandbox $TMPDIR
to a new separate tmpfs. Hardcoded /tmp
access no longer works if TMPDIR
points to another directory [#4589]DUNE_CACHE
in the sandbox script [#4535, fixing ocaml/dune#4166]PWD
read-write on remove actions [#4589]conf
[#4549]--compiler
when creating local switches [#4718]^
syntax to fix support for Fish 3.3.0+ [#4736]Installation instructions (unchanged):
From binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.0.9"
or download manually from the Github "Releases" page to your PATH. In this case, don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update you sandbox script.
From source, using opam:
opam update; opam install opam-devel
(then copy the opam binary to your PATH as explained, and don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update your sandbox script)
From source, manually: see the instructions in the README.
We hope you enjoy this new minor version, and remain open to bug reports and suggestions.
construct
that builds a list of possible terms when
called on a typed hole (#1318)refactor-open
improvements (#1313, #1314, #1366, #1372)
open Foo (* calling refactor-open qualify on this open *)
let _ = Foo.bar (* previously could result in [Dune__exe.Foo.bar] *)
unqualify
should not qualifyPersistent_env.Error
in Typemod.initial_env
(#1355)construct
command:
MerlinConstruct
. When several results are suggested, <c-i>
and <c-u>
can be use to change the depth of the recursive
construction. (#1318)merlin-locate-type
command:
MerlinLocateType
(#1359)construct
command:
merlin-construct
. (#1352)merlin-locate-type
command. (#1359)merlin--highlight
and various minor improvements
(#1367, @mattiase)construct
command (#1318)Oops, we went looking but didn't find the changelog for this release 🙈
begin%ext
syntax for infix opererator expressions (#1653, @gpetiot);;
tokens (#1688, @gpetiot)odoc-parser
instead of odoc
(#1683, #1713, @kit-ty-kate, @jonludlam, @julow).
The parser from odoc has been split from the main odoc package and put into its own package, odoc-parser
.tools/build-mingw64.sh
is provided to build a native Windows
binary of ocamlformat
using mingw64
toolchain under Cygwin.Additions
On behalf of the dune-release team I'm pleased to announce that we're releasing dune-release.1.5.0.
It has been quite a while since the last release so there are numerous changes and improvements in this one, along with a lot of bug fixes.
The two main new features in 1.5.0 are:
undraft
command that will undraft both and update the opam file's url.src
field accordingly. We believe this feature will prove helpful to maintainers of tools such as dune
which releases are often watched by distribution maintainers. Draft releases allow you to wait until you have opam-repository's CI approval to actually create a GH release that will notify anyone watching the repository.
This feature is still a bit experimental, we have ideas on how to improve it but we wanted to get a first version out to collect feedback on how it is used and what you folks expect from it.check
command that you can run ahead of a release to know if dune-release has all the information it needs in the repository, along with running the lint, build and test checks it normally runs after building the tarball.
We're aware that it can be frustrating to see dune-release fail right in the middle of the release process. We're trying to improve this situation and this is a first step in that direction.You can see the full changelog here
You'll note we also deprecated a few features such as delegates (as we announced in this post), opam 1.x and the --user
option and corresponding config file field.
This release is likely to be the last 1.x release of dune-release
except for important bug fixes as we'll start working on 2.0 soon.
Our main goals for 2.0 are to make the experience for github users as seemless as possible. We want the tool to do the right thing for those users without them having to configure anything. Delegates got in the way there and that's why we're removing them. We do care about our non github users and we've worked on making it as configurable as possible so that you can integrate it in your release workflow. The situation should already have improved quite a bit with this release as we fixed several bugs for non github hosted repositories. We want to make sure that these users will be happy with dune-release 2.0 as well. Hopefully in the future dune-release will support other release workflows such as handling gitlab hosted repositories but we want to make sure our main user base is happy with the tool before adding this.
We'll communicate a bit more on our plans for 2.0 in the next few months. Our hope is that it will hit opam before the end of this year.
We hope that you'll like this new version and wish you all successful and happy releases!
--no-auto-open
to the default command. It was previously only available for
dune-release opam
. (#374, @NathanReb)config create
subcommand to create a fresh configuration if you don't have one yet
(#373, @NathanReb)--local-repo
, --remote-repo
and --opam-repo
options to the default command,
they used to be only available for the opam
subcommand (#363, @NathanReb)--token
option to dune-release publish
and dune-release opam
commands
to specify a github token. This allows dune-release to be called through a Github
Actions workflow and use the github token through an environment variable.
(#284 #368, @gpetiot @NathanReb)--include-submodules
flag to dune-release
, dune-release bistro
or
dune-release distrib
(#300, @NathanReb)--draft
for dune-release publish
and dune-release opam submit
commands.
(#248, @gpetiot)check
to check the prerequisites of dune-release and
avoid starting a release process that couldn't be finished (#318, #351, @pitag-ha)--set-upstream
to ease any further
update of the PR (#350, @gpetiot)opam submit
instead of
reading the user separately. The information was redundant and could only lead to bugs
when unproperly set. (#372, @NathanReb).gitignore
, .gitattributes
and other such files from the archive.
(#299, @NathanReb)dune-release
must guess which URI to pass to git push
and may guess it wrong.
This change allows users to push the tag manually to avoid using that code. (#219, @Julow).git
/.hg
files and folders from the distrib
tarball (#300, @NathanReb)synopsis
instead of description
(#291, @kit-ty-kate)--user
CLI options and configuration field, they were redundant with
the remote-repo option and field and could be set unproperly, leading to bugs (#372, @NathanReb)dune-release publish
(#276, #302, @pitag-ha)dune-release distrib
, it was previously effectively ignored. Now
it is required to add a (name <name>)
stanza to
dune-project
. (#327, @lehy)opam submit
would look up a config file, even though all the required
information was provided on the command line. This would lead to starting the interactive
config creation quizz if that file did not exist which made it impossible to use it in a CI
for instance. (#373, @NathanReb)opam submit
would fail on non-github repositories if the user had no
configuration file (#372, @NathanReb)opam submit
preventing non-github users to create the opam-repo PR
via dune-release. (#359, @NathanReb)opam submit
would try to parse the custom URI provided through
--distrib-uri
as a github repo URI instead of using the dev-repo (#358, @NathanReb)--distrib-uri
option in dune-release opam pkg
.
It used to have lower precedence than the url file written by dune-release publish
and therefore made it impossible to overwrite it if needed. (#255, @NathanReb)dune-release opam pkg
where you would need
the regular dune-release generated archive to be around even though you specified
a custom distrib archive file. (#255, @NathanReb)url
file before filling the url.src
field. This fixes an issue that caused the url.src
field to be a multi-line string instead of single line. (#270, @gpetiot).
) at the
repository from the distrib archive (#298, @NathanReb)dune-release tag
cannot guess the project name (#319, @lehy)dune-release distrib
(#325, @lehy). Otherwise uncommitted changes to
dune-project would be silently ignored by dune-release distrib
.publish
: Fix the process of inferring user name and repo from the dev repo uri (#348, @pitag-ha)--force
was set or they are conf
packagesDear all, on behalf of the Dune team I'm pleased to announce the release of Dune 2.9.0. This is the last release on the Dune 2.x series and could be considered a maintenance release as it mostly consists on bug fixes and miscellaneous tweaks and features for sites, instrumentation, and mdx support.
Add (enabled_if ...)
to (mdx ...)
(https://github.com/ocaml/dune/pull/4434, @emillon)
Add support for instrumentation dependencies (https://github.com/ocaml/dune/pull/4210, fixes https://github.com/ocaml/dune/issues/3983, @nojb)
Add the possibility to use locks
with the cram tests stanza (https://github.com/ocaml/dune/pull/4480, @voodoos)
Allow to set up merlin in a variant of the default context (https://github.com/ocaml/dune/pull/4145, @TheLortex, @voodoos)
Add (package ...)
to (mdx ...)
(https://github.com/ocaml/dune/pull/4691, fixes https://github.com/ocaml/dune/issues/3756, @emillon)
Handle renaming of coq.kernel
library to coq-core.kernel
in Coq 8.14 (https://github.com/ocaml/dune/pull/4713, @proux01)
Fix generation of merlin configuration when using (include_subdirs unqualified)
on Windows (https://github.com/ocaml/dune/pull/4745, @nojb)
Fix bug for the install of Coq native files when using (include_subdirs qualified)
(https://github.com/ocaml/dune/pull/4753, @ejgallego)
Allow users to specify install target directories for doc
and
etc
sections. We add new options --docdir
and --etcdir
to both
Dune's configure and dune install
command. (https://github.com/ocaml/dune/pull/4744, fixes https://github.com/ocaml/dune/issues/4723,
@ejgallego, thanks to @JasonGross for reporting this issue)
Fix issue where Dune would ignore (env ... (coq (flags ...)))
declarations appearing in dune
files (https://github.com/ocaml/dune/pull/4749, fixes https://github.com/ocaml/dune/issues/4566, @ejgallego @rgrinberg)
Disable some warnings on Coq 8.14 and (lang coq (>= 0.3))
due to
the rework of the Coq "native" compilation system (https://github.com/ocaml/dune/pull/4760, @ejgallego)
Fix a bug where instrumentation flags would be added even if the instrumentatation was disabled (@nojb, https://github.com/ocaml/dune/pull/4770)
Fix https://github.com/ocaml/dune/issues/4682: option -p
takes now precedence on environement variable
DUNE_PROFILE
(https://github.com/ocaml/dune/pull/4730, https://github.com/ocaml/dune/pull/4774, @bobot, reported by @dra27 https://github.com/ocaml/dune/issues/4632)
Fix installation with opam of package with dune sites. The .install
file is
now produced by a local dune install
during the build phase (https://github.com/ocaml/dune/pull/4730, https://github.com/ocaml/dune/pull/4645,
@bobot, reported by @kit-ty-kate https://github.com/ocaml/dune/issues/4198)
Fix multiple issues in the sites feature (https://github.com/ocaml/dune/pull/4730, https://github.com/ocaml/dune/pull/4645 @bobot, reported by @Lelio-Brun https://github.com/ocaml/dune/issues/4219, by @Kakadu https://github.com/ocaml/dune/issues/4325, by @toots https://github.com/ocaml/dune/issues/4415)
Add sub-errors as "related" information in diagnostics (#457)
Add support for navigating to a symbol inside a workspace (#398)
Show typed holes as errors
Merlin has a concept of "typed holes" that are syntactically represented as _
. Files
that incorporate typed holes are not considered valid OCaml, but Merlin and OCaml-LSP
support them. One example when such typed holes can occur is when on "destructs" a value,
e.g., destructing (Some 1)
will generate code match Some 1 with Some _ -> _ | None -> _
. While the first underscore is a valid "match-all"/wildcard pattern, the rest of
underscores are typed holes.
Feedback on this post is welcomed on Discuss!
The opam team has great pleasure in announcing opam 2.1.0~rc2!
The focus since beta4 has been preparing for a world with more than one released version of opam (i.e. 2.0.x and 2.1.x). The release candidate extends CLI versioning further and, under the hood, includes a big change to the opam root format which allows new versions of opam to indicate that the root may still be read by older versions of the opam libraries. A plugin compiled against the 2.0.9 opam libraries will therefore be able to read information about an opam 2.1 root (plugins and tools compiled against 2.0.8 are unable to load opam 2.1.0 roots).
Please do take this release candidate for a spin! It is available in the Docker images at ocaml/opam on Docker Hub as the opam-2.1 command (or you can sudo ln -f /usr/bin/opam-2.1 /usr/bin/opam
in your Dockerfile
to switch to it permanently). The release candidate can also be tested via our installation script (see the wiki for more information).
Thank you to anyone who noticed the unannounced first release candidate and tried it out. Between tagging and what would have been announcing it, we discovered an issue with upgrading local switches from earlier alpha/beta releases, and so fixed that for this second release candidate.
Assuming no showstoppers, we plan to release opam 2.1.0 next week. The improvements made in 2.1.0 will allow for a much faster release cycle, and we look forward to posting about the 2.2.0 plans soon!
In case you plan a possible rollback, you may want to first backup your
~/.opam
directory.
The upgrade instructions are unchanged:
Either from binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.1.0~rc2"
or download manually from the Github "Releases" page to your PATH.
Or from source, manually: see the instructions in the README.
You should then run:
opam init --reinit -ni
We hope there won't be any, but please report any issues to the bug-tracker. Thanks for trying it out, and hoping you enjoy!
.ocamlinit
(@hyphenrf @copy #338)Emacs mode fixes:
utop-query-arguments
always returns (utop-arguments)
whether
it sets the utop-command or not (@dansanduleac #347)build-doc
, build-test
, make
flags [#4581 @rjbou]--confirm-level
and OPAMCONFIRMLEVEL
for automatic answering
[#4582 @rjbou - fix #4168; #4683 @dra27 - fix #4682; #4691 @rjbou - fix #4682]--no
[#4582 @rjbou]--with-0install-solver
option to the configure script to enable
the 'builtin-0install' solver [#4646 @kit-ty-kate]opam config
deprecated subcommands in the default CLI
[#4575 @rjbou - fix #4503]--cli
and OPAMCLI [#4655 @dra27]--root
and --switch
are now reflected in environment
variables when building packages so that calls to opam
during build access
the correct root and switch [#4668 @LasseBlaauwbroek]--confirm-level
for plugins calls/install [#4694 @rjbou].exe
on Windows [#4709 @dra27]default-invariant
config field, restore the 2.0 semantics for
default-compiler
[#4607 @AltGr]2.1~alpha/beta
,
and keep a light upgrade from 2.0
[#4638 @rjbou]stderr
[#4692 @AltGr]sys-ocaml-cc
, sys-ocaml-arch
, and sys-ocaml-libc
when no system
compiler installed [#4706 @dra27]Not_found
(config file) in config report [#4570 @rjbou]--deps-only
, set dependencies as root packages
[#4964 @rjbou - fix #4502].install
instead of the whole switch prefix when there are no install:
instructions
(and no preinstall commands)
[#4494 @kit-ty-kate @rjbou; #4667 @dra27 - fix #4422]opam list --silent
renamed to --check
[#4595 @dra27 - fix #4323]doc
field in opam-show
[#4567 @dra27 - partially fix #4565]switch
global variable resolving [#4685 @rjbou - fix #4684]hash
package variable resolving [#4687 @rjbou]--read-only
, --safe
, and --dryrun
[#4562 @rjbou - fix #4320]opam lock
consistent with opam install
. On local pin, always take
last opam file even if uncommitted [#4562 @rjbou - fix #4320]features
parser [#4507 @rjbou]hidden-version
to avoid-version
[#4527 @dra27]invariant
field as an option to
differentiate when it is not defined [#4638 @rjbou]Bad_version
exception, raised from OpamFormat.check_opam_version
[#4638 @rjbou]opam-version
field on files [#4638 @rjbou]opam-root-version
field as a marker for the whole
opam root [#4638 @rjbou - fix #4636]BestEffort
modules with reading functions that don't show
errors, given the opam_file_format
internal field [#4638 @rjbou - fix #4636]OPAMASSUMEDEPEXTS
,
OPAMNODEPEXTS
) [#4587 @AltGr]no
doesn't abort
installation [#4591 @AltGr]assume-depexts
related messages
[#4671 @AltGr - partial fix #4662]epel-release
is missing and unavailable, depexts are
detected [#4679 @dra27 fix #4669]config yes
automatic answering when asking confirmation to run
install commands [#4698 @rjbou - fix #4680]$TMPDIR
to a
separate TMPFs [#4589 @AltGr]PWD
read-write on
remove actions [#4589 @AltGr]sandbox_exec
[#4589 @AltGr]realpath
use for macOS, partial revert of #4589 [#4609 @AltGr]state.cache
to include the OpamVersion.magic()
string. All .cache
files are deleted if any cache file is written to, allowing multiple versions
of the library to coexist without constantly regenerating it
[#4642 @dra27 - fix #4554]0install
solver:
+count[version-lag,solution]
to always choose the oldest version available,
+removed
to not try to keep installed packages [#4631 @kit-ty-kate]opam-devel
's tests on platforms without OpenSSL, GNU-diff, and a
system-wide OCaml [#4500 @kit-ty-kate]reftests
[#4376 @emillon]extlib
and dose
version [#4517 @kit-ty-kate]opam-file-format.2.1.2
[#4495 @rjbou]opam-file-format.2.1.3+
in order to enforce opam-version: "2.1"
as first non-comment line [#4639 @dra27 - fix #4394]src_ext
[#4559 @AltGr]dune-project
file is presented in the parent
directory [#4545 @kit-ty-kate]dune-project
file is presented in the parent
directory [#4545 @kit-ty-kate - fix #4537]opam-devel.install
not to install two files called opam [#4664 @dra27]openssl
in make cold
[#4702 @rjbou]opam-devel
, they need the network [#4702 @rjbou]src_ext
for Dune and MCCS [#4704 @dra27]mk_tristate_opt
to mk_state_opt
[#4575 @rjbou]mk_state_opt
and rename to mk_enum_opt
[#4626 @rjbou]mk_enum_opt_all
for state flags that appears more than once
[#4582 @rjbou]opam exec
on native Windows when calling Cygwin executables
[#4588 @AltGr]OpamArg
into OpamArgTools
[#4606 @rjbou]cygpath
wrapper [#4625 @dra27]symlinks
when the root is upgraded
[#4641 @dra27 - partial fix for #4619]OpamVersion.is_dev_version
[#4665 @dra27]OpamStd.String.is_prefix_of
[#4694 @rjbou @dra27]OpamStd.Format.pretty_list
: last
argument dropped if list contains
more than 2 elements [#4694 @rjbou]stdin
(bash, zsh) [#4692 @AltGr]dune-gen
subcommand that generates testing code for Dune to build
and run with the new mdx
stanza. (#305, @voodoos)