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=pPHvqVbV; 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]) by plum.tunbury.org (Postfix) with ESMTP id F3BC0400A2 for ; Tue, 17 Feb 2026 13:47:32 +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=CW5me7pSdig318gR5Y1Sg4vnMK2ICT841Gjs4Dkkwqw=; b=pPHvqVbVH2J65DqyMVk0xEtcylOgC0aGaoYkjdbun2hxLJd07VYPuMEQ K0LIP04+GtNsUviZTH43JIcwuJI4CpMJbXWsuobRuRfTJ6udaKX6eHAQE EI/LfG0rlpD+EGjgmMo7hNpsw7BGV4Jey48T4AcRtjpHUCDxIfzUhpF2z E=; X-CSE-ConnectionGUID: dbzNi6X1S3aQcVb29v7r6Q== X-CSE-MsgGUID: l4+7vl92QAKZHdpYf6RFkg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; 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@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,296,1763420400"; d="scan'208,217";a="263862349" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Feb 2026 14:47:29 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id EF85182C9B; Tue, 17 Feb 2026 14:47:28 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id B33B582C94 for ; Tue, 17 Feb 2026 14:47:18 +0100 (CET) X-CSE-ConnectionGUID: xAePbKDxRzinEQ7pwH7ylw== X-CSE-MsgGUID: 0DvaabbwScyQLm3dCM0O3w== IronPort-SDR: 69947165_bB8RyfNnjKdYCrMsAttNwN98Lk3+p3g0Lv1/SBqLhiM+Cmq h0uXv1MJTXHNbCdfdy4k9GdYhzS3oeTdqSsEFSg== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HfAwDCcJRpjyIeaIFaEwEBCQEBCxIMghKBO1spGgFsX?= =?us-ascii?q?xkaBwhJAwqES1yBB4FsjiWBFpA3gjyGVlmBEIFpgREHFBYjFQEDAQ0uARsEA?= =?us-ascii?q?QIEAQEDAQIBg0lxRgJPFYw8Ah8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENA?= =?us-ascii?q?QEFAQEBAgEBAgQGAQIQAQEBAQEBOQVJhk8NSQEQAYFqUXFlCTcBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAgBAhcKDW4BC?= =?us-ascii?q?AQGEwEBJRMYIwMJCwEGAwIRATUDARMBCQkaAYIPWAGCIgJPAwUMBo8vmn0aN?= =?us-ascii?q?3p/M4EBggwBAQaBCD4CAQIJAgIDAQ4JJQHaEYFnCYE1GIJYgxeCShsBKklsA?= =?us-ascii?q?QKETYQ/CB8PgVVEgRU1gXNKB2+CHiEEBxcBAQEBARd/DQQBARABAgEGAgIQD?= =?us-ascii?q?yQJCYMcgmmCERV6FB11boElhyGBB3AYXQWGJYFESzMsAVUTFwsHBV6BCAMqL?= =?us-ascii?q?y1uMh2BIz4XM1gbBwWHcw+JBYFmgR+BBAMLbT03FBuPEkIBGBcqgTctAg44B?= =?us-ascii?q?hcXNAIYDgUBBwwWAhQODR8KIxEFBwMEFRkECQoEFSIIBQUBCQMKAi0DklUCC?= =?us-ascii?q?RwDBScBj1mDVl6JZJNZHW00B4QfgV4GDIgeaoEmi2aKIYQEgVeLPIcCklIim?= =?us-ascii?q?GQigjaHKIEmCYFvH0MJlWA5hR+BfyMuDjA/HgwHMxowQ4IzAQEBMQlGHA9Xj?= =?us-ascii?q?SgiDBaCBYFZQX2BJoF0O4FduC8xQjUCAQEHAwUpAgcBCgEBAwmFYgEBfII2i?= =?us-ascii?q?FUBDxcHBYFLAQE?= IronPort-PHdr: A9a23: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 GEZTo9JyWjCGNIViQUrMM4W IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:lR05rKqAbOkVNDhCass1qFsaV5oUeYIsimQD101hICG9E/bo9f xG+c5wuCMc5wxxZJhNo7y90cq7MBDhHPxOgbX5VI3KNGLbUQCTQr2Kg7GM/xTQXwXAssRd2a 1jf6UWMqyUMXFKyeDg7k2dG9YkqeP3l5xAaN2uq0tQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3ASPwKZmnuGpNKk6Dp/Ne3TpjxxvbXOW30wU/aAGO?= =?us-ascii?q?oM3RoTpCsFkeP2Px1l9U7zg=3D=3D?= X-Talos-MUID: 9a23:AMgnfglNcV7PkxkI9thXdno6GNlh6q6kF3sGgKwivpKIHgkoHGyC2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,296,1763420400"; d="scan'208,217";a="263862247" X-MGA-submission: =?us-ascii?q?MDHJmupshpa39maVPc6ulpAKyQ2y1sam9OSeE+?= =?us-ascii?q?A/MABismd/MFeOasQG+hGuKZ3LjQ2n81AsBJGOMQvIjn1zJkhJuIqdm1?= =?us-ascii?q?2iR02dtIJolykM0PGUJoa7AT9ygRlYwmK46FEFz0v+m3kG4sH2A+a236?= =?us-ascii?q?OUIjJG1S/Acixy/QAqb2YOAg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2026 14:47:17 +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 B4EF11A342; Tue, 17 Feb 2026 14:47:16 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 17 Feb 2026 14:47:16 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 17 14:47:16 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.475100, queueID=D70371A394 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: 19448 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 February 10 to 17, 2026. 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 trace 0.11 Bogue, the OCaml GUI OCaml examples of computing with encrypted or private data CMake, Ninja and Google or-tools packages Neocaml-mode (A modern Emacs major mode for OCaml) is looking for testers YOCaml, a framework for static site generator Other OCaml News Old CWN trace 0.11 =E2=95=90=E2=95=90=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 Dear all, I'm delighted to announce the release of [trace 0.11]. This is a major release and hopefully the last one before 1.0. [trace] is a lightweight foundation for instrumentation, a bit like [rust's tracing]. It provides a _protocol_ between, one the one hand, libraries and applications that are instrumented; and a _collector_ that decides what to do with that. My hope is that projects (especially libraries) can adopt `trace' without fear because of the tiny footprint and high flexibility, the same way `logs' is used in many places. Existing collectors can produce [chrome format traces], fuchsia traces, plug into [tracy], or into [opentelemetry]; a bridge to `Runtime_events' is planned[^1]. [^1]: trace is more flexible than `Runtime_events' and works on OCaml 4, but of course it should be possible to have both interoperate! [API docs for the main library] [trace 0.11] [trace] [rust's tracing] [chrome format traces] [tracy] [opentelemetry] [API docs for the main library] brief example =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 A simple example program from the readme: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let (let@) =3D (@@) =E2=94=82=20 =E2=94=82 let run () =3D =E2=94=82 Trace.set_process_name "main"; =E2=94=82 Trace.set_thread_name "t1"; =E2=94=82=20 =E2=94=82 let n =3D ref 0 in =E2=94=82=20 =E2=94=82 for _i =3D 1 to 50 do =E2=94=82 let@ _sp =3D Trace.with_span ~__FILE__ ~__LINE__ "outer.loo= p" in =E2=94=82 for _j =3D 2 to 5 do =E2=94=82 incr n; =E2=94=82 let _sp =3D Trace.with_span ~__FILE__ ~__LINE__ "inner.lo= op" in =E2=94=82 Trace.messagef (fun k -> k "hello %d %d" _i _j); =E2=94=82 Trace.message "world"; =E2=94=82 Trace.counter_int "n" !n; =E2=94=82 done =E2=94=82 done =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 (* here we setup the collector *) =E2=94=82 let@ () =3D Trace_tef.with_setup ~out:(`File "trace.json") ()= in =E2=94=82 run () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If we run the program with `TRACE=3D1' to enable this particular collector, we get a trace file in `trace.json' (but with actual timestamps): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 [{"pid":2,"name":"process_name","ph":"M","args": {"name":"main"= }}, =E2=94=82 {"pid":2,"tid": 3,"name":"thread_name","ph":"M","args": {"name"= :"t1"}}, =E2=94=82 {"pid":2,"cat":"","tid": 3,"ts": 2.00,"name":"hello 1 2","ph":"= I"}, =E2=94=82 {"pid":2,"cat":"","tid": 3,"ts": 3.00,"name":"world","ph":"I"}, =E2=94=82 {"pid":2,"tid":3,"ts":4.00,"name":"c","ph":"C","args": {"n":1}}, =E2=94=82 =E2=80=A6 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Opening it in we get something like this: [screenshot of perfetto UI] [screenshot of perfetto UI] what's new in 0.11 =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=95= =8C=E2=95=8C 0.11 contains major changes, almost all of which are breaking _on the collector side_. Instrumented programs should be **mostly** unaffected, aside from many deprecation warnings. The core change is that `Trace.span' is [now] an **open sum type**, and not `int64'. This means less global state and fewer tables needed: collectors can pick exactly what data gets carried from the `enter_span' site into the `exit_span' site, if any. In turns, collectors get simpler and faster. The notion of "manual" span is now dead (a simple alias to normal spans) and all related functions are deprecated. 1.0 will not have this notion at all. In addition, collectors are now [a bag of callbacks+a state], rather than a first class module. `trace.subscriber' has been removed because the notion of subscriber is subsumed by the notion of collector (now more easily composable). The TEF and fuchsia collectors are now simpler and free of global state. `user_data' is now a polymorphic variant to, for better ease of use. Metrics are an open sum type, and the previous `int' and `float' cases are just provided as constructors of this type. Dependencies on `thread-local-storage' and `hmap' are now entirely gone. [now] [a bag of callbacks+a state] organization note =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=95= =8C Note: the project has moved from my gh account (c-cube) to a dedicated organization [ocaml-tracing] for telemetry and tracing projects. Other projects such as [opentelemetry] have also migrated there. [ocaml-tracing] [opentelemetry] Bogue, the OCaml GUI =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=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, sanette 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=E2=94=80=E2=94=80=E2=94=80 Hi I'm happy to announce [Bogue] version 20260208, now available on opam. The main novelties are =E2=81=83 Color management has been improved (_warning: breaking change_) =E2=81=83 New: *Text input validator* : you can write rules (or simply a regexp) to warn the user whether the text they are typing is correct. =E2=81=83 New: *Mailbox* module: setup a mailbox server and send arbitrary messages between widgets. =E2=81=83 Installation on Windows has been simplified. =E2=81=83 Compatibility with old versions of SDL. Have fun! Here are the details: =E2=81=83 /Colors/: All colors and some of the API have been split into t= he `RGB' and `RGBA' modules. Named colors are now true identifiers: =E2=81=83 instead of writing `let c =3D Draw.find_color "aliceblue' you= should now use `let c =3D RGB.aliceblue'; and instead of `let c =3D Draw.(opaque (find_color "aliceblue"))' you write now `let c =3D RGBA.aliceblue'. =E2=81=83 if you're lazy to correct these, you may simply do `open Bogu= e.RGB open Bogue.RGBA'; it should be enough in most cases. =E2=81=83 /Text input validator/: Example using the included *email validator*: =E2=81=83 /Mailbox API/: for complicated GUIs with circular connnections between widgets, the usual Bogue solution was to use an `update' event, see [here]. Now this method has been leveraged to a full Mailbox system where any type of message can be sent. =E2=81=83 /Windows/ users should follow the instructions [here]. Continuo= us testing (CI) is now guaranteed to work on Windows mingw64 (and of course Linux and MacOS) =E2=81=83 /SDL/: if you have an old version of SDL (>=3D 2.0.6) and are t= oo lazy to upgrade, rejoice: simply follow the instructions [here] [Bogue] [here] [here] [here] OCaml examples of computing with encrypted or private data =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =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: Xavier Leroy 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 Last Fall, I gave a [series of lectures] on secure computing (computing with encrypted or private data). Here is some companion OCaml code that demonstrates these techniques: . If you're curious about homomorphic encryption, zero-knowledge proofs, secure multi-party computation, oblivious transfers, private set intersection and so on, you might enjoy these code examples and the explanations given in the lectures. This code is probably insecure and not intended to be used in actual high-security applications. If you're into this kind of things, see [Belenios], an excellent e-voting system written in OCaml that uses many of these secure computing techniques. [series of lectures] [Belenios] CMake, Ninja and Google or-tools packages =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: jbeckford 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 It is my pleasure to announce the following packages for (): =E2=80=A2 [`CommonsBase_Build.CMake0@3.25.3'] and [`CommonsBase_Build.Ninja0@1.12.1']: CMake and Ninja. The C compiler, Ninja and CMake are the basic tools used to build the majority of modern C projects. =E2=80=A2 [`NotGoogleDev_OR.Tools.F_Lib@9.15.0'] and [`NotInriaParkas_Caml.ORTools@9.15.0']: Google's `or-tools' libraries discussed by @tbrk in a couple threads last week ( and ) These packages are my /start/ to a clean replacement for opam `depexts'. `depexts' does not work well for me: basic engineering (reproducibility) is gone, system packages often are too far behind their upstream versions, the complete unavailability for Windows users, the occasional symlink break with homebrew, etc. Here's the basic idea (macOS only for now): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # There are other ways to install dk0 but for now use this =E2=94=82 $ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc =E2=94=82=20 =E2=94=82 # Then invoke a fully-qualified target to build `or-tools` =E2=94=82 # which will quickly download precompiled artifacts =E2=94=82 $ dksrc/dk0 --trial get-object NotInriaParkas_Caml.ORTools@9.15= .0 \ =E2=94=82 -s Release.Darwin_arm64 -d target/ocaml-ortools-arm64/ =E2=94=82=20 =E2=94=82 # See what is there =E2=94=82 $ tree target/ocaml-ortools-arm64 --filelimit 5 =E2=94=82 target/ocaml-ortools-arm64 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 include [33 entries exceeds fileli= mit, not opening dir] =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 shared =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 lib [262 entries excee= ds filelimit, not opening dir] =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 static =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 lib [131 entries exceeds filel= imit, not opening dir] =E2=94=82 # ... =E2=94=82 $ du -sh target/ocaml-ortools-arm64 =E2=94=82 464M target/ocaml-ortools-arm64 =E2=94=82 # ... =E2=94=82 $ find target/ocaml-ortools-arm64 -name 'libortools*' =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.9.15.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.15.= so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.9.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.so =E2=94=82 target/ocaml-ortools-arm64/static/lib/libortools.a =E2=94=82 target/ocaml-ortools-arm64/static/lib/libortools_flatzinc.a =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 /`or-tools' is just a proof of concept to test my CMake package. I know little about `or-tools'! I just picked it because it was the C library being discussed last week./ Calling a build target looks at first like installing a package: =E2=80=A2 you get a 125MB compressed download of precompiled `or-tools' libraries. In this case those libraries have been packaged to follow OCaml conventions (both static and shared libraries are present, and `.so' extensions instead of `.dylib' on macOS) =E2=80=A6 the same thing= you expect when you use depexts. But `dk0' is a build tool. So if you change to a set of parameters that has not been precompiled like so: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 rm t/d/val.1/j* # hack for bug https://github.com/diskuv/dk/iss= ues/98 =E2=94=82=20 =E2=94=82 dksrc/dk0 --verbose -I dksrc/etc/dk/v --trial \ =E2=94=82 get-object NotInriaParkas_Caml.ORTools@9.15.0 \=20 =E2=94=82 -s Release.Darwin_x86_64 -d target/ocaml-ortools-intel/ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 the build will happen locally (~1 hour on an M1). This style of build system may be unfamiliar. So my analogies would be: =E2=80=A2 a `nix' binary cache with overlays (I haven't personally used `nix'); JSON and Lua serve the same purpose as the Nix language, or =E2=80=A2 an Internet-accessible dune cache that everybody can use; JSON = and Lua serve the same purpose as dune files and dune `(rule ...)' expressions. The CMake package limitations as of 2026-02-12 =E2=80=A6 but scroll down = in this thread to see if I have posted an update: =E2=80=A2 I haven't had the time to complete dk0 packages for C compilers= , so the CMake package is incomplete. CMake + Ninja discovers C compilers on macOS trivially, and last week's threads were discussing macOS, so I prioritized macOS with xcode. =E2=80=A2 I tested the CMake package on Apple Silicon. Windows is partial= ly tested but don't use Windows yet. =E2=80=A2 There is no integration with opam or dune yet. Thanks! =E2=80=94 [`CommonsBase_Build.CMake0@3.25.3'] [`CommonsBase_Build.Ninja0@1.12.1'] [`NotGoogleDev_OR.Tools.F_Lib@9.15.0'] [`NotInriaParkas_Caml.ORTools@9.15.0'] Building your own packages =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=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 /This is bonus material for those thinking about building dk0 packages/ The JSON build file for `NotInriaParkas_Caml.ORTools@9.15.0' is `NotInriaParkas_Caml.ORTools@9.15.0' uses the C library package `NotGoogleDev_OR.Tools.F_Lib@9.15.0'. Its Lua build file is . And `NotGoogleDev_OR.Tools.F_Lib@9.15.0' uses the tool package `CommonsBase_Build.CMake0.F_Build@3.25.3'. You can use a command line variation of it (`CommonsBase_Build.CMake0.Build@3.25.3') without any JSON or Lua build files =E2=80=A6 here is an example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 dksrc/dk0 --trial run CommonsBase_Build.CMake0.Build@3.25.3 ins= talldir=3Di/llama-cpp \ =E2=94=82 > 'mirrors[]=3Dhttps://github.com/ggml-org/llama.cpp/archiv= e/refs/tags' \ =E2=94=82 > 'urlpath=3Db7974.zip#be9d624603e39cd4edee5fa85e8812eb8e13= 93537c8e4e4629bc4bd016388053,29881192' \ =E2=94=82 > 'nstrip=3D1' 'gargs[]=3D-DBUILD_SHARED_LIBS:BOOL=3DOFF' \ =E2=94=82 > 'exe[]=3Dbin/*' \ =E2=94=82 > 'out[]=3Dbin/llama-quantize' \ =E2=94=82 > 'outrmglob[]=3Dtest-*' 'outrmglob[]=3D*.py' \ =E2=94=82 > 'outrmglob[]=3Dllama-[a-p]*' 'outrmglob[]=3Dllama-[r-z]*'= \ =E2=94=82 > 'outrmexact[]=3Dinclude' 'outrmexact[]=3Dlib' =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 With that single command, `CommonsBase_Build.CMake0.Build@3.25.3' will download the popular C package `llama.cpp', build a static library, remove several of its artifacts, and install what remains (especially bin/llama-quantize) into the `i/llama-cpp' directory. Then type `i/llama-cpp/bin/llama-quantize --help' to run what you just built. If you want to make your own CMake-based package for OCaml, work backwards from that explanation: 1. use the command line first to build a CMake project. It will do the download, and run the `cmake -G', `cmake --build', `cmake --install' on your behalf. The `dk0' error messages usually print with helpful recommendations, and look at the top of [`CommonsBase_Build.CMake0@3.25.3'] for documentation. 2. then make a Lua build file to package it for C. You'll make a Lua function ("rule") to set the command line arguments (what you tested in the last step). At minimum, you need your Lua rule to say how to get static vs shared libraries (you need both), and what CMake flags to use for what platforms. 3. then make a JSON build file to package it for OCaml. Again, rely on the `dk0' error messages. 4. then make a GitHub Actions job to distribute it. Here is the GitHub Actions job for one of today's announced packages: . On success, GitHub Actions will print the import commands you can run so all the precompiled artifacts are available on your desktop. [`CommonsBase_Build.CMake0@3.25.3'] Neocaml-mode (A modern Emacs major mode for OCaml) is looking for testers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Bozhidar Batsov 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 Hey everyone, Just wanted to let you know I=E2=80=99ve spent a bit of time polishing [neocaml] and I think now it=E2=80=99s ready to be used (or at least test= ed) by more people. The font-locking and indentation are more or less done, and there=E2=80=99s also a basic integration with OCaml toplevels. Coupled with something like `ocaml-eglot' the existing functionality should get you pretty far. You=E2=80=99ll still have to install it from the GitHub repo (you=E2=80= =99ll find detailed instructions there), but I=E2=80=99ve also opened a MELPA recipe= PR, so I hope the installation process will become simpler soon. Feel free to share feedback and feature requests here and over at GitHub! P.S. I know the name is a bit controversial (some people said it evokes nvim vibes), and the down the road I may just rename it to ocaml-mode or try to merge it with Tuareg. Naming remains hard=E2=80=A6 [neocaml] Bozhidar Batsov later added =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 A couple of small updates: =E2=80=A2 Neocaml is now on MELPA =E2=80=A2 I wrote a short blog post about the first =E2=80=9Cofficial=E2= =80=9D release YOCaml, a framework for static site generator =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=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, Xavier Van de Woestyne 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=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 *[ANN] YOCaml 3.0.0* It had been a while since we announced a release of YOCaml (since `2.5.0'), but this weekend we released version `3.0.0' (already available on OPAM)! Since version `2.5.0', many changes have been made to YOCaml, which you can read about in the release notes for the various versions released over the months: ([`2.6.0'], [`2.7.0'], [`2.8.0']). Some major innovations that can be noted are: =E2=80=A2 YOCaml finally deletes files that it did not create, which allo= ws for intermediate build steps that construct finer caches (making it possible, for example, to create [backlinks] or [transclusions]) ([yocaml#108]) =E2=80=A2 As mentioned by @benfaerber, adding `yocaml_liquid' as an alternative template engine. ([yocaml#101]) =E2=80=A2 Major improvements to the validation/projection language (and greater rigour in the concept of validation/normalisation) ([yocaml#98], [yocaml#109], [yocaml#115]) =E2=80=A2 Greater control over the iteration logic of actions, allowing recursive traversal of file system fragments, among other things ([yocaml#111]). =E2=80=A2 _Last but not least_, in this poorly named PR, [yocaml#120], we added the possibility for a task to create multiple files and replaced the internal representation of time. Previously, we used integers, but now we have switched to floats, which offer greater precision (and allow CI to correctly execute CRAM tests that generate sites). In addition, there are bug fixes, usability improvements, and=E2=80=A6 **a drastic improvement in error reporting**, which I will explain in the next section! [`2.6.0'] [`2.7.0'] [`2.8.0'] [backlinks] [transclusions] [yocaml#108] [yocaml#101] [yocaml#98] [yocaml#109] [yocaml#115] [yocaml#111] [yocaml#120] About the Outreachy =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=95= =8C=E2=95=8C=E2=95=8C Many of the improvements to YOCaml were made possible thanks to various participants in the [Outreachy programme], which led to @Linda_Njau being selected as an intern! His work is divided into two specific areas: =E2=80=A2 Drastically improve YOCaml error reporting : [yocaml#113], [yocaml#114], [yocaml#116]. Before these patches, YOCaml errors were extremely difficult to diagnose. Since @Linda_Njau took care of them, they are now easier to read, provide context (which file failed to create, and which file was being read), and are displayed in the preview server, so you don't have to go and read the terminal! =E2=80=A2 The second part of his internship involves working on [yocaml-codex], a project currently under development that aims to provide a standard library of templates for building websites faster with YOCaml and sharing the various templates that have been written over the course of the websites developed with YOCaml. _Stay tuned_! We are very satisfied (and impressed) with her work, and she has documented her contributions in a blog=E2=80=A6 freshly designed, with YO= Caml, of course: [Outreachy programme] [yocaml#113] [yocaml#114] [yocaml#116] [yocaml-codex] About the tutorial =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=95= =8C=E2=95=8C The tutorial is progressing slowly but surely, and we have notably added a section that describes how to validate/project data to work with most description languages (such as Yaml, ToML, etc.) and most template engines (Jingoo, Mustache, Liquid) : [Your Own Data Model] We also took the opportunity to clarify the [use of file paths] and document [the resolver technique]! We will continue to write sections and document the use of YOCaml, so if you have any suggestions, comments, or requests, please send them to us! [Your Own Data Model] [use of file paths] [the resolver technique] Closing words =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 In September last year, I gave a very clumsy (_so French_) [presentation of YOCaml at Fun OCaml] which presents YOCaml's design choices! YOCaml is becoming increasingly usable thanks to the [contributions of many people]! Thank you. If you want to create a static blog/website in OCaml, YOCaml is one of many fun options! =E2=80=A2 [Repository] =E2=80=A2 [Release note] =E2=80=A2 [Packages] =F0=9F=90=AB _Happy hacking and blogging_ =F0=9F=90=AB [presentation of YOCaml at Fun OCaml] [contributions of many people] [Repository] [Release note] [Packages] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =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 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Day10: opam package testing tool] =E2=80=A2 [Tessera pipeline in OCaml] =E2=80=A2 [.plan-26-07: Storage, Lego, Echo, and the IUCN] =E2=80=A2 [Neocaml 0.1: Ready for Action] =E2=80=A2 [The 15-Game] =E2=80=A2 [Optimizing an MP3 Codec with OCaml/OxCaml] =E2=80=A2 [Announcing New Wasm_of_ocaml Optimisations] [the ocaml.org blog] [Day10: opam package testing tool] [Tessera pipeline in OCaml] [.plan-26-07: Storage, Lego, Echo, and the IUCN] [Neocaml 0.1: Ready for Action] [The 15-Game] [Optimizing an MP3 Codec with OCaml/OxCaml] [Announcing New Wasm_of_ocaml Optimisations] 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 February 10 to 17, 20= 26.

trace 0.11

Simon Cruanes announced

Dear all, I'm delighted to announce the release of trace 0.11. This is= a major release and hopefully the last one before 1.0.

trace is a li= ghtweight foundation for instrumentation, a bit like rust's tracing. It provides a protocol between, one the one hand, libraries and applica= tions that are instrumented; and a collector that decides what to do with that. My hope is that projects (especially = libraries) can adopt trace without fear because of the tiny fo= otprint and high flexibility, the same way logs is used in man= y places. Existing collectors can produce chrome form= at traces, fuchsia traces, plug into tracy, or into opentelemetry; a bridge to Runtim= e_events is planned[^1].

[^1]: trace is more flexible than Runtime_events and works on = OCaml 4, but of course it should be possible to have both interoperate!

API docs for the main library

brief example

A simple example program from the readme:

let (let@) =3D (@@)

let run () =3D
  Trace.set_proce=
ss_name "main";
  Trace.set_threa=
d_name "t1";

  let n =3D ref 0 i=
n

  for _i =3D 1 to 50 do
    let@ _sp =3D Trace.with_span ~__FI=
LE__ ~__LINE__ "outer.loop" in
    for _j =3D 2 =
to 5 do
      incr n;
      let _sp =3D Trace.with_span ~__F=
ILE__ ~__LINE__ "inner.loop" in
      Trace.messa=
gef (fun k -> k "h=
ello %d %d" _i _j);
      Trace.messa=
ge "world";
      Trace.count=
er_int "n" !n;
    done
  done

let () =3D
  (* here we setup the collector=
 *)
  let@ () =3D Trace_tef.with_setup=
 ~out:(`File "trace.j=
son") () in
  run ()

If we run the program with TRACE=3D1 to enable this particular= collector, we get a trace file in trace.json (but with actual= timestamps):

[{"pid":2,"name":"process_name","ph":"M","args": {"name":"main"}},
{"pid":2,"tid": 3,"name":"thread_name","ph":"M","args": {"name":"t1"}},
{"pid":2,"cat":"","tid": 3,"ts": 2.00,"name":"hello 1 2","ph":"I"},
{"pid":2,"cat":"","tid": 3,"ts": 3.00,"name":"world","ph":"I"},
{"pid":2,"tid":3,"ts":4.00,"name":"c","ph":"C","args": {"n":1}},
=E2=80=A6

Opening it in https://ui.perfetto.dev we get something like this:

screenshot of perfetto UI

what's new in 0.11

0.11 contains major changes, almost all of which are breaking on the collector side. Instrumented programs should b= e mostly unaffected, aside from many deprecation warnings.

The core change is that Trace.span is now an open sum type, and not int64. This means l= ess global state and fewer tables needed: collectors can pick exactly what = data gets carried from the enter_span site into the exit= _span site, if any. In turns, collectors get simpler and faster. The= notion of "manual" span is now dead (a simple alias to normal spans) and a= ll related functions are deprecated. 1.0 will not have this notion at all.

In addition, collectors are now a bag of callbacks+a sta= te, rather than a first class module. trace.subscriber has= been removed because the notion of subscriber is subsumed by the notion of= collector (now more easily composable). The TEF and fuchsia collectors are= now simpler and free of global state.

user_data is now a polymorphic variant to, for better ease of = use. Metrics are an open sum type, and the previous int and float cases are just provided as constructors of this type. Depe= ndencies on thread-local-storage and hmap are now= entirely gone.

organization note

Note: the project has moved from my gh account (c-cube) to a dedicated orga= nization ocaml-tracing fo= r telemetry and tracing projects. Other projects such as opentelemetry have also = migrated there.

Bogue, the OCaml GUI

OCaml examples of computing with encrypted or private data

Xavier Leroy announced

Last Fall, I gave a series of lectures on secure computing (computing with encryp= ted or private data).

Here is some companion OCaml code that demonstrates these techniques: https://github.com/x= avierleroy/secure-computing .

If you're curious about homomorphic encryption, zero-knowledge proofs, secu= re multi-party computation, oblivious transfers, private set intersection a= nd so on, you might enjoy these code examples and the explanations given in= the lectures.

This code is probably insecure and not intended to be used in actual high-s= ecurity applications. If you're into this kind of things, see Belenios, an excellent e-voting system writte= n in OCaml that uses many of these secure computing techniques.

CMake, Ninja and Google or-tools packages

jbeckford announced

It is my pleasure to announce the following packages for (https://discuss.ocaml= .org/t/ann-the-dk0-build-system/17709):

These packages are my start to a clean replacement for opam de= pexts. depexts does not work well for me: basic enginee= ring (reproducibility) is gone, system packages often are too far behind th= eir upstream versions, the complete unavailability for Windows users, the o= ccasional symlink break with homebrew, etc.

Here's the basic idea (macOS only for now):

# Th=
ere are other ways to install dk0 but for now use this
$ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc

# Then invoke a fully-qualified target =
to build `or-tools`
# which will quickly download pr=
ecompiled artifacts
$ dksrc/dk0 --trial get-object NotInriaParkas_Caml.ORTools@9.15.0 \
  -s Release.Darwin_arm64 -d target/ocaml-ortools-arm64/

# See what is there
$ tree target/ocaml-ortools-arm64 --filelimit 5
target/ocaml-ortools-arm64
├── include  [33 entries exceeds filelimit, not opening d=
ir]
├── shared
│   └── lib  [262 entries exceeds filelimit, not op=
ening dir]
└── static
    └── lib  [131 entries exceeds filelimit, not opening =
dir]
# ...
$ du -sh target/ocaml-ortools-arm64
464M    target/ocaml-ortools-arm64
# ...
$ find target/ocaml-ortools-arm64 -name 'libortools*'
target/ocaml-ortools-arm64/shared/lib/libortools.9.15.so
target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.so
target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.15.so
target/ocaml-ortools-arm64/shared/lib/libortools.9.so
target/ocaml-ortools-arm64/shared/lib/libortools.so
target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.so
target/ocaml-ortools-arm64/static/lib/libortools.a
target/ocaml-ortools-arm64/static/lib/libortools_flatzinc.a

or-tools is just a proof of concept to test my CMake packag= e. I know little about or-tools! I just picked it because it w= as the C library being discussed last week.

Calling a build target looks at first like installing a package:

  • you get a 125MB compressed download of precompiled or-tools libraries. In this case those libraries have been packaged to follow OCam= l conventions (both static and shared libraries are present, and .so<= /code> extensions instead of .dylib on macOS) … the sam= e thing you expect when you use depexts.

But dk0 is a build tool. So if you change to a set of paramete= rs that has not been precompiled like so:

rm t/d/val.1/j* # hack for bug https://github.com/diskuv/dk/issues/98

dksrc/dk0 --verbose -I dksrc/etc/dk/v --trial \
  get-object NotInriaParkas_Caml.ORTools@9.15.0 \ 
  -s Release.Darwin_x86_64 -d target/ocaml-ortools-intel/

the build will happen locally (~1 hour on an M1).

This style of build system may be unfamiliar. So my analogies would be:

  • a nix binary cache with overlays (I haven't personally use= d nix); JSON and Lua serve the same purpose as the Nix languag= e, or
  • an Internet-accessible dune cache that everybody can use; JSON and Lua = serve the same purpose as dune files and dune (rule ...) expre= ssions.

The CMake package limitations as of 2026-02-12 … but scroll down in = this thread to see if I have posted an update:

  • I haven't had the time to complete dk0 packages for C compilers, so the= CMake package is incomplete. CMake + Ninja discovers C compilers on macOS = trivially, and last week's threads were discussing macOS, so I prioritized = macOS with xcode.
  • I tested the CMake package on Apple Silicon. Windows is partially teste= d but don't use Windows yet.
  • There is no integration with opam or dune yet.

Thanks!

Building your own packages

This is bonus material for those thinking about building dk0 packages

The JSON build file for NotInriaParkas_Caml.ORTools@9.15.0 is = https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/N= otInriaParkas_Caml/ORTools.values.jsonc

NotInriaParkas_Caml.ORTools@9.15.0 uses the C library package = NotGoogleDev_OR.Tools.F_Lib@9.15.0. Its Lua build file is https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev_= OR/Tools.values.lua.

And NotGoogleDev_OR.Tools.F_Lib@9.15.0 uses the tool package <= code>CommonsBase_Build.CMake0.F_Build@3.25.3. You can use a command = line variation of it (CommonsBase_Build.CMake0.Build@3.25.3) w= ithout any JSON or Lua build files … here is an example:

dksrc/dk0 --trial run CommonsBase_Build.=
CMake0.Build@3.25.3 installdir=3Di/l=
lama-cpp \
  >   'mirrors[]=3Dhttps://github.com/gg=
ml-org/llama.cpp/archive/refs/tags' =
\
  >   'urlpath=3Db7974.zip#be9d624603e39=
cd4edee5fa85e8812eb8e1393537c8e4e4629bc4bd016388053,29881192' \
  >   'nstrip=3D1' 'gargs[]=3D-DBUILD_SHARED_LIBS:BOOL=3DOFF' \
  >   'exe[]=3Dbin/*' \
  >   'out[]=3Dbin/llama-quantize' \
  >   'outrmglob[]=3Dtest-*' 'outrmglob[]=3D*.py' \
  >   'outrmglob[]=3Dllama-[a-p]*' 'outrmglob[]=3Dllama-[r-z]*' \
  >   'outrmexact[]=3Dinclude' 'outrmexact[]=3Dlib'

With that single command, CommonsBase_Build.CMake0.Build@3.25.3 will download the popular C package llama.cpp, build a stati= c library, remove several of its artifacts, and install what remains (espec= ially bin/llama-quantize) into the i/llama-cpp directory. Then= type i/llama-cpp/bin/llama-quantize --help to run what you ju= st built.

If you want to make your own CMake-based package for OCaml, work backwards = from that explanation:

  1. use the command line first to build a CMake project. It will do the dow= nload, and run the cmake -G, cmake --build, cmake --install on your behalf. The dk0 error messages= usually print with helpful recommendations, and look at the top of CommonsBase_Build.CMake0@3.25.3 for document= ation.
  2. then make a Lua build file to package it for C. You'll make a Lua funct= ion ("rule") to set the command line arguments (what you tested in the last= step). At minimum, you need your Lua rule to say how to get static vs shar= ed libraries (you need both), and what CMake flags to use for what platform= s.
  3. then make a JSON build file to package it for OCaml. Again, rely on the= dk0 error messages.
  4. then make a GitHub Actions job to distribute it. Here is the GitHub Act= ions job for one of today's announced packages: https://github.com/diskuv/dk/blob/7b1942596= 9be61bed0f1d6bf3015dac26d7966e1/.github/workflows/distribute-2.5.yml#L282-L= 364. On success, GitHub Actions will print the import commands you can = run so all the precompiled artifacts are available on your desktop.

Neocaml-mode (A modern Emacs major mode for OCaml) is looking = for testers

Bozhidar Batsov announced

Hey everyone,

Just wanted to let you know I=E2=80=99ve spent a bit of time polishing neocaml and I think now it= =E2=80=99s ready to be used (or at least tested) by more people. The font-l= ocking and indentation are more or less done, and there=E2=80=99s also a ba= sic integration with OCaml toplevels. Coupled with something like oca= ml-eglot the existing functionality should get you pretty far.

You=E2=80=99ll still have to install it from the GitHub repo (you=E2=80=99l= l find detailed instructions there), but I=E2=80=99ve also opened a MELPA r= ecipe PR, so I hope the installation process will become simpler soon.

Feel free to share feedback and feature requests here and over at GitHub!

P.S. I know the name is a bit controversial (some people said it evokes nvi= m vibes), and the down the road I may just rename it to ocaml-mode or try t= o merge it with Tuareg. Naming remains hard=E2=80=A6

Bozhidar Batsov later added

A couple of small updates:

YOCaml, a framework for static site generator

Continuing this thread, Xavier Van de Woestyne announ= ced

[ANN] YOCaml 3.0.0

It had been a while since we announced a release of YOCaml (since 2.5= .0), but this weekend we released version 3.0.0 (alread= y available on OPAM)!

Since version 2.5.0, many changes have been made to YOCaml, wh= ich you can read about in the release notes for the various versions releas= ed over the months: (2.6.0, 2.7.0, 2.8.0).

Some major innovations that can be noted are:

In addition, there are bug fixes, usability improvements, and… a drastic improvement in error reporting, which I will explain in = the next section!

About the Outreachy

Many of the improvements to YOCaml were made possible thanks to various par= ticipants in the Outreachy programme= , which led to @Linda_Njau being selected as an intern! His work is div= ided into two specific areas:

  • Drastically improve YOCaml error reporting : yocaml#113, yocaml#114, yocaml#116. Before these patches, YOCaml errors= were extremely difficult to diagnose. Since @Linda_Njau took care of them,= they are now easier to read, provide context (which file failed to create,= and which file was being read), and are displayed in the preview server, s= o you don't have to go and read the terminal!
  • The second part of his internship involves working on yocaml-codex, a project currently und= er development that aims to provide a standard library of templates for bui= lding websites faster with YOCaml and sharing the various templates that ha= ve been written over the course of the websites developed with YOCaml. Stay tuned!

We are very satisfied (and impressed) with her work, and she has documented= her contributions in a blog… freshly designed, with YOCaml, of cour= se: https://engineering-yocaml-with-linda.netlify.app/articles/s= econd_article

About the tutorial

The tutorial is progressing slowly but surely, and we have notably added a = section that describes how to validate/project data to work with most descr= iption languages (such as Yaml, ToML, etc.) and most template engines (Jing= oo, Mustache, Liquid) : Your Own Data Model

We also took the opportunity to clarify the use of file paths and document the resolver technique!

We will continue to write sections and document the use of YOCaml, so if yo= u have any suggestions, comments, or requests, please send them to us!

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.

--=-=-=--