From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Hlv7Vrzt; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=fUzCsqQt; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 6157A400B1 for ; Tue, 18 Nov 2025 14:01:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=omaqWvjVoKdMHzYQNa0awvdFKwSOvsY5W56aSiGxzq0=; b=Hlv7VrztHhIj79egwuCufRWvyWQoW1v11wF6oE8+kbJnLoMQe3jzoC64 TyoKsQQFXK9zZ8S/PhHaLoH8X1FrzRwYq6sBlAfwLdkmmBgBmx2S5/Zaw X3A95uu0ILSH6j5P9M+7jKbUWmzuEfi8hTqU3INUCAQXEdRPNzF4mFGx6 U=; X-CSE-ConnectionGUID: tQT1pmteRHKKUY8nbHq85g== X-CSE-MsgGUID: 9EKGfLN7RbSU2su9EXJvoA== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,314,1754949600"; d="scan'208,217";a="249829476" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 18 Nov 2025 15:01:05 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B8C18E0171; Tue, 18 Nov 2025 15:01:05 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B3EFDE0171 for ; Tue, 18 Nov 2025 15:01:03 +0100 (CET) X-CSE-ConnectionGUID: 3mVAUfaBSdqujc9BXAbsCQ== X-CSE-MsgGUID: fLamE/qzSnecbrHhUiE3Lw== IronPort-SDR: 691c7c1d_JUp14sHAgpDoKy57FZEZ/eVtI7NDP3JVHbFHO9c+2ZjKrv3 luqYhV/fZbHtvFw6rF/PEunZCMxQol2o+WJXchQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HsAQArexxphSIeaIFaHAEBAQEBAQcBARIBAQQEAQGCE?= =?us-ascii?q?IE9gQMZAWheMwcISQOEUoNPCIs9gmCRTYhLgjCDFRYjFQEDAQ0uARUKAQIEA?= =?us-ascii?q?QEDAQIBggyCLkYCjFsCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBA?= =?us-ascii?q?QECAQECBAYBAhABAQEBQEmGFQgyDYJFGThxXgMEAwY3AQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAEwBwtcCQoTAQE4G?= =?us-ascii?q?BYNAwoBCQEGAwIRATUDARMBEhqCaAGCIAICTwMFDAaTEZtMeoEygQGCDAEBB?= =?us-ascii?q?oEIPgMLAgIDAQ4JJQHaDIFkAwaBSoVugkobAQUlSWsChEkJhDICJw+BVUSBF?= =?us-ascii?q?TWCRG+BfkwXAQEBAQEXgSQBAQgCNg0JEgKDEYJpgR+BB3oUHYYKeIFbHocxB?= =?us-ascii?q?oE+QIZ9gURLMywBVRMXCwcFW4EIAyo0LW4yHYEkQRhxgRSDSQ8TaA8GgRKDU?= =?us-ascii?q?YkfD4oqAwttPTcUG5RuQhksJYE7JQ4LMwIVJxwIGhMcDgIiNggRCgoEAw8VB?= =?us-ascii?q?B0JCgQFFgEPHwsLAgQYFJJOCSgFJQOPWY4Yk1mBCjQHhB+BXgYMiQiBJowdg?= =?us-ascii?q?W+HeoQEjROHApJSIphkIoI2hycKgRwJgW9rlWAED4VGgX8jgSsBGwIMBzMaM?= =?us-ascii?q?EOCMwEBATEJCgwwHA+MLoFzDRWBZoFQKIE+gQyCDju9aEI1AgEBBjICBwEKA?= =?us-ascii?q?QEDCYViAQFpix4BJgyBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:6B5VoK+S7dpg2Ff1CPhuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:F7WHL2BQ8FrDKvr6E3JiymcpFMkPSXHE0XXbcmWIIGxyY4TAHA== X-Talos-MUID: =?us-ascii?q?9a23=3AtZ2S8Q/bPAFUl/Y66krzihOQf8lM6qGDT1kfqpM?= =?us-ascii?q?LsMOeFSxNOhrGqCviFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,314,1754949600"; d="scan'208,217";a="131192113" X-MGA-submission: =?us-ascii?q?MDEI+a2QYqescI2f72Yu14QFxEkMNXataSGa5U?= =?us-ascii?q?ZSCmGow9GIWFOliVAZL5PxtqBLZqK2ecsOBIW5csV/2x2iODfLIql4bn?= =?us-ascii?q?f0PBp9vQoP9FhGecc1Gt4ho7y+FqVovHjg+wcJdcTnvt/ohZifmamBdS?= =?us-ascii?q?bvCu9oAaCaUQp9PQgV1Kb0Jw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Nov 2025 15:01:01 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 322091A3CD; Tue, 18 Nov 2025 15:01:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1763474461; bh=UnErdcGxAL8uARf54lZuJRatO4EJeB317AVZT1JboPc=; h=From:To:Subject:Date:Message-ID; b=fUzCsqQtMkzbyMdt8Zxl1YHvWfHmtDd8M8BDSgIjHmCAkp/T0q5yrspWmHtV+hd+G iFG0dleXoi4J9pIB0XYKyAGnHLLtKT90Mhe3+vbxfRgdxt691pB+zY/Gc52ADjJnfb xJtwnFbc9uD9sy+iKB+Z+41S33SU+b+QartYWOjs= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 18 Nov 2025 15:01:00 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 18 15:01:01 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.491425, queueID=584921A3EB X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19403 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 11 to 18, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam 2.5.0~beta1 Announcing the first release of Alice, a radical OCaml build system First release of ppx_deriving_jsont crypt 2.0 - unix crypt function Artisanal Coding Is Dead, Long Live Artisanal Coding! Moonpool 0.10, and a blogpost about Moonpool at Imandra libdrm - OCaml bindings for Linux mode setting, etc New release of visitors MirageOS on Unikraft Old CWN opam 2.5.0~beta1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the first beta release of opam 2.5.0. This version is a beta, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release. Changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :red_apple: Allow the macOS sandbox to write in the `/var/folde= rs/' and `/var/db/mds/' directories as it is required by some of macOS core tools ([#4389], [#6460]) =E2=80=A2 Stop `opam switch create --dry-run' from creating any directory. *Thanks to @hannes for this contribution.* ([#5918]) =E2=80=A2 :ocean: A couple more changes were made and minor regressions w= ere fixed :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [#4389] [#6460] [#5918] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.5.0~beta1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.5.0~beta1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] Announcing the first release of Alice, a radical OCaml build system =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Steve Sherratt announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m pleased to announce the initial release of [Alice], a radical, experimental OCaml build system, package manager, and environment manager for [Windows], macOS, and Linux. Its goal is to allow anyone to program in OCaml with as little friction as possible. To build your first program with Alice, run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ alice tools install # Skip this if you already have an OCam= l compiler! =E2=94=82 $ alice new hello =E2=94=82 $ cd hello =E2=94=82 $ alice run =E2=94=82 Compiling hello v0.1.0 =E2=94=82 Running hello/build/packages/hello-0.1.0/debug/executable/he= llo =E2=94=82=20 =E2=94=82 Hello, World! =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The UI is heavily inspired by Cargo. An important distinction between Alice's and Opam's packaging philosophies is that in Alice, _the OCaml compiler and development tools are not packages_. The `alice tools install' command will install a pre-compiled ([relocatable!]) OCaml compiler, a compatible `ocamllsp', and `ocamlformat' user-wide, similar to how `rustup' installs the Rust compiler and LSP server. This lets you go from zero to OCaml really fast because you don't have to build the compiler from source. This speedup is particularly noticeable on Windows where building the compiler can take upwards of 10 minutes. Alice supports building packages with dependencies on other packages, but currently only local packages are supported, and it can only build _Alice_ packages, not Opam packages. See an example [here]. I'll probably add Opam compatibility in the future. It's still early days and [a lot] is missing before Alice could feasibly be used for real projects. If you want to try it out anyway, install the `alice' Opam package, the `github:alicecaml/alice' Nix flake, or run the interactive install script: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 curl -fsSL https://alicecaml.org/install.sh | sh =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 More details about installing Alice are [here]. If you want read more, check out the [blog]. [Alice] [Windows] [relocatable!] [here] [a lot] [here] [blog] First release of ppx_deriving_jsont =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am happy to announce the first release of [`ppx_deriving_jsont']. As the name implies, it is a tool that automates some of the burden inherent to writing Jsont descriptions. [Jsont] is a fairly novel library for declarative JSON data manipulation, created by @dbuenzli. This ppx can manage most of the basic types, tuples, variants and records, but still lacks a lot of features and control. It is also quite bad at error reporting. The current roadmap, which highlights existing and missing features can be found in [the project=E2=80=99s read= me] along with many examples. I focused on generating readable and reusable code, close to the [cookbook] illustrations. Note that Jsont offers much finer control and many more features than what that you can achieve using this crude ppx. Please take some time to read about all of its intricacies: =E2=80=A2 In the official [documentation] and [cookbook] =E2=80=A2 In Daniel=E2=80=99s [introductory post] here on discuss. When precision and good error handling are required, such as when interacting with external json sources, thoughtfully crafted descriptions should still be considered. But I do believe this ppx to be very useful for bootstrapping, prototyping or when both the encoders and decoders are entirely under the app=E2=80=99s control. I wro= te it to that intent and already use it in several personal projects. I hope you will find it useful too! (and not too non-sensical :slightly_smiling_face:) [`ppx_deriving_jsont'] [Jsont] [the project=E2=80=99s readme] [cookbook] [documentation] [introductory post] crypt 2.0 - unix crypt function =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mikhail announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hi there! I'm happy to announce the release of a new major version (i.e., 2.0) of the [crypt] library (bindings to the [Unix crypt]() function). The previous version, 1.3, was outdated, since the last commit was six years ago. This version does not support correct compilation on various Unix platforms (Linux, FreeBSD, macOS), and uses deprecated tools. However, the new version addresses these issues: it supports Linux, FreeBSD and macOS, uses modern tools, has safe C stubs, provides excellent documentation, and features an idiomatic high-level wrapper. [crypt] Installation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C by OPAM package manager: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install crypt.2.0=20=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Example of usage =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # #require "crypt";; =E2=94=82=20 =E2=94=82 # Crypt.crypt ~salt:"GUBv0xjJ" "hello";; =E2=94=82 - : string =3D "GUpsIDCLVu8AY" =E2=94=82=20 =E2=94=82 # Crypt.crypt ~derivation:Md5 ~salt:"GUBv0xjJ" "hello";; =E2=94=82 - : string =3D "$1$GUBv0xjJ$rQSvX8r6cT7H/NItzzVNQ/" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you don't provide any salt, a new salt will be generated every time the function is called. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # Crypt.crypt "hello";; =E2=94=82 - : string =3D "QwD.wi5nLT/0s" =E2=94=82=20 =E2=94=82 # Crypt.crypt "hello";; =E2=94=82 - : string =3D "MYM.5hv5Lk2Mg" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 But for a deterministic generation, you should use one salt that you can generate using the `Crypt.Salt' module or another external module. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # let salt =3D Crypt.Salt.gen_base64 9;; =E2=94=82 val salt : string =3D "dHiPl3q99" =E2=94=82=20 =E2=94=82 # Crypt.crypt ~salt "hello";; =E2=94=82 - : string =3D "dHDdeFGUWcGyQ" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 P.S. =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Project that uses `crypt': =E2=80=A2 Recently I wrote [toy implementation of `login' utility written= in OCaml] [toy implementation of `login' utility written in OCaml] Artisanal Coding Is Dead, Long Live Artisanal Coding! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Joel Reymont announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I wrote [a blog post] about adding command history browsing and editing, as well as tab completion, to `ocamldebug', without typing a single line of code. I challenge you to review the PR for fun and to try to find holes in it! I=E2=80=99m going to add DWARF debugging information to OCaml next. I thi= nk it=E2=80=99s [almost ready to go] but needs double and triple checking. Commits look like this =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Date: Thu Nov 13 14:55:24 2025 +0200 =E2=94=82=20 =E2=94=82=20 =E2=94=82 Add DWARF tests for basic functionality =E2=94=82=20 =E2=94=82 Add minimal tests to verify DWARF emission works correctly with= -g flag. =E2=94=82 Tests compile OCaml programs with debugging enabled and verify = correct =E2=94=82 execution. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Date: Thu Nov 13 14:54:30 2025 +0200 =E2=94=82=20 =E2=94=82 Implement DWARF v4 debugging support for OCaml =E2=94=82=20 =E2=94=82 Add complete DWARF version 4 debugging information generation f= or OCaml =E2=94=82 native code. The implementation generates debug info for functi= ons, types, =E2=94=82 and line numbers, enabling debugger support for OCaml programs. =E2=94=82=20 =E2=94=82 Key components: =E2=94=82 - Low-level DWARF primitives (tags, attributes, forms, encoding= s) =E2=94=82 - Debug Information Entries (DIE) construction =E2=94=82 - Line number program generation =E2=94=82 - String table management with offset tracking =E2=94=82 - Code address tracking and relocation =E2=94=82 - Integration with OCaml compilation pipeline =E2=94=82 - Configuration flags to enable/disable DWARF emission =E2=94=82=20 =E2=94=82 The implementation follows the DWARF 4 specification and genera= tes =E2=94=82 valid debug sections (.debug_info, .debug_line, .debug_str, .de= bug_abbrev) =E2=94=82 that can be consumed by standard debuggers like gdb and lldb. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [a blog post] [almost ready to go] Moonpool 0.10, and a blogpost about Moonpool at Imandra =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Good morning, A couple of news about Moonpool. Moonpool is a concurrency and parallelism library that provides a `Runner.t' abstraction, implemented mostly by thread pools, as a way to run lightweight tasks possibly on multiple cores. First, I just wrote a blog post about [our use of Moonpool] at Imandra. The post discusses our experience with using Moonpool and some lessons learned over time. Secondly, Moonpool 0.10 was just released. It contains a few bugfixes, and removes some deprecated modules. It also removes `moonpool.fib' (fibers with structured concurrency) as they have turned out, over the years, to be somewhat hard to use properly (they assume the existence of a parent fiber, making code highly context-dependent). Lightweight thread-safe futures (based on Picos') with per-future local-storage are still there and serve mostly the same purpose. The release and change notes can be found [here]. [our use of Moonpool] [here] libdrm - OCaml bindings for Linux mode setting, etc =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Thomas Leonard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the first release of [libdrm-ocaml] (OCaml bindings for the libdrm C library). libdrm is used by applications such as Wayland compositors to control the physical graphics hardware. For example, you can use the library to enumerate graphics devices: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 utop # Drm.Device.list ();; =E2=94=82 - : Drm.Device.Info.t list =3D =E2=94=82 [{primary_node =3D Some "/dev/dri/card0"; =E2=94=82 render_node =3D Some "/dev/dri/renderD128"; =E2=94=82 info =3D PCI {bus =3D {domain =3D 0; bus =3D 1; dev =3D 0; fu= nc =3D 0}; =E2=94=82 dev =3D {vendor_id =3D 0x1002; =E2=94=82 device_id =3D 0x67ff; =E2=94=82 subvendor_id =3D 0x1458; =E2=94=82 subdevice_id =3D 0x230b; =E2=94=82 revision_id =3D 0xff}}}] =E2=94=82=20 =E2=94=82 utop # let dev =3D Unix.openfile "/dev/dri/card0" [O_CLOEXEC; O= _RDWR] 0;; =E2=94=82=20 =E2=94=82 utop # Drm.Device.Version.get dev;; =E2=94=82 - : Drm.Device.Version.t =3D =E2=94=82 {version =3D 3.61.0; name =3D "amdgpu"; date =3D "0"; desc =3D = "AMD GPU"} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here's an excerpt configuring a hardware plane to present a framebuffer on a CRT controller: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 plane.%{ K.Plane.fb_id } <- Some fb; =E2=94=82 (* Source region on frame-buffer: *) =E2=94=82 plane.%{ K.Plane.src_x } <- Drm.Ufixed.of_int 0; =E2=94=82 plane.%{ K.Plane.src_y } <- Drm.Ufixed.of_int 0; =E2=94=82 plane.%{ K.Plane.src_w } <- Drm.Ufixed.of_int (fst size); =E2=94=82 plane.%{ K.Plane.src_h } <- Drm.Ufixed.of_int (snd size); =E2=94=82 (* Destination region on CRTC: *) =E2=94=82 plane.%{ K.Plane.crtc_x } <- 0; =E2=94=82 plane.%{ K.Plane.crtc_y } <- 0; =E2=94=82 plane.%{ K.Plane.crtc_w } <- fst size; =E2=94=82 plane.%{ K.Plane.crtc_h } <- snd size; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For a proper tutorial, see [Linux mode setting, from the comfort of OCaml]. [libdrm-ocaml] [Linux mode setting, from the comfort of OCaml] New release of visitors =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am pleased to announce a new release of `visitors', a tool that automatically generates visitor classes for algebraic data types. The new features of this release are as follows: =E2=80=A2 `visitors' now decorates every generated method with a type annotation. This can help understand the generated code. More importantly, this enables type-directed disambiguation, so `visitors' now supports situations where two distinct types have a field or a data constructor by the same name. (Reported by Guillaume Boisseau. Contributed by Sacha =C3=89lie-Ayoun.) =E2=80=A2 Install a new executable command, `visitors_preprocess', to preprocess an OCaml source file and see the result. =E2=80=A2 Update `Makefile.preprocess' to use `visitors_preprocess'. =E2=80=A2 Require `ppxlib' version 0.37.0 or newer. MirageOS on Unikraft =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, shym announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Just a short update to let you know that OCaml/Unikraft 1.1.0 [has been released] with support for OCaml 5.4 and Unikraft 0.20.0. Happy hacking! [has been released] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 11 to 18, 20= 25.

opam 2.5.0~beta1

Kate announced

Hi everyone,

We are happy to announce the first beta release of opam 2.5.0.

This version is a beta, we invite users to test it to spot previously unnot= iced bugs as we head towards the stable release.

Changes

  • :red_apple: Allow the macOS sandbox to write in the /var/folders/= and /var/db/mds/ directories as it is required by some= of macOS core tools (#4389, #6460= )
  • Stop opam switch create --dry-run from creating any direct= ory. Thanks to @hannes for this contribution. (#5918)
  • :ocean: A couple more changes were made and minor regressions were fixe= d

:open_book: You can read our blog post for more information about these changes and more= , and for even more details you can take a look at the release note or the changelog.

Announcing the first release of Alice, a radical OCaml build s= ystem

Steve Sherratt announced

I=E2=80=99m pleased to announce the initial release of Alice, a radical, experimental OCaml build s= ystem, package manager, and environment manager for Windows, macOS, and Linux. Its= goal is to allow anyone to program in OCaml with as little friction as pos= sible.

To build your first program with Alice, run:

$ alice tools install   # Skip this if you already have an OCaml compiler!
$ alice new hello
$ cd hello
$ alice run
 Compiling hello v0.1.0
   Running hello/build/packages/hello-0.1.0/debug/executable/hello

Hello, World!

The UI is heavily inspired by Cargo.

An important distinction between Alice's and Opam's packaging philosophies = is that in Alice, the OCaml compiler and developm= ent tools are not packages. The alice tools install com= mand will install a pre-compiled (relocatable!) OCaml compiler, a compatible ocaml= lsp, and ocamlformat user-wide, similar to how ru= stup installs the Rust compiler and LSP server. This lets you go fro= m zero to OCaml really fast because you don't have to build the compiler fr= om source. This speedup is particularly noticeable on Windows where buildin= g the compiler can take upwards of 10 minutes.

Alice supports building packages with dependencies on other packages, but c= urrently only local packages are supported, and it can only build Alice packages, not Opam packages. See an example <= a href=3D"https://github.com/alicecaml/alice?tab=3Dreadme-ov-file#tutorial"= >here. I'll probably add Opam compatibility in the future.

It's still early days and a lot is missing before Alice could feas= ibly be used for real projects.

If you want to try it out anyway, install the alice Opam packa= ge, the github:alicecaml/alice Nix flake, or run the interacti= ve install script:

curl -fsSL https://alicecaml.org/install.sh | sh

More details about installing Alice are here.

If you want read more, check out the blog.

First release of ppx_deriving_jsont

vds announced

I am happy to announce the first release of ppx_deriving_jsont.

As the name implies, it is a tool that automates some of the burden inheren= t to writing Jsont descriptions. Jsont is a fairly novel library for declarative JSON data manipul= ation, created by @dbuenzli.

This ppx can manage most of the basic types, tuples, variants and records, = but still lacks a lot of features and control. It is also quite bad at erro= r reporting. The current roadmap, which highlights existing and missing fea= tures can be found in the project=E2=80=99s readme a= long with many examples. I focused on generating readable and reusable code= , close to the cookbook illustrations.

Note that Jsont offers much finer control and many more features than what = that you can achieve using this crude ppx. Please take some time to read ab= out all of its intricacies:

When precision and good error handling are required, such as when interacti= ng with external json sources, thoughtfully crafted descriptions should sti= ll be considered. But I do believe this ppx to be very useful for bootstrap= ping, prototyping or when both the encoders and decoders are entirely under= the app=E2=80=99s control. I wrote it to that intent and already use it in= several personal projects. I hope you will find it useful too! (and not to= o non-sensical :slightly_smiling_face:)

crypt 2.0 - unix crypt function

Mikhail announced

Hi there!

I'm happy to announce the release of a new major version (i.e., 2.0) of the= crypt library (bind= ings to the [Unix crypt](https://en.wikipedia.org/wiki/Crypt_(Unix)) function). The previou= s version, 1.3, was outdated, since the last commit was six years ago. This= version does not support correct compilation on various Unix platforms (Li= nux, FreeBSD, macOS), and uses deprecated tools. However, the new version a= ddresses these issues: it supports Linux, FreeBSD and macOS, uses modern to= ols, has safe C stubs, provides excellent documentation, and features an id= iomatic high-level wrapper.

Installation

by OPAM package manager:

$ opam install crypt.2.0=20=20

Example of usage

# #require "crypt";;

# Crypt.crypt ~salt:"GUBv0xjJ" "hello"=
;;
- : string =3D "GUpsIDCLVu8AY"

# Crypt.crypt ~derivation:Md5 ~salt:"GUBv0xjJ" <=
span style=3D"color: #ca3400;">"hello""$1$GUBv0xjJ$rQSvX8r6cT7H/NI=
tzzVNQ/"

If you don't provide any salt, a new salt will be generated every time the = function is called.

# Crypt.crypt "hello";;
- : string =3D "QwD.wi5nLT/0s"

# Crypt.crypt "hello"=
;;
- : string =3D "MYM.5hv5Lk2Mg"

But for a deterministic generation, you should use one salt that you can ge= nerate using the Crypt.Salt module or another external module.

# let salt =3D Crypt.Salt.gen_base6=
4 9;;
val salt : string =3D "dHiPl3q99"

# Crypt.crypt ~sa=
lt "hello";;
- : string =3D "dHDdeFGUWcGyQ"

P.S.

Project that uses crypt:

Artisanal Coding Is Dead, Long Live Artisanal Coding!

Joel Reymont announced

I wrote a blog post about adding command history browsing and edit= ing, as well as tab completion, to ocamldebug, without typing = a single line of code. I challenge you to review the PR for fun and to try = to find holes in it!

I=E2=80=99m going to add DWARF debugging information to OCaml next. I think= it=E2=80=99s almost ready to go but needs double and triple checking. Com= mits look like this

Date:   Thu Nov 13 14:55:24 2025 +0200


Add DWARF tests for basic functionality

Add minimal tests to verify DWARF emission works correctly with -g flag.
Tests compile OCaml programs with debugging enabled and verify correct
execution.

and

Date:   Thu Nov 13 14:54:30 2025 +0200

Implement DWARF v4 debugging support for OCaml

Add complete DWARF version 4 debugging information generation for OCaml
native code. The implementation generates debug info for functions, types,
and line numbers, enabling debugger support for OCaml programs.

Key components:
- Low-level DWARF primitives (tags, attributes, forms, encodings)
- Debug Information Entries (DIE) construction
- Line number program generation
- String table management with offset tracking
- Code address tracking and relocation
- Integration with OCaml compilation pipeline
- Configuration flags to enable/disable DWARF emission

The implementation follows the DWARF 4 specification and generates
valid debug sections (.debug_info, .debug_line, .debug_str, .debug_abbrev)
that can be consumed by standard debuggers like gdb and lldb.

Moonpool 0.10, and a blogpost about Moonpool at Imandra

Simon Cruanes announced

Good morning,

A couple of news about Moonpool. Moonpool is a concurrency and parallelism = library that provides a Runner.t abstraction, implemented most= ly by thread pools, as a way to run lightweight tasks possibly on multiple = cores.

First, I just wrote a blog post about our use of Moonpool= at Imandra. The post discusses our experience with using Moonpool and = some lessons learned over time.

Secondly, Moonpool 0.10 was just released. It contains a few bugfixes, and = removes some deprecated modules. It also removes moonpool.fib = (fibers with structured concurrency) as they have turned out, over the year= s, to be somewhat hard to use properly (they assume the existence of a pare= nt fiber, making code highly context-dependent). Lightweight thread-safe fu= tures (based on Picos') with per-future local-storage are still there and s= erve mostly the same purpose. The release and change notes can be found here.

libdrm - OCaml bindings for Linux mode setting, etc

Thomas Leonard announced

I'm pleased to announce the first release of libdrm-ocaml (OCaml bindings for the libdrm C libr= ary).

libdrm is used by applications such as Wayland compositors to control the p= hysical graphics hardware.

For example, you can use the library to enumerate graphics devices:

utop # Drm.Device.list ()=
;;
- : Drm.Device.Info.t list =3D
[{primary_node =3D Some "/dev/dri/card0";
  render_node =3D Some "/dev/dri/renderD128";
  info =3D PCI {bus =3D {domain =3D =
0; bus =3D 1; dev =3D 0; func =3D 0};
              dev =3D {vendor_id =3D 0x1002;
                     device_id =3D 0x67ff;
                     subvendor_id =3D 0x1458;
                     subdevice_id =3D 0x230b;
                     revision_id =3D 0xff}}}]

utop # let dev =3D Unix.openfile "/dev=
/dri/card0" [O_CLOEXEC; O_RDWR] 0=
;;

utop # Drm.Device.Versio=
n.get dev;;
- : Drm.Device.Version.<=
/span>t =3D
{version =3D 3.61.0; name =3D "amdgpu"; date =3D "0"; desc =3D "AMD GPU"}

Here's an excerpt configuring a hardware plane to present a framebuffer on = a CRT controller:

plane.%<=
/span>{ K.Plane.f=
b_id } <- Some fb;
(* Source region on frame-buffer: *)
plane.%{ K.Plane.src_x } <- Drm.Ufixed.of_int 0;
plane.%{ K.Plane.src_y } <- Drm.Ufixed.of_int 0;
plane.%{ K.Plane.src_w } <- Drm.Ufixed.of_int (fst size);
plane.%{ K.Plane.src_h } <- Drm.Ufixed.of_int (snd size);
(* Destination region on CRTC:=
 *)
plane.%{ K.Plane.crtc_x } <- 0;
plane.%{ K.Plane.crtc_y } <- 0;
plane.%{ K.Plane.crtc_w } <- fst size;
plane.%{ K.Plane.crtc_h } <- snd size;

For a proper tutorial, see Linux mode setting, from the comfort of OCaml.

MirageOS on Unikraft

Continuing this thread, shym announced

Just a short update to let you know that OCaml/Unikraft 1.1.0 has been released wi= th support for OCaml 5.4 and Unikraft 0.20.0.

Happy hacking!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

--=-=-=--