OCaml Changelog

RSS

Read the latest releases and updates from the OCaml compiler, OCaml infrastructure and the OCaml Platform Tools.

Mdx 1.8.1

See full changelog

Changed

  • Dropped OMP dependency and use handwritten compat layers instead (#317, @NathanReb)

We are pleased to announce the minor release of opam 2.0.8.

This new version contains some backported fixes:

  • Critical for fish users! Don't add . to PATH. [#4078]
  • Fix sandbox script for newer ccache versions. [#4079 and #4087]
  • Fix sandbox crash when ~/.cache is a symlink. [#4068]
  • User modifications to the sandbox script are no longer overwritten by opam init. [#4020 & #4092]
  • macOS sandbox script always mounts /tmp read-write, regardless of TMPDIR [#3742, addressing ocaml/opam-repository#13339]
  • pre- and post-session hooks can now print to the console [#4359]
  • Switch-specific pre/post sessions hooks are now actually run [#4472]
  • Standalone opam-installer now correctly builds from sources [#4173]
  • Fix arch variable detection when using 32bit mode on ARM64 and i486 [#4462]

A more complete release note is available.


Installation instructions (unchanged):

  1. From binaries: run

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.0.8"
    

    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.

  2. 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 you sandbox script)

  3. 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.

NOTE: this article is cross-posted on opam.ocaml.org and ocamlpro.com, and published in discuss.ocaml.org. Please head to the latter for the comments!

Dune 2.8.2

See full changelog
  • Fixed wrong workspace discovery from dune ocaml-merlin (#4127, fixes #4125, @voodoos)

  • Fixed memory blow up introduced in 2.8.0 (#4144, fixes #4134, @jeremiedimino)

  • Configurator: always link the C libraries in the build command (#4088, @MisterDA).

Mdx 1.8.0

See full changelog

Added

  • Allow to explicitly set the kind of blocks in labels: ocaml, cram, toplevel or include. (#237, @gpetiot)
  • Include blocks do not require an empty block anymore (#286, @gpetiot)
  • Support for OCaml 4.12 (#298, @kit-ty-kate)

Changed

  • Improve error message of cram test exceptions due to empty lines in a block (#270, @pitag-ha)

Fixed

  • Report #require directive errors (#276, @gpetiot)
  • Handle no such file exception: the input file and the values of options --root and --prelude are checked (#292, @gpetiot)
  • Keep locations from parsing instead of recomputing the lines, providing better error messages (#241, @gpetiot)
  • Use create_process instead of execvp to call mdx-test from mdx. This fixes running mdx from dune on Windows (#299, @emillon)

Dune 2.8.1

See full changelog
  • Fixed dune --version printing n/a rather than the version

Dune 2.8.0

On behalf of the dune, I'm pleased to announce the release of dune 2.8.0. This release contains many bug fixes, performance improvements, and interesting new features. I'll point out two new features that I'm most excited about.

First is the experimental dune_site extension that makes it possible to register and load plugins at runtime. This feature is quite involved, but we've documented it extensively in the manual.

Another cool feature is that we've eliminated the need for .merlin files and all the caveats that came with them. Now, merlin talks to dune directly to get precise configuration for every module. Say goodbye to all those "approximate .merlin file" warnings!

I encourage everyone to upgrade as soon as possible, as earlier versions are not compatible with OCaml 4.12. Happy Hacking.

See full changelog
  • dune rules accepts aliases and other non-path rules (#4063, @mrmr1993)

  • Action (diff reference test_result) now accept reference to be absent and in that case consider that the reference is empty. Then running dune promote will create the reference file. (#3795, @bobot)

  • Ignore special files (BLK, CHR, FIFO, SOCKET), (#3570, fixes #3124, #3546, @ejgallego)

  • Experimental: Simplify loading of additional files (data or code) at runtime in programs by introducing specific installation sites. In particular it allow to define plugins to be installed in these sites. (#3104, #3794, fixes #1185, @bobot)

  • Move all temporary files created by dune to run actions to a single directory and make sure that actions executed by dune also use this directory by setting TMPDIR (or TEMP on Windows). (#3691, fixes #3422, @rgrinberg)

  • Fix bootstrap script with custom configuration. (#3757, fixes #3774, @marsam)

  • Add the executable field to inline_tests to customize the compilation flags of the test runner executable (#3747, fixes #3679, @lubegasimon)

  • Add (enabled_if ...) to (copy_files ...) (#3756, @nojb)

  • Make sure Dune cleans up the status line before exiting (#3767, fixes #3737, @alan-j-hu)

  • Add {gitlab,bitbucket} as options for defining project sources with source stanza (source (<host> user/repo)) in the dune-project file. (#3813, @rgrinberg)

  • Fix generation of META and dune-package files when some targets (byte, native, dynlink) are disabled. Previously, dune would generate all archives for regardless of settings. (#3829, #4041, @rgrinberg)

  • Do not run ocamldep to for single module executables & libraries. The dependency graph for such artifacts is trivial (#3847, @rgrinberg)

  • Fix cram tests inside vendored directories not being interpreted correctly. (#3860, fixes #3843, @rgrinberg)

  • Add package field to private libraries. This allows such libraries to be installed and to be usable by other public libraries in the same project (#3655, fixes #1017, @rgrinberg)

  • Fix the %{make} variable on Windows by only checking for a gmake binary on UNIX-like systems as a unrelated gmake binary might exist on Windows. (#3853, @kit-ty-kate)

  • Fix $ dune install modifying the build directory. This made the build directory unusable when $ sudo dune install modified permissions. (fix #3857, @rgrinberg)

  • Fix handling of aliases given on the command line (using the @ and @@ syntax) so as to correctly handle relative paths. (#3874, fixes #3850, @nojb)

  • Allow link time code generation to be used in preprocessing executable. This makes it possible to use the build info module inside the preprocessor. (#3848, fix #3848, @rgrinberg)

  • Correctly call git ls-tree so unicode files are not quoted, this fixes problems with dune subst in the presence of unicode files. Fixes #3219 (#3879, @ejgallego)

  • dune subst now accepts common command-line arguments such as --debug-backtraces (#3878, @ejgallego)

  • dune describe now also includes information about executables in addition to that of libraries. (#3892, #3895, @nojb)

  • instrumentation backends can now receive arguments via (instrumentation (backend <name> <args>)). (#3906, #3932, @nojb)

  • Tweak auto-formatting of dune files to improve readability. (#3928, @nojb)

  • Add a switch argument to opam when context is not default. (#3951, @tmattio)

  • Avoid pager when running $ git diff (#3912, @AltGr)

  • Add (root_module ..) field to libraries & executables. This makes it possible to use library dependencies shadowed by local modules (#3825, @rgrinberg)

  • Allow (formatting ...) field in (env ...) stanza to set per-directory formatting specification. (#3942, @nojb)

  • [coq] In coq.theory, :standard for the flags field now uses the flags set in env profile flags (#3931 , @ejgallego @rgrinberg)

  • [coq] Add -q flag to :standard coqc flags , fixes #3924, (#3931 , @ejgallego)

  • Add support for Coq's native compute compilation mode (@ejgallego, #3210)

  • Add a SUFFIX directive in .merlin files for each dialect with no preprocessing, to let merlin know of additional file extensions (#3977, @vouillon)

  • Stop promoting .merlin files. Write per-stanza Merlin configurations in binary form. Add a new subcommand dune ocaml-merlin that Merlin can use to query the configuration files. The allow_approximate_merlin option is now useless and deprecated. Dune now conflicts with merlin < 3.4.0 and ocaml-lsp-server < 1.3.0 (#3554, @voodoos)

  • Configurator: fix a bug introduced in 2.6.0 where the configurator V1 API doesn't work at all when used outside of dune. (#4046, @aalekseyev)

  • Fix libexec and libexec-private variables. In cross-compilation settings, they now point to the file in the host context. (#4058, fixes #4057, @TheLortex)

  • When running $ dune subst, use project metadata as a fallback when package metadata is missing. We also generate a warning when (name ..) is missing in dune-project files to avoid failures in production builds.

  • Remove support for passing -nodynlink for executables. It was bypassed in most cases and not correct in other cases in particular on arm32. (#4085, fixes #4069, fixes #2527, @emillon)

  • Generate archive rules compatible with 4.12. Dune longer attempt to generate an archive file if it's unnecessary (#3973, fixes #3766, @rgrinberg)

  • Fix generated Merlin configurations when multiple preprocessors are defined for different modules in the same folder. (#4092, fixes #2596, #1212 and #3409, @voodoos)

  • Add the option use_standard_c_and_cxx_flags to dune-project that 1. disables the unconditional use of the ocamlc_cflags and ocamlc_cppflags from ocamlc -config in C compiler calls, these flags will be present in the :standard set instead; and 2. enables the detection of the C compiler family and populates the :standard set of flags with common default values when building CXX stubs. (#3875, #3802, fix #3718 and #3528, @voodoos)

See full changelog
  • Drop Github token generation feature, no longer supported by Github API.
  • Use newer github library, avoiding warning with deprecated authentication method
  • Allow publication of packages without URL (for conf packages)
  • Added flag --no-browser to disable browser popup
  • Fix detection of package names when specifying opam file names on the command-line

On behalf of the ocaml-lsp team, it is my pleasure to announce version 1.4.0. This release introduces support for automatic signature help. Signature help is not yet present in all possible contexts. We intend to improve to support as many relevant language constructs as possible in the future. Many thanks to @mnxn for implementing this feature.

The full change log is replicated at the end of this post for your convenience.

Happy Holidays!

See full changelog

Features

  • Support cancellation notifications when possible. (#323)

  • Implement signature help request for functions (#324)

  • Server LSP requests & notifications concurrently. Requests that require merlin are still serialized. (#330)

On behalf of the ocaml-lsp team, I’d like to announce version 1.3.0.

This release an improvement in keyword completion and a new code action. Keywords are now filtered by the context the user requested the completion, and there’s a new code action to quickly populate .mli files with the the inferred types from the .ml file.

See full changelog

Features

  • Code action to insert inferred module interface (#308)

  • Filter keywords by context (#307)

On behalf of the ocaml-lsp team, I’d like to announce version 1.2.0.

This version contains many bug fixes and some performance improvements A couple of interesting features made it in as well:

  • Auto-completion of OCaml keywords (not available for reason)
  • The ability to jump to the declaration of a value in the .mli.
See full changelog

Features

  • Add keyword completion

  • Add go to declaration functionality to jump to a value's specification in a .mli file (#294)

Fixes

  • #245: correctly use mutexes on OpenBSD (#264)

  • #268: Do not use vendored libraries when building the lsp package (#260)

  • #271: Clear diagnostics when files are closed

  • Disable non-prefix completion. There's no reliably way to trigger it and it can be slow.

See full changelog

Removed

  • Remove the 'escape-chars' option, deprecated since 0.14.0 (#1462, @gpetiot)
  • Remove the 'escape-strings' option, deprecated since 0.14.0 (#1463, @gpetiot)
  • Remove the 'doc-comments-val' option, deprecated since 0.14.2 (#1461, @gpetiot)
  • Removed options are now listed in the commandline manual (new REMOVED OPTIONS section) (#1469, @Julow)

Changes

  • Set 'indicate-multiline-delimiters=no' on default profile (#1452, @gpetiot)
  • Option 'let-open' is now deprecated, concrete syntax will always be preserved starting from OCamlFormat v0.17.0, corresponding to the current 'let-open=preserve' behavior. (#1467, @gpetiot)
  • Warnings printed by ocamlformat itself now use the 4.12 style with symbolic names (#1511, #1518, @emillon)
  • Remove extension from executable name in error messages. On Windows, this means that messages now start with "ocamlformat: ..." instead of "ocamlformat.exe: ..." (#1531, @emillon)
  • Using tokens instead of string manipulation when inspecting the original source (#1526, #1533, #1541 @hhugo) (#1532, @gpetiot)

Bug fixes

  • Allow a break after if%ext with if-then-else=keyword-first (#1419, #1543, @gpetiot)
  • Fix parentheses around infix applications having attributes (#1464, @gpetiot)
  • Fix parentheses around the index arg of a non-sugared index operation (#1465, @gpetiot)
  • Preserve comment position around match and try keywords (#1458, @gpetiot)
  • Add missing break in module statement (#1431, @gpetiot)
  • Indent attributes attached to included modules better (#1468, @gpetiot)
  • Clean up ocamlformat.el for submission to MELPA (#1476, #1495, @bcc32)
    • Added missing package metadata to ocamlformat.el (#1474, @bcc32)
    • Fix ocamlformat.el buffer replacement for MacOS Emacs (#1481, @juxd)
  • Add missing parentheses around a pattern matching that is the left-hand part of a sequence when an attribute is attached (#1483, @gpetiot)
  • Add missing parentheses around infix operator used to build a function (#1486, @gpetiot)
  • Fix comments around desugared expression (#1487, @gpetiot)
  • Fix invalid fragment delimiters of format-invalid-files recovery mode (#1485, @hhugo)
  • Fix misalignment of cases in docked function match (#1498, @gpetiot)
  • Preserve short-form extensions for structure item extensions (#1502, @gpetiot). For example open%ext M will not get rewritten to [%%ext open M].
  • Do not change the spaces within the code spans in docstrings (#1499, @gpetiot)
  • Comments of type constrained label in record pattern have to be relocated in 4.12 (#1517, @gpetiot)
  • Preserve functor syntax for OCaml 4.12 (#1514, @gpetiot)
  • Fix inconsistencies of the closing parentheses with indicate-multiline-delimiters (#1377, #1540, @gpetiot)
  • Fix position of comments around list constructor (::) (#1524, @gpetiot)
  • Fix comments position in extensions (#1525, @gpetiot)
  • Fix formatting of field override with constraint (#1544, @gpetiot)
See full changelog
  • merlin binary
    • simplify local store implementation and API (#1188, #1184)
    • fix a destruct issue allowing ill-typed match completions (#1194)

Odoc 1.5.2

See full changelog

Additions

  • Compatibility with OCaml 4.12 (ocaml/odoc#531, @Octachron)
See full changelog

Internal

  • Use ppxlib instead of ocaml-migrate-parsetree 1.x. (#1482, @emillon)
    • No functional changes are expected.
    • Cherry picked commits: 219dc1e3a4614041e1bc5428d003c0af4e, 9e453b0ef87124e33827ee2423289deef8, 7ad1e575ffa4ce3022c71daba39954d3b9, eb49db6772a9adabe611982000465d0ad7, dc79052a085950cd88fdef0843f665a029, c06c544e21bd65b726cde8fee0f78a6248, ce94d2fa50ff276b5782070375a0b30ba1
See full changelog
  • dot-merlin-reader
    • fix issue when multiple packages with pxxes are declared in the configuration. (#1181, fixes #1179)
See full changelog
  • merlin binary
    • fix completion of pattern matchings with exception patterns (#1169)
    • delegate configuration reading to external programs via a simple protocol and create a new package dot-merlin-reader with a binary that reads .merlin files. (#1123, #1152)

Dune 2.7.1

See full changelog
  • configurator: More flexible probing of #define. We allow duplicate values in the object file, as long as they are the same after parsing. (#3739, fixes #3736, @rgrinberg)

  • Record instrumentation backends in dune-package files. This makes it possible to use instrumentation backends defined in installed libraries (eg via OPAM). (#3735, @nojb)

  • Add missing .aux & .glob targets to coq rules (#3721, fixes #3437, @rgrinberg)

  • Fix dune-package installation when META templates are present (#3743, fixes #3746, @rgrinberg)

  • Resolve symlinks before running $ git diff (#3750, fixes #3740, @rgrinberg)

  • Cram tests: when checking that all test directories contain a run.t file, skip empty directories. These can be left around by git. (#3753, @emillon)

See full changelog

Oops, we went looking but didn't find the changelog for this release 🙈

See full changelog
  • merlin binary
    • dune: restore compatibility with dune 1.8.0 (#1157, #1153)

Dune 2.7.0

On behalf of the dune team, I'm pleased to announce the release of dune 2.7.0. This release adds a couple of important features and many bug fixes. I'll just briefly summarize the two features, and let our improved documentation elaborate on the details.

The first one is first class support for instrumentation tools such as bisect_ppx and landmarks. This is one of the most requested dune features ever, and we're pleased to show you all what we've come up with

Special thanks to @stephanieyou & @nojb for implementing this feature. Many thanks to @aantron for tirelessly iterating on the end user experience with us.

While the features is looking quite good already, we consider it a "first take" on this subject. We welcome your experience reports and feature requests.

The second feature we're introducing this release is dune's cram testing framework. The cram framework is our secret weapon for making dune (relatively) bug free. I'll soon write up a dedicated post to give you a flavour of how it works. To those who can't wait, there's a new section in the documentation that explains everything.

As always, the change log is replicated below for your convenience.

Happy Hacking.

See full changelog
  • Write intermediate files in a .mdx folder for each mdx stanza to prevent the corresponding actions to be executed as part of the @all alias (#3659, @NathanReb)

  • Read Coq flags from env (#3547 , fixes #3486, @gares)

  • Allow bisect_ppx to be enabled/disabled via dune-workspace. (#3404, @stephanieyou)

  • Formatting of dune files is now done in the executing dune process instead of in a separate process. (#3536, @nojb)

  • Add a --debug-artifact-substution flag to help debug problem with version not being captured by dune-build-info (#3589, @jeremiedimino)

  • Allow the use of the context_name variable in the enabled_if fields of executable(s) and install stanzas. (#3568, fixes #3566, @voodoos)

  • Fix compatibility with OCaml 4.12.0 when compiling empty archives; no .a file is generated. (#3576, @dra27)

  • $ dune utop no longer tries to load optional libraries that are unavailable (#3612, fixes #3188, @anuragsoni)

  • Fix dune-build-info on 4.10.0+flambda (#3599, @emillon, @jeremiedimino).

  • Allow multiple libraries with inline_tests to be defined in the same directory (#3621, @rgrinberg)

  • Run exit hooks in jsoo separate compilation mode (#3626, fixes #3622, @rgrinberg)

  • Add (alias ...), (mode ...) fields to (copy_fields ...) stanza (#3631, @nojb)

  • (copy_files ...) now supports copying files from outside the workspace using absolute file names (#3639, @nojb)

  • Dune does not use ocamlc as an intermediary to call C compiler anymore. Configuration flags ocamlc_cflags and ocamlc_cppflags are always prepended to the compiler arguments. (#3565, fixes #3346, @voodoos)

  • Revert the build optimization in #2268. This optimization slows down building individual executables when they're part of an executables stanza group (#3644, @rgrinberg)

  • Use {dev} rather than {pinned} in the generated .opam file. (#3647, @kit-ty-kate)

  • Insert correct extension name when editing dune-project files. Previously, dune would just insert the stanza name. (#3649, fixes #3624, @rgrinberg)

  • Fix crash when evaluating an mdx stanza that depends on unavailable packages. (#3650, @CraigFe)

  • Fix typo in cache-check-probablity field in dune config files. This field now requires 2.7 as it wasn't usable before this version. (#3652, @edwintorok)

  • Add "odoc" {with-doc} to the dependencies in the generated .opam files. (#3667, @kit-ty-kate)

  • Do not allow user actions to capture dune's stdin (#3677, fixes #3672, @rgrinberg)

  • (subdir ...) stanzas can now appear in dune files used via (include ...). (#3676, @nojb)

See full changelog

Changes

  • Do not break inline elements such as {i blah} in docstrings (#1346, @jberdine)
  • Distinguish hash-getter from hash-comparison infix operators. Operators of the form #**# or #**. where ** can be 0 or more operator chars are considered getter operators and are not surrounded by spaces, as opposed to regular infix operators (#1376, @gpetiot)
  • Type constraint on return type of functions is now always printed before the function body (#1381, #1397, @gpetiot)

Bug fixes

  • Restore previous functionality for pre-post extension points (#1342, @jberdine)
  • Fix extra break before function body of a fun (#1343, @jberdine)
  • Indent further args of anonymous functions (#1440, @gpetiot)
  • Do not clear the emacs *compilation* buffer on successful reformat (#1350, @jberdine)
  • Fix disabling with attributes on OCaml < 4.08 (#1322, @emillon)
  • Preserve unwrapped comments by not adding artificial breaks when wrap-comments=false and ocp-indent-compat=true are set to avoid interfering with ocp-indent indentation. (#1352, @gpetiot)
  • Break long literal strings at the margin (#1367, @gpetiot)
  • Break after a multiline argument in an argument list (#1360, @gpetiot)
  • Remove unnecessary parens around object (#1379, @gpetiot)
  • Fix placement of comments on constants (#1383, @gpetiot)
  • Do not escape arguments of some Odoc tags (#1391, 1408, @gpetiot, @Julow). The characters []{} must not be escaped in the arguments of @raise, @author, @version and others.
  • Fix missing open line between multi-line let-binding with poly-typexpr (#1372, @jberdine)
  • Remove trailing space after expression when followed by an attribute and break before attributes attached to multi-line phrases (#1382, @gpetiot)
  • Do not add a space to minimal comments (* *), (** *) and (*$ *) (#1407, @gpetiot)
  • Fix attributes position in labelled arguments type (#1434, @gpetiot)
  • Add missing parens around type annotation in anonymous function (#1433, @gpetiot)
  • Fix alignment of 'then' keyword in parenthesised expression (#1421, @gpetiot)

New features

  • Support quoted extensions (added in ocaml 4.11) (#1405, @gpetiot)
  • Recognise eliom file extensions (#1430, @jrochel)

Dune 2.6.2

See full changelog
  • Fix compatibility with OCaml 4.12 (#3585, fixes #3583, @ejgallego)
See full changelog

Changes

  • No functional changes from 0.14.2. The goal of this release is to be compatible with base and stdio v0.14.0.
  • Backport the following PRs:
    • Update opam metadata (#1386)
    • Add compatibility with base.v0.14.0 (#1396)
    • Allow stdio.v0.14 (#1399)

Mdx 1.7.0

See full changelog

Added

  • HTML comments can carry block labels (#234, @gpetiot) The syntax is: <!-- $MDX labels -->, where labels is a list of valid labels separated by a comma. This line has to immediately precede the block it is attached to. The legacy syntax is preserved and will be deprecated in a later release.
  • Add support for toplevel blocks in .mli files' doc comments (#206, @jsomers)
  • Add support for OCaml 4.11 (#261, @kit-ty-kate)

Changed

  • Apply unnamed preludes to all environments (#271, @gpetiot) New behavior:
    • env_and_file "a:f" associates f to the environment named a
    • env_and_file " :f" associates f to the default environment
    • env_and_file "f" associates f to all environments.
  • Errors in non toplevel OCaml blocks are now printed to a seperate mdx-error code block following the ocaml block instead of crashing the mdx process. Those mdx-error blocks are recognized and checked by mdx and can be intentionally used to show case specific compile errors. (#238, @gpetiot)
  • Improve error reporting for invalid (* $MDX part-... *) delimiters (#250, @gpetiot)

Deprecated

  • The command 'mdx rule' is deprecated and will be removed in 2.0.0 (#251, @gpetiot)

Fixed

  • Fix the environment selection for preludes and slightly improve quality of type names in evaluations of toplevel phrases in certain cases. (#225, @gpetiot)
  • Fix toplevel parsing when phrases contain tabs (#240, @gpetiot)
  • Avoid adding newlines to empty blocks (#253, @gpetiot)
  • Preserve the indentation of included files (#259, @gpetiot)
  • Preserve the header in shell blocks (#249, @craigfe)
  • Support underscores in environment variables in set- and unset- labels (#257, @shonfeder)
  • Fix mdx on Windows which was looking for the ocaml-mdx-test binary at the wrong place (#263, @hcarty)
  • Properly report mdx parsing errors instead of crashing with an uncaught exception (#267, @gpetiot)
See full changelog

Added

  • Add a dune-release config subcommand to display and edit the global configuration (#220, @NathanReb).
  • Add command delegate-info to print information needed by external release scripts (#221, @pitag-ha)
  • Use Curly instead of Cmd to interact with github (#202, @gpetiot)
  • Add x-commit-hash field to the opam file when releasing (#224, @gpetiot)
  • Add support for common alternative names for the license and ChangeLog file (#204, @paurkedal)

Changed

  • Command tag: improve error and log messages by comparing the provided commit with the commit correspondent to the provided tag (#226, @pitag-ha)
  • Error logs: when an external command fails, include its error message in the error message posted by dune-release (#231, @pitag-ha)
  • Error log formatting: avoid unnecessary line-breaks; indent only slightly in multi-lines (#234, @pitag-ha)
  • Linting step of dune-release distrib does not fail when opam's doc field is missing. Do not try to generate nor publish the documentation when opam's doc field is missing. (#235, @gpetiot)

Deprecated

  • Deprecate opam 1.x (#195, @gpetiot)

Fixed

  • Separate packages names by spaces in publish logs (#171, @hannesm)
  • Fix uncaught exceptions in distrib subcommand and replace them with proper error messages (#176, @gpetiot)
  • Use the 'user' field in the configuration before inferring it from repo URI and handles HTTPS URIs (#183, @gpetiot)
  • Ignore backup files when looking for README, CHANGES and LICENSE files (#194, @gpetiot)
  • Do not echo input characters when reading token (#199, @gpetiot)
  • Improve the output of VCS command errors (#193, @gpetiot)
  • Better error handling when checking opam version (#195, @gpetiot)
  • Do not write 'version' and 'name' fields in opam file (#200, @gpetiot)
  • Use Yojson to parse github json response and avoid parsing bugs. (#177, @gpetiot)
  • The git command used in publish doc should check DUNE_RELEASE_GIT (even if deprecated) before PATH. (#242, @gpetiot)
  • Adapt the docs to the removal of the log subcommand (#196, @gpetiot)

Dune 2.6.1

See full changelog
  • Fix crash when caching is enabled (@rgrinberg, #3581, fixes #3580)

  • Do not use -output-complete-exe until 4.10.1 as it is broken in 4.10.0 (@jeremiedimino, #3187)

  • Fix crash when an unknown pform is found (such as %{unknown}) (#3560, @emillon)

  • Improve error message when invalid package names (such as the empty string) are passed to dune build -p. (#3561, @emillon)

  • Fix a stack overflow when displaying large outputs (including diffs) (#3537, fixes #2767, #3490, @emillon)

  • Pass -g when compiling ppx preprocessors (#3671, @rgrinberg)

Odoc 1.5.1

See full changelog

Additions

  • Compatibility with OCaml 4.11 (#434, @kit-ty-kate)
See full changelog
  • merlin binary
    • dune: remove duplicated rules for profile=release (#1143)
  • test suite
    • fix a test that required Dune 2.5 (#1146)
    • fix another test that lacked reproducibility (#1146)
See full changelog
  • ocaml support
    • alerts are no-more ignored and are reported as warnings (#1138)
  • merlin binary
    • fix completion of names containing - (#1142)
    • fix several type-enclosing bugs by performing context-analysis (#1108)
    • lsp: add deprecation flag to outline items (#1087)
    • lsp: add go-to typedef (Locate_type) (#1067)

Dune 2.6.0

See full changelog
  • Fix a bug where valid lib names in dune init exec --libs=lib1,lib2 results in an error. (#3444, fix #3443, @bikallem)

  • Add and enabled_ if field to the install stanza. Enforce the same variable restrictions for enabled_if fields in the executable and install stanzas than in the library stanza. When using dune lang < 2.6, the usage of forbidden variables in executables stanzas with only trigger a warning to maintain compatibility. (#3408 and #3496, fixes #3354, @voodoos)

  • Insert a constraint one the version of dune when the user explicitly specify the dependency on dune in the dune-project file (#3434 , fixes #3427, @diml)

  • Generate correct META files for sub-libraries (of the form lib.foo) that contain .js runtime files. (#3445, @hhugo)

  • Add a (no-infer ...) action that prevents inference of targets and dependencies in actions. (#3456, fixes #2006, @roddyyaga)

  • Correctly infer targets for the diff? action. (#3457, fixes #2990, @greedy)

  • Fix $ dune print-rules crashing (#3459, fixes #3440, @rgrinberg)

  • Simplify js_of_ocaml rules using js_of_ocaml.3.6 (#3375, @hhugo)

  • Add a new ocaml-merlin subcommand that can be used by Merlin to get configuration directly from dune instead of using .merlin files. (#3395, @voodoos)

  • Remove experimental variants feature and make default implementations part of the language (#3491, fixes #3483, @rgrinberg)

Utop 2.6.0

See full changelog
  • compatible with OCaml 4.11 (@kit-ty-kate, #322)
  • switch to the new parser exposed since 4.11
  • Vi edit mode: register support
See full changelog

Changes

  • Merge doc-comments-val option with doc-comments. The placement of documentation comments on val and external items is now controled by doc-comments.
    • doc-comments=after becomes doc-comments=after-when-possible to take into account the technical limitations of ocamlformat;
    • doc-comments=before is unchanged;
    • doc-comments-val is now replaced with doc-comments. To reproduce the former behaviors
      • doc-comments=before + doc-comments-val=before: now use doc-comments=before;
      • doc-comments=before + doc-comments-val=after: now use doc-comments=before-except-val;
      • doc-comments=after + doc-comments-val=before: this behavior did not make much sense and is not available anymore;
      • doc-comments=after + doc-comments-val=after: now use doc-comments=after-when-possible. (#1358, @jberdine, @Julow, @gpetiot). This reverts changes introduced in 0.14.1 (#1335) and 0.14.0 (#1012).

Utop 2.5.0

See full changelog

Additions

  • add #edit_mode_vi and #edit_mode_default mode to set the editing mode(@kandu)
  • Backport the #use_output directive (@diml, #313)

General

  • Load init file from ~/.config/utop/init.ml as per XDG conventions (@copy, #144)
  • Add OCaml 4.09 and 4.10 to the CI matrix (@kit-ty-kate, #310)
  • Add documentation for dune utop usage in emacs (@samarthkishor, #307)

We are pleased to announce the minor release of opam 2.0.7.

This new version contains backported small fixes:


Installation instructions (unchanged):

  1. From binaries: run

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.0.7"
    

    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.

  2. 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 you sandbox script)

  3. 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.

NOTE: this article is cross-posted on opam.ocaml.org and ocamlpro.com. Please head to the latter for the comments!

Dune 2.5.1

See full changelog
  • [coq] Fix install .v files for Coq theories (#3384, @lthms)

  • [coq] Fix install path for theory names with level greater than 1 (#3358, @ejgallego)

  • Fix a bug introduced in 2.0.0 where the [locks] field in rules with no targets had no effect. (@aalekseyev, report by @craigfe)

See full changelog
  • ocaml support
    • full support from OCaml 4.02 to OCaml 4.10 (#1117, #1127)
    • fix desynchronized cache (#1120)
    • short path for OCaml 4.09 and OCaml 4.10 (#1082, #1117)
    • catch and test environment initialization errors (#1083, #1130)
    • restore type levels after recovery (#1092)
  • merlin binary
    • fix syntax errors in 4.08 and 4.09 (#1081)
    • complete-prefix command accepts -kind option to filter results (#1071)
    • code cleanup (#1093, #1079, #1112)
    • better handling of expression and pattern extra nodes during browse tree traversal (#1091, #1121)
    • improve context detection (e.g. appropriate namespace for lookup) for various queries (#1104, #1110)
    • add stdlib to locate source path (#1085)
  • editor modes
    • vim: tweak heuristic to select python version (#1111)
    • emacs: marlin/call
    • lsp: move server to its own repository (#1069), https://github.com/ocaml/ocaml-lsp
  • test suite
    • dune rules for the test suite are now generated, deterministic and can be run individually (#1068, #1070, #1072)
    • fix incorrect command-line arguments in tests (#1073)
    • better coverage of frontend features (#1075, #1078, #1088, #1089, #1126)
  • Build no longer relies on implicit transitive_deps (#1065).
See full changelog

Changes

  • The default for doc-comments is changed to after (#1335, @Julow). This reverts a change introduced in 0.14.0 (#1012).
  • Revert deprecation of the doc-comments option (#1331, @Julow). This reverts a change introduced in 0.14.0 (#1293).

Dune 2.5.0

The dune team is pleased to announce the release of dune 2.5.0. This release has been brewing for a while and contains a few interesting features. I'll highlight some of the bigger ones:

  • The coq support has been thoroughly extended. There's now support for both composition of coq libraries in the same workspace and extraction of coq code to OCaml.

  • There's a new $ dune upgrade subcommand to help you upgrade dune files from 1.x to 2.x

  • $ dune utop will now load ppx preprocessors to the toplevel. Ppx authors might enjoy this style of interactive development.

  • There's a new (subdir ..) stanza that can be used to evaluate stanzas in sub directories. This makes it possible to have a single dune file for an entire project (generated or not).

I'd like to thank everyone who contributed to dune 2.5.0. Your help is greatly appreciated.

See full changelog
  • Add a --release option meaning the same as -p but without the package filtering. This is useful for custom dune invocation in opam files where we don't want -p (#3260, @jeremiedimino)

  • Fix a bug introduced in 2.4.0 causing .bc programs to be built with -custom by default (#3269, fixes #3262, @jeremiedimino)

  • Allow contexts to be defined with local switches in workspace files (#3265, fix #3264, @rgrinberg)

  • Delay expansion errors until the rule is used to build something (#3261, fix #3252, @rgrinberg, @jeremiedimino)

  • [coq] Support for theory dependencies and compositional builds using new field (theories ...) (#2053, @ejgallego, @rgrinberg)

  • From now on, each version of a syntax extension must be explicitely tied to a minimum version of the dune language. Inconsistent versions in a dune-project will trigger a warning for version <=2.4 and an error for versions >2.4 of the dune language. (#3270, fixes #2957, @voodoos)

  • [coq] Bump coq lang version to 0.2. New coq features presented this release require this version of the coq lang. (#3283, @ejgallego)

  • Prevent installation of public executables disabled using the enabled_if field. Installation will now simply skip such executables instead of raising an error. (#3195, @voodoos)

  • dune upgrade will now try to upgrade projects using versions <2.0 to version 2.0 of the dune language. (#3174, @voodoos)

  • Add a top command to integrate dune with any toplevel, not just utop. It is meant to be used with the new #use_output directive of OCaml 4.11 (#2952, @mbernat, @jeremiedimino)

  • Allow per-package version in generated opam files (#3287, @toots)

  • [coq] Introduce the coq.extraction stanza. It can be used to extract OCaml sources (#3299, fixes #2178, @rgrinberg)

  • Load ppx rewriters in dune utop and add pps field to toplevel stanza. Ppx extensions will now be usable in the toplevel (#3266, fixes #346, @stephanieyou)

  • Add a (subdir ..) stanza to allow evaluating stanzas in sub directories. (#3268, @rgrinberg)

  • Fix a bug preventing one from running inline tests in multiple modes (#3352, @jeremiedimino)

  • Allow the use of the %{profile} variable in the enabled_if field of the library stanza. (#3344, @mrmr1993)

  • Allow the use of %{ocaml_version} variable in enabled_if field of the library stanza. (#3339, @voodoos)

  • Fix dune build freezing on MacOS when cache is enabled. (#3249, fixes ##2973, @artempyanykh)

See full changelog

New features

  • Add an option --format-invalid-files to print unparsable parts of the input as verbatim text. This feature is still experimental. (#1026, @gpetiot)
  • Support multi-indices extended indexing operators (#1279, #1277, @Julow, @gpetiot). This feature has been added in OCaml 4.10.0
  • Handle OCaml 4.10.0 AST (#1276, @gpetiot)
  • Preserve functor syntax for consistency (#1312, @gpetiot). Previously both functor syntax: module M = functor (K : S) -> struct end and module M (K : S) = struct end would be formatted as the latter, the original syntax is now preserved.

Changes

  • Add the option doc-comments-val=before|after (#1012, @Julow). This option set the placement of documentation comment on val and external only. It is set to after by default.
  • The default for doc-comments is changed from after to before (#1012, #1325, @Julow). This affects both conventional (default) and ocamlformat profiles.
  • Some options are now deprecated:
    • doc-comments (#1293, #1012). This option depends on a flawed heuristic. It is replaced by doc-comments-val for val and external declarations. There is no equivalent to this option in the general case.
    • escape-chars, escape-strings and extension-sugar (#1293). These options are rarely used and their default behavior is considered to be the right behavior.
  • Add space between row_field attributes and the label or arguments, to be consistent with the non-polymorphic case. (#1299, @CraigFe)

Bug fixes

  • Fix missing parentheses around let open (#1229, @Julow). eg. M.f (M.(x) [@attr]) would be formatted to M.f M.(x) [@attr], which would crash OCamlformat
  • Remove unecessary parentheses with attributes in some structure items:
    • extensions and eval items (#1230, @Julow). eg. the expression [%ext (() [@attr])] or the structure item (() [@attr]) ;;
    • let _ = ... constructs (#1244, @emillon)
  • Fix some bugs related to comments:
    • after a function on the rhs of an infix (#1231, @Julow). eg. the comment in (x >>= fun y -> y (* A *)) would be dropped
    • in module unpack (#1309, @Julow). eg. in the module expression module M = (val x : S (* A *))
  • Fix formatting of empty signature payload [%a:] (#1236, @emillon)
  • Fix parenthesizing when accessing field of construct application (#1247, @gpetiot)
  • Fix formatting of attributes on object overrides {< >} (#1238, @emillon)
  • Fix attributes on coercion (#1239, @emillon)
  • Fix formatting of attributes on packed modules (#1243, @emillon)
  • Fix parens around binop operations with attributes (#1252, #1306, @gpetiot, @CraigFe)
  • Remove unecessary parentheses in the argument of indexing operators (#1280, @Julow)
  • Retain attributes on various AST nodes:
    • field set expressions, e.g. (a.x <- b) [@a] (#1284, @CraigFe)
    • instance variable set expressions, e.g. (a <- b) [@a] (#1288, @CraigFe)
    • indexing operators, e.g. (a.(b)) [@a] (#1300, @CraigFe)
    • sequences, e.g. (a; b) [@a] (#1291, @CraigFe)
  • Avoid unnecessary spacing after object types inside records and polymorphic variants, e.g. {foo : < .. > [@a]} and { foo : < .. > } (#1296, @CraigFe)
  • Fix missing parentheses around tuples with attributes. (#1301, @CraigFe). Previously, f ((0, 0) [@a]) would be formatted to f (0, 0) [@a], crashing OCamlformat.
  • Avoid emitting >] when an object type is contained in an extension point or attribute payload (#1298, @CraigFe)
  • Fix crash on the expression (0).*(0) (#1304, @Julow). It was formatting to 0.*(0) which parses as an other expression.
  • Preserve empty doc-comments syntax. (#1311, @gpetiot). Previously (**) would be formatted to (***).
  • Do not crash when a comment contains just a newline (#1290, @emillon)
  • Handle lazy patterns as arguments to class (#1289, @emillon)
  • Preserve cinaps comments containing unparsable code (#1303, @Julow). Previously, OCamlformat would fallback to the "wrapping" logic, making the comment unreadable and crashing in some cases.
  • Fix normalization of attributes, fixing the docstrings in attributes (#1314, @gpetiot)
  • Add missing parentheses around OR-patterns with attributes (#1317, @gpetiot)
  • Fix spacing inside parens for symbols when the spacing was handled by the englobing exp (#1316, @gpetiot)
  • Fix invalid (unparsable) docstrings (#1315, @gpetiot). When parsing a comment raises an error in odoc, it is printed as-is.
  • Fix parenthesizing of optional arguments rebound to non-variables, e.g. let f ?a:(A) = () rather than the unparsable let f ?a:A = () (#1305, @CraigFe)

Dune 2.4.0

On behalf of the dune team, I'm pleased to announce the release of dune 2.4.0. This releases features support for mdx, an interesting take on the notebook paradigm by the RWO team. This release also includes a crucial fix to polling mode which makes it usable in environments with finite memory :slight_smile:.

Happy hacking!

See full changelog
  • Add mdx extension and stanza version 0.1 (#3094, @NathanReb)

  • Allow to make Odoc warnings fatal. This is configured from the (env ...) stanza. (#3029, @Julow)

  • Fix separate compilation of JS when findlib is not installed. (#3177, @nojb)

  • Add a dune describe command to obtain the topology of a dune workspace, for projects such as ROTOR. (#3128, @jeremiedimino)

  • Add plugin linking mode for executables and the (embed_in_plugin_libraries ...) field. (#3141, @nojb)

  • Add an %{ext_plugin} variable (#3141, @nojb)

  • Dune will no longer build shared objects for stubs if supports_shared_libraries is false (#3225, fixes #3222, @rgrinberg)

  • Fix a memory leak in the file-watching mode (dune build -w) (#3220, @snowleopard and @aalekseyev)

Dune 2.3.1

See full changelog
  • Fix versioning of artifact variables (eg %{cmxa:...}), which were introduced in 2.0, not 1.11. (#3149, @nojb)

  • Fix a bug introduced in 2.3.0 where dune insists on using fswatch on linux (even when inotifywait is available). (#3162, @aalekseyev)

  • Fix a bug causing all executables to be considered as optional (#3163, @diml)

Mdx 1.6.0

See full changelog

Added

  • Add a --duniverse-mode to ocaml-mdx rule so that the generated rules work within a duniverse
  • Allow to import arbitrary files (not only .ml/.mli ones) into code blocks using the file label. (#203, #207, @voodoos)
  • Allow to set the --non-deterministic option through the MDX_RUN_NON_DETERMINISTIC env variables (#208, @NathanReb)
  • Add support for OCaml 4.10 (#204, @kit-ty-kate)
  • Infer syntax kind when --syntax is not set, and add 'markdown' as an alias to 'normal' (#222, @gpetiot)
  • Add ocaml-mdx deps command to be used by dune to compute file and dir dependencies of an mdx file. (#217, @voodoos)
  • Add new delimiters syntax using comments for partial OCaml files include (#212, @voodoos).

Changed

  • Do not unset INSIDE_DUNE when executing shell commands by default (#224, @NathanReb)

Fixed

  • Fix a bug that could cause ocaml-mdx test to crash on some include in toplevel code blocks (#202, @trefis)

Removed

  • Remove the direction option, only synchronize from .ml to .md files (#214, @gpetiot)

Dune 2.3.0

On behalf of the dune team, I'm proud to announce the 2.3.0 release of dune. This release is particularly relevant for users of coq that use dune to build their theories, developers of coq that use dune to build their favorite theorem prover. I'd like to thank @ejgallego for all the hard work to improve dune in this regard.

I'd also like to point out the (strict_package_deps) option that is now available in project files. This option will now ask dune to validate the package dependencies specified in the package stanzas in your dune-project files.

Here's the full change list, and as always, happy hacking!

See full changelog
  • Improve validation and error handling of arguments to dune init (#3103, fixes #3046, @shonfeder)

  • dune init exec NAME now uses the NAME argument for private modules (#3103, fixes #3088, @shonfeder)

  • Avoid linear walk to detect children, this should greatly improve performance when a target has a large number of dependencies (#2959, @ejgallego, @aalekseyev, @Armael)

  • [coq] Add (boot) option to (coq.theories) to enable bootstrap of Coq's stdlib (#3096, @ejgallego)

  • [coq] Deprecate public_name field in favour of package (#2087, @ejgallego)

  • Better error reporting for "data only" and "vendored" dirs. Using these with anything else than a strict subdirectory or * will raise an error. The previous behavior was to just do nothing (#3056, fixes #3019, @voodoos)

  • Fix bootstrap on bytecode only switches on windows or where -j1 is set. (#3112, @xclerc, @rgrinberg)

  • Allow enabled_if fields in executable(s) stanzas (#3137, fixes #1690 @voodoos)

  • Do not fail if ocamldep, ocamlmklib, or ocaml are absent. Wait for them to be used to fail (#3138, @rgrinberg)

  • Introduce a strict_package_deps mode that verifies that dependencies between packages in the workspace are specified correctly. (@rgrinberg, #3117)

  • Make sure the @all alias is defined when no dune file is present in a directory (#2946, fix #2927, @jeremiedimino)

Dune 2.2.0

See full changelog
  • dune test is now a command alias for dune runtest. This is to make the CLI less idiosyncratic (#3006, @shonfeder)

  • Allow to set menhir flags in the env stanza using the menhir_flags field. (#2960, fix #2924, @bschommer)

  • By default, do not show the full command line of commands executed by dune when dune is executed inside dune. This is to make integration tests more reproducible (#3042, @diml)

  • dune subst now works even without opam files (#2955, fixes #2910, @fangyi-zhou and @diml)

  • Hint when trying to execute an executable defined in the current directory without using the ./ prefix (#3041, fixes #1094, @voodoos).

  • Extend the list of modifiers that can be nested under with-accepted-exit-codes with chdir, setenv, ignore-<outputs>, with-stdin-from and with-<outputs>-to (#3027, fixes #3014, @voodoos)

  • It is now an error to have a preprocessing dependency on a ppx rewriter library that is not marked as (kind ppx_rewriter) (#3039, @snowleopard).

  • Fix permissions of files promoted to the source tree when using the shared cache. In particular, make them writable by the user (#3043, fixes #3026, @diml)

  • Only detect internal OCaml tools with .opt extensions. Previously, this detection applied to other binaries as well (@kit-ty-kate, @rgrinberg, #3051).

  • Give the user a proper error message when they try to promote into a source directory that doesn't exist. (#3073, fix #3069, @rgrinberg)

  • Correctly build vendored packages in -p mode. These packages were incorrectly filtered out before. (#3075, @diml)

  • Do not install vendored packages (#3074, @diml)

  • make now prints a message explaining the main targets available (#3085, fix #3078, @diml)

  • Add a byte_complete executable mode to build programs as self-contained bytecode programs (#3076, fixes #1519, @diml)

Odoc 1.5.0

See full changelog

Additions

  • Add option to turn warnings into errors (#398, Jules Aguillon)

Bugs fixed

  • Emit quote before identifier in alias type expr (Fixes #391, Anton Bachin)
  • Handle generalized open statements introduced in 4.08 (#393, Jon Ludlam)
  • Refactor error reporting to avoid exiting the program in library code (#400, Jules Aguillon)
  • Build on OCaml 4.10 (#408, Jon Ludlam)
See full changelog

New features

  • Add an option --margin-check to emit a warning if the formatted output exceeds the margin (#1110, @gpetiot)
  • Preserve comment indentation when wrap-comments is unset (#1138, #1159, @Julow)
  • Improve error messages (#1147, @Julow)
  • Display standard output in the emacs plugin even when ocamlformat does not fail (#1189, @gpetiot)

Removed

  • Remove ocamlformat_reason (#254, #1185, @emillon). This tool has never been released to opam, has no known users, and overlaps with what refmt can do.
  • Remove ocamlformat-diff (#1205, @gpetiot). This tool has never been released to opam, has no known users, and overlaps with what merge-fmt can do.

Packaging

  • Work with base v0.13.0 (#1163, @Julow)

Bug fixes

  • Fix placement of comments just before a '|' (#1203, @Julow)
  • Fix build version detection when building in the absence of a git root (#1198, @avsm)
  • Fix wrapping of or-patterns in presence of comments with break-cases=fit (#1167, @Julow). This also fixes an unstable comment bug in or-patterns
  • Fix an unstable comment bug in variant declarations (#1108, @Julow)
  • Fix: break multiline comments (#1122, @gpetiot)
  • Fix: types on named arguments were wrapped incorrectly when preceding comments (#1124, @gpetiot)
  • Fix the indentation produced by max-indent (#1118, @gpetiot)
  • Fix break after Psig_include depending on presence of docstring (#1125, @gpetiot)
  • Remove some calls to if_newline and break_unless_newline and fix break before closing brackets (#1168, @gpetiot)
  • Fix unstable cmt in or-pattern (#1173, @gpetiot)
  • Fix location of comment attached to the underscore of an open record (#1208, @gpetiot)
  • Fix parentheses around optional module parameter (#1212, @cbarcenas)
  • Fix grouping of horizontally aligned comments (#1209, @gpetiot)
  • Fix dropped comments around module pack expressions (#1214, @Julow)
  • Fix regression of comment position in list patterns (#1141, @jberdine)
  • Fix: adjust definition of Location.is_single_line to reflect margin (#1102, @jberdine)

Documentation

  • Fix documentation of option version-check (#1135, @Wilfred)
  • Fix hint when using break-separators=after-and-docked (#1130, @gretay-js)

Dune 2.1.3

See full changelog
  • Fix building the OCaml compiler with Dune (#3038, fixes #2974, @diml)
If you want to contribute to a new release announcement, check out the Contributing Guide on GitHub.