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=hHOfPluk; 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=TBvNMhCd; 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 D662440068 for ; Tue, 27 May 2025 09:22:25 +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=kQjXlTXOxEY/IzOmdS/gUVmPmFFcZYJ02LDEo+Su3u8=; b=hHOfPlukv6UFCL1oaQUSTMudOawZxncDgPT4wq9J2UBM3dpdbZE8+jRx k4lUep64dOWQ4VT754CwEI+3vWp2JbvCGPp0C7h0pTwg0Bjh+oxsXVMeF tm7ZjMv25IhflL/1D+Go3itBqe6CWqhnv+/EZxqH3aCEHg22WLyNSCeCw M=; 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 (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,318,1739833200"; d="scan'208,217";a="224095407" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 May 2025 11:22:24 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 5026AE0CCE; Tue, 27 May 2025 11:22:24 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 0E23EE0131 for ; Tue, 27 May 2025 11:22:21 +0200 (CEST) IronPort-SDR: 6835844b_EM2EOALBqE3cFwnK/QbxB/w81rSnelmneIrRsiuw/3W8oKF QYntWIAWcyBkGxoAoPmL8wjoVLZ7QUq5L9Ewh0g== X-IPAS-Result: =?us-ascii?q?A0G6CQCVgzVojyIeaIFaHgE8DAILgWqBP1soGQFkWhEiB?= =?us-ascii?q?whJhFWBY4FsjiKCQAGPCoY1gTuDCYFpgREDGBYFHhQBAwENLgEbBAECBAEBA?= =?us-ascii?q?wECAUOBSYFaVEYCi1MCHwYBBDQTAQIEAQEBAQMCAwEBAQEBARABAQUBAQECA?= =?us-ascii?q?QECBAYBAhABAQEBAQE5BUmFQQEGATINSQEBAQMBCgGBalFBMGUJBgEBAQEBA?= =?us-ascii?q?QEBAScBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAggEAYEeAQgEBhMBASYSGCMDFAEGAwIRATUXARIaghBYAYIiSgMFDAaTM?= =?us-ascii?q?JtLen8zgQGCDAEBBoEIPgEBAgoBBgEOCSbaCYFLGgmBSYVtgkkaAQUlSGsCh?= =?us-ascii?q?EgJggCBFCR7Jw+BVUSBSoFzAVBvgVJ4FwEBAQEBF0REHAEBCAk8CYMlgmmCE?= =?us-ascii?q?RdEPhQdJhIrQIELUYEIhCyBPhKDQYI/IIEtRYIOJ1CKNoFHSzMsAVUTFwsHB?= =?us-ascii?q?VuBCAMqNDFuMh2CDYUZghKCB4kBhEkrT4UigSaDd0ADC209NxQbl2ocJhqBP?= =?us-ascii?q?oE8JAIIBjgGAQENHx8UAQIEAxEOBQgMCA4CIg0hCA4LCgUFCwgDBRQRCAQJD?= =?us-ascii?q?gQhBgEBEgUGCwYHFAgRA5JlAhUdDQN0nHCTVx1tNAeEHoFeBgyJB4EmlgKEB?= =?us-ascii?q?IFXizWYamYimGEigjaHJ4EmCYFvHkwWlUEEBAsNDwqFIIF/I4ErAR0MBzMaM?= =?us-ascii?q?EMNEYIVAQEBMQkKPBwPiniBLIFbLhaBEgEJgkJBfYEmgXQ7xSUDQTUCAQE4A?= =?us-ascii?q?gcBCgEBAwmFYgEBaYIbghduhCYygUsBAQ?= IronPort-PHdr: A9a23:jtMKGxKgp4BH37VA1dmcuLxpWUAX0o4c3iYr45Yqw4hDbr6kt8y7e hCEvrM11BSQDNSKo7Ic0qyK6PqmATRBqb+681k8M7V0FCU5wf0MmAIhBMPXQWbaF9XNKxIAI cJZSVV+9Gu6O0UGUOz3ZlnVv2HgpWVKQka3OgV6PPn6FZDPhMqrye+y54fTYwJVjzahfL9+N hq7oAvfu8UMnYduNqk9xgbNr3ZMf+ld2GdkKU6Okxrm6cq98oBv/z5Mt/498sJLTLn3cbk/Q bFEAzsqNHw46tfsuRffUwWE+2ESUn8RkhpGAgjF6A/1U5LsuSbkteRzxTeXM9TuQb87RTqt4 aFrSAT1iCgcLD427HvXis1rg61Fph+qugFyzJTVYIGRM/p+Y7/dcNYHTmdPQspdSypMCZ67Y IUSEuoBJv5YoJfhqFsSoxW+AgysC/nuyj9Om3T62aI33uAkHQzAwQcuHc8BsG7Modv1KqkcT O67wqrHwjrfdP5Zwyvx5ZLSfxw9vf2BX7R9etfRx0k1EAPFi02dpJDhPzyP0OQGrnWV4PZgV eKqim4ntx1xqSWoy8g2jonGnIQVxkrf9SplwIY1INy4SFJnYdO/CJtQsCWaNotqQsw8X25ou CA6yrwfuZ6mYicG0pMnxwTQa/GedYWD/x3sWvqLLzhimHJlZKywhwy08UW4xODxVs253VVXo iZZjtXCuXEA2h3d58SbVvdz/lmt1SuB2gzN5O9JIkE5mKXUJZMgwrM9kpodvVnMEyL1hEn7k qmbfVgq9Oiv7uToeLTmppmEOo9slA7+LqUumtChDuQgNQgOWm2b9vqm2L3l40L5XK1Gjvoqn abDtZDaId4XpqmjAw9ayooj5Be/Dyum0NQFhnYLNk5KeBWCj4TxNFHOIez4Dfeig1u3ijtrx vfGMqXkApXMNHjMirjhcqhn505dzwo/1d9f55NICrEBPfL8QVX9uMbEAR8+Ngy42+fnCNNn1 oMfQ22DGKGZMLnKvV+P/uIgPe+Ma5QOuDngMfQl4OTujXAhlV8SfKmpwZ8XZ2qjEfh8IkWZZ mLggtAdHmgQuwo+SPTqiEeFUTJJe3myWKc86iknB4KnF4vMW56igKKZ0CunApFbYnlKCkqWE XvxcIWEXe4AZziILc97jjMEVbmsRoA72RGrqQD206FnLuvJ9S0br57j0N916PHJmhE27TB0C tqS032XQGFwhmwHXCU507x8oUNjzFeMzLJ0g/lcFdBL4PNGTh01NZvYz+BgEdzyXRjBftiRR Fm9WNqmHSoxTtUvw9MUf0l9HNCigxbe1CSpG78Yj6GHCIIw/67GwnT9O8lwx2zI2aU9lVUrT MRCOXW7iqNx6gTfHZDFnkWWmqqwa6gQwTTB+HmMwGeKukxTTRB9UaHYXXAEekvZs8756F7DT 76vF7sqKhdNxMifIaVQcNLpl09JRPL7NdTefW2xn2CwCA6NxrKDcYbmYX0d3CLZCEkEjwAc4 2qJNQg4BiegumLeESJhGUjoY0P2/ulysHK7TkkqwAGWd0BtyqS59xoPifCBV/8e0agItSk9p zluEluw0MraC9+aqApgeKVcb8k94FBC1W/BqgJzIoGuI7x6i1IDbwp5ul3i2g11BYtGicUqt HQqzA5yKKKEzlxOazOY3ZbxOr3ON2n94gqja6nM2lHRyNuZ4KMP5+4+q1n5pwGmCkoi83Bm0 9lJz3uR/Y7FDA0PUZL3Tkk46QN6q6vfYiQy6ILYz3psMbO7sjPa3dImH/Mqygy8cNdHLKOEC AjyHtUHC8S2Muwlh0Cpbg4YPOBV7KM7I9mpd/6C2KKyOOZgnSmmjXhc7YBm0kOM8jJ8RfTS0 5YExfGYxAqHWC3mgFevqMCk0bxDMHsWAWz1gXzgG4h5YrJ0O4AGFTHqa8a+w9E7g5/2R1ZZ8 kSiDhUIwpyHYx2XOnX51AsY7k8XpH27hWPsxjh9lXcypaqa3TDS6/zlcAsbN2VLQmh7kFqqJ pK72YNJFHO0ZhQkwUP2rX3xwLJW8fguR4GyaUJBfiysanpnTrP1rL2JJchG9JIvtyxTFuW6e 1GTDLDn8FMByy22OWxYyXggci2y/I3jlklzjGubam14rH/YZd1Y3RDb9cDRTv5X3yMbSW9/k zaETkOkMYyR9M6P34zGrvj4UmugUpNJdiy+9rm77H7i304wVCybyui0nsz7HAM61y7iytQsU j/H+R/4a4+tzK+6NON7YmFiA0L64MdhXIQigs03np5DkWMCiMCt9GEc2Xz2Lc0d2a/6ay8VQ iUXxtfO/AX/8EhzdzSRwIboSniWws1gfsS3JGQM1UrR9uhsD6GZpPxBlCpx+B+jqB7JJOJ6l XEbwOcv73gTh6cIvhAsx2OTGOJaG04QJiHqmxmSirL25KxKeGaid6Sx30tijJigCr+FuARVR Hf+fN8rAyZx6sx1NF+E3mf078nof9zZbNRbsRPx8V+IhuxcLtQqnfoPhDZ7EXr6uWw5xuU7i x13wJz8u5KIai1s8K+/Hh9EJ2jtfcpAn1Olxa1an8uQw8WuBsA4QGRNBcO0C6nwVmlO5pGFf 06UHTYxq2mWA+/aFA6bsgJ9qm7XVoqsPDeRLWUYytNrQF+cIlZeiUYaRmZf/NZxGwa0ycjma Eo86CoW4wuykSF3krcxDTqlB1b78R+vbiYoRZOfKhtP8wwE4F3aZMWa5+Q1BCpY+5y9sCSHL XGdbAlTS2RVSgqDHV+pbdzMrZHQtvOVAOazNa6EaLGHr6pFXPeNxI6z+pNh+yeQO86POHh7E vB93VBMFyMceYyRi3AETCoZkDjIZsiQqUKn+yF5mcu49eziRAPl4Ybn56J6Cdx04Fj2hK6CM 7TVnyNlMXNC0ZhKw3bUyb8Z1VpUiid0djDrH65S/SLKSavRnOdQAXt5I2tIDvAQuvsG/VMYC OqOktTxx6J1hf4zCk5YWBrmgM78bMgDJSemP1PCBVqXHL6BODvAztqxZP+sD7pKg4A2/1W8t C2aHEnqIjmY32CzBlb2ab0K13ndZ0AWsZr1aht3DGn/UN/qIga2NtN6l3xTo/V8h3/HM3IdL SkpdkpMqrOK6iYLyv57GmFH8j9kNbzdwXfftrGEbM1O96A3UUEW36pA7X83yqVY9nRBTf1xw m7Jq8J25kuhma+JwyZmVxxHrnBKgpiKtANsI/a8lNEIVHDa8RYK9WjVBQ4Noo4vMefU4/UJ8 PuVwZPXfS9F98PI8MAcAcnNNc/BN2AuZBPtETiSFwAFSD+3KUnVgFFbm/yJsHjJvt49sJemy /9sAvdLEUc4EP8XEBEvJ+Y5eMIuZBB+xI+/2dYP4WuioRLRQsRDo52BUeidVPzrITDflrJEY hoU3ZvyKpkVPYDgnUk+eh99houASC+yFZhd5yZmaAEzukBE9nNzG3Yy10zSYQSo+HYPFPSwk 01+mk5kbO8q7jup/0YvKw+Aun4riEdo04aA43jZYHvrIay3R40TFyfkqx17LMbgWwgsJU6zh RA2bW2VAesJ0/07LSYw1EefuIMTS6cGHOsdOENWnqnRPKhNsxwU6SS/mR0WvK2cU8IkylFsK Mbz5zFBw1wxNoZtfP6MfaYRnFEC2auD4336iOxukF1FfCNvuCvReTZW6hZQbuB0e3Okpr41u 13elzYRKjdXCfZ4/a41rgt4MuCEhUoMypZ7I1uqf6yaJqKd4S3bkNKQB0k33QUOnlVE+r5/1 YEidVCVXgYh1unZGxMMPMvEYQZbCqgavGDUZjqLuP7RzIhdOpXkUPjvSf6Sua0UhEO9AQtvG J4DpsgMBZij1kjEINyvdeRUj0x1uEKwfBPeULxAY3fp2H8frtu6zYNr0IUVPTwbDWhncG226 rvRug42ka+DUdMxMT8RWooJMG5zWdXvwnQI+S0YUH/siqRClFvnjXe0vCnbATjiYsA2Yf6VY UkpE9Sq4XAl9KPwj1fL85LYLmW8NNJ4u9aJ5/lJwvTPQ/5SU7R5tF/R3odCQHn/GVX1Kobgf qLTMdwdSYnsDXKrTlG0izQ0Vtr8etG3If2BhQjuA51fsIyawCwLP8igEDoTAFF1+/FF47hzL 15mAdJzcVvzugIyOrbqah+fycmrSn2xJCF+SukGi/29Y61LwiEsaO6j1XZmSYs1hbrSkwZFV NQBiRfQwuymbo9VXH3oG3BTTA7IoDIwi2lrMuthivd62h7DtkMQdiyabOE8InIRpMkyXBnBR Bc+Qnp9XVKXipDPpxKhz6xHtTUIhM5aiKVM+D33upuVCNpDcKastJPevjFmaIQ25aprPt66S iNjnIvZmi3DQZLQtAycTSP8EOBVyIA4yMNwRekR33kiPd0atIFB70soS8p4IKZAWvBEmw== IronPort-Data: A9a23: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 tVhD7bSyahFxI1sNGWq9Dg0 IronPort-HdrOrdr: A9a23:v6f0Cagx/t03ULGzSI+IgwnDxHBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: 9a23:P7auiWxtUGbU6LCbEtJwBgVIMOw/SWXwxUvaYHD7LWVnQeGyTFKfrfY= X-Talos-MUID: 9a23:rF5KaAgQu9QFPy/vNfmd4MMpMMRT3YP1Nwc3g642gsCudhNwOAudtWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,318,1739833200"; d="scan'208,217";a="224095379" X-MGA-submission: =?us-ascii?q?MDEztRq2szLppnPUqHD5Q6o+Yi7bxnoOiDcb/B?= =?us-ascii?q?ptm30D1fVRwLYOieKk8OOQwPYr6uiNt/g4tbsNrCBQ48TiwhhieOdcYx?= =?us-ascii?q?ty3Kgkb0A3bxVsM7YRcLWcPg+QjzQFrVfsW2ii2tY2g0tCN2NUvQkVN1?= =?us-ascii?q?tNl7zqNwiWZjVGtpFbJZG1qA=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; 27 May 2025 11:22:19 +0200 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 EECE7564B7B; Tue, 27 May 2025 11:22:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1748337738; bh=YWf9AXPyfVSzQ6AMp5gObj5TgP6hnyJe3VRxULEaJ1c=; h=From:To:Subject:Date:Message-ID; b=TBvNMhCd5mGGnkbqA3oaAZD0SW4jypMIK67P7iqNE1Xm+Uytq9/p0En3mJvOlz6jn 0vV/CJtXAhFiAiuVfDUI5LyYkBuHNJzWiqoirBNxryK1u3DQwIp6pLyDaRxiNb8xG0 4yagO0zZSNGVB9fwCJrMqBUuU84eISrqsmmSOdUk= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 27 May 2025 11:22:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 27 11:22:18 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499968, queueID=89EFF564B7C 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: 19326 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 May 20 to 27, 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 nanoev 0.1 15th MirageOS retreat May 13th - 20th MlFront_Signify 2.3.1 - OpenBSD-compatible signify Opam 103: Bootstrapping a New OCaml Project with opam, by OCamlPro Retirement of Multicore CI Pipelines Dune 3.19 Wrote a Record/Replay Debugging tutorial A no-maths guide to monads macOS Metal Framework bindings for compute applications Other OCaml News Old CWN nanoev 0.1 =E2=95=90=E2=95=90=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 Hello, I'm happy to announce the first release of [nanoev], yet another event loop abstraction. My goal with it is to have a narrow-waist interface between event loops (for now, `select' and `poll') and various abstractions built directly on top (for now using `picos'), without tying the event loop abstraction itself to a particular scheduler. The core interface for the event loop is basically: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type t =E2=94=82=20 =E2=94=82 val wakeup_from_outside : t -> unit =E2=94=82=20 =E2=94=82 val step : t -> unit =E2=94=82 (** Run one step of the event loop until something happens *) =E2=94=82=20 =E2=94=82 val close : t -> Unix.file_descr -> unit =E2=94=82 (** Close the file descriptor and clean it up *) =E2=94=82=20 =E2=94=82 val max_fds : t -> int =E2=94=82 (** Maximum number of file descriptors that can be observed at = once. *) =E2=94=82=20 =E2=94=82 val on_readable : =E2=94=82 t -> Unix.file_descr -> 'a -> 'b -> (closed:bool -> 'a -> 'b = -> unit) -> unit =E2=94=82=20 =E2=94=82 val on_writable : =E2=94=82 t -> Unix.file_descr -> 'a -> 'b -> (closed:bool -> 'a -> 'b = -> unit) -> unit =E2=94=82=20 =E2=94=82 val run_after_s : t -> float -> 'a -> 'b -> ('a -> 'b -> unit) = -> unit =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and nothing else. I've also started experimenting with using it to drive [tiny_httpd]. =E2=80=A2 docs: =E2=80=A2 release link: [nanoev] [tiny_httpd] 15th MirageOS retreat May 13th - 20th =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=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, gasche said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=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 just back from the [Mirage retreat], an event where people interested in [Mirage] meet for one week to work whatever they want. This retreat was organized by Hannes Mehnert as all past retreats, in Marrakech. Hannes ( @hannes ) asked participants to write a blog post to spread the word =E2=80=93 hence this post. [Mirage retreat] [Mirage] a Mirage retreat, in general =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=E2=95=8C=E2=95=8C The retreat is unlike most other professional events that I attend, typically academic conferences. We are hosted in a place that is otherwise used as a hostel within the medina, the old city centre of Marrakech. Bed comfort is minimal (a room of six people, two of them snoring), but there are people on-site who prepare food and the food is great. There is very little structure for the day: we had a meeting every morning after breakfast to mention what we had done the day before, and talk sessions in the evening (typically one or two talks for around 40 minutes). The participants come in all shapes, some are regular contributors to the Mirage ecosystem and some (like me) know very little about Mirage. Some (like me) are very familar with OCaml and others know little about the language. Some people know about networking, security, system administration, communication protocols. The lack of structure encourages people to wander around, for example sitting alongside someone doing something specific and precise, to try something you and learn along. Last time I ended up writing bits of a network driver in OCaml, despite knowing nothing about network drivers; this time I worked on model-based testing of filesystems (see ), despite knowing nothing about file system implementations. Morocco has better network connectivity than during my first retreats, but it remains somewhat flaky =E2=80=93 and our network-usage habits keep increasing. In particular, I could not attend any online meeting, and this was /very/ nice =E2=80=93 just like conferences, it is liberating to= be busy for one week uninterrupted. In the past I managed to adapt to low-network usage fairly well. This time I noticed that I depend on github a lot, and I don't know how to have a good offline or network-restricted experience, to do code-reviews in particular. I wish offline version-controlled tools for code-review and bugtracking were more widely employed. Overall I find this organization excellent: participants get a place and time to learn from each other. I think it could potentially be used for other topics. For example people mentioned that it could be interesting to have a retreat focused on documentation in the OCaml ecosystem, and I find the idea interesting. (The rest of this post is basically a narrated version of my work log for the week; please feel free to just skip it.) My OCaml-focused work =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 One of my projects for the week was to take the time to review large pull-requests on the OCaml compiler that I wouldn't dare attacking usually, because my agenda is perpetually full of other things. I did a first round of review on [structured diagnostics], and additional reads through most of the [modular explicits] pull request (PR). In particular I wrote a small manual section for modular explicits, submitted as a [separate PR]. I hope to have moved from "it would be nice if these were reviewed /someday/" to a more short-term phase where I try to get these past the finish line before moving to other topics =E2=80=93 but we never know. I also went through the lists of PRs I had been assigned to, sometimes a while ago. (OCaml triagers assign PRs to each other to keep track of them and try to bring them to a decision, but in practice we often forget to do this and they linger around.) This was fairly effective and my stack of assigned PRs has been about cut in half: =E2=80=A2 reviewed and merged: =E2=81=83 `install_printer' cleanup (@pirbo) [#13969] =E2=81=83 ocamltest C refactors (@MisterDA) [#13962] =E2=81=83 format break hint fix (@Octachron) [#13853] =E2=81=83 local structure items (@nojb) [#14009] =E2=81=83 document `row_more' and `row_fixed' (@goldfirere) [#14023] =E2=80=A2 closed: =E2=81=83 immediacy computation revamp (@ccasin) [#11841] =E2=80=A2 adopted and merged: =E2=81=83 generational stack scanning (@xavierleroy) [#13594] =E2=81=83 statmemprofs and bigarrays (@stedolan) [#13675] =E2=81=83 recursive module error messages (@shivam-909) [#13608] =E2=80=A2 adopted but not yet merged =E2=81=83 distinguish two kinds of mutexes (@gasche) [#13716] (needs a review) =E2=81=83 source locations in implementations and interfaces (@malekbr) [#12654] (needs a review) A few of those PRs I "adopted", that is, I took control of the PR as the submitter would to rebase the PR and resubmit. In some cases this was mostly to apply my own review comments (sometimes someone else's), the change were minor and I could merge quickly. In some cases the changes were more invasive, and I would ask for another review. In one case I got stuck and wasn't sure how to rebase, so I asked the original author. "Adopting" PRs in this way is a new process to me, I generally try to guide the authors through making all the changes themselves. I wanted to go through my stack faster, and in some cases I knew that the authors were unresponsive and unavailable to make those changes. I found it fun, but it is probably best reserved to this situation where authors are unavailable. [structured diagnostics] [modular explicits] [separate PR] [#13969] [#13962] [#13853] [#14009] [#14023] [#11841] [#13594] [#13675] [#13608] [#13716] [#12654] Side errands =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 I worked on a race between domain-termination and compaction: [#14025]. I decided to try to make Dune more pleasant for building the OCaml compiler, and sent a draft/RFC PR at [dune#11819]. I heard a remark that it's painful not to be able to use lazy thunks anymore for library initialization code (lazy thunks are not concurrency-safe in OCaml 5); I tried to think about why this is hard to fall asleep again after a snoring attack, and ended up writing [#14043] instead. I motivated myself into [asking for volunteers] to review the Relocatable Compiler work. I also participated as a speaker to two talk sessions in the evening. I did a short demo of [Monolith] and model-based testing in general =E2=80=93 that was before we decided to use it on a Mirage filesystem. I talked about the OCaml Software Foundation and recent discussions around improving the security of the OCaml ecosystem. [#14025] [dune#11819] [#14043] [asking for volunteers] [Monolith] MlFront_Signify 2.3.1 - OpenBSD-compatible signify =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=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 I am pleased to announce the new package `MlFront_Signify' is available in opam. `signify' was created by OpenBSD for maintainers to sign distributions and for users to verify those distributions. That is described in [signify: Securing OpenBSD From Us To You] and the [signify manpage]. `MlFront_Signify' is compatible with `signify'. The C code comes from firmware update code for the embedded Linux router distribution OpenWrt (much easier to build using OCaml tools compared to OpenBSD code). The _executable_ `mlfront-signify' has most of the same CLI options as OpenBSD `signify' and includes the same trivial tests as `signify', but on Unix you should just use your package manager's `signify'. The main contribution of `MlFront_Signify' is the OCaml _library_ that is documented at: =E2=80=A2 I used it with to perform auto-upgrades. A few MlFront packages participate: =E2=80=A2 `MlFront_Signify' to verify a potential upgrade =E2=80=A2 `MlFront_ZipFile' to unpack a verified upgrade =E2=80=A2 `MlFront_Cache' to provide an immutable store where multiple versions can co-exist In particular, the `SHA256.sig' file in the file listing was created using `MlFront_Signify' with the `SHA256' checksum file as input. That serves the same purpose as . /MlFront_ZipFile has an important bugfix so please upgrade it to 2.3.1 as well./ Thanks to the Mirage project where I use its `mirage-crypto-rng' secure random generator! Enjoy. [signify: Securing OpenBSD From Us To You] [signify manpage] Opam 103: Bootstrapping a New OCaml Project with opam, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: OCamlPro 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 *Greetings Cameleers,* We=E2=80=99re back with a new installment in our `opam deep-dives' series! [*Opam 103: Bootstrapping a New OCaml Project with opam*] This time, we=E2=80=99re taking a step back to focus on a beginner-friend= ly guide to setting up a toy OCaml project with `opam', `dune', `cmdliner', and `alcotest'. This article is aimed at newer members of the ecosystem who may be wondering: =E2=80=A2 How do I structure an OCaml project from scratch? =E2=80=A2 How to best use opam in my dev workflow? =E2=80=A2 How do I write a minimal `.opam' file? =E2=80=A2 What about a fully fledged one? We walk through the `opam' rationale and offer guidance for building your first opam-compliant package =E2=80=94 the kind you can confidently = pin and use locally before getting to publishing it. As always, we hope this piece serves as a helpful reference for those onboarding into the `opam' and the OCaml ecosystem and getting their first taste of the tooling. :link: Check out the other `opam deep-dives' articles on Feel free to share feedback or thoughts right here in this thread! Thank you all for your time, and until next time, *The OCamlPro Team* [*Opam 103: Bootstrapping a New OCaml Project with opam*] Retirement of Multicore CI Pipelines =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=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: Mark Elvers 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 We believe that the two OCurrent pipelines setup for testing OCaml multicore have now served their purpose and will be retired. =E2=80=A2 [https://ocaml-multicoretests.ci.dev:8100] =E2=80=A2 [https://ocaml-multicore.ci.dev:8100] Please let me know if you still feel these have value. [https://ocaml-multicoretests.ci.dev:8100] [https://ocaml-multicore.ci.dev:8100] Dune 3.19 =E2=95=90=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: Etienne Marais 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 The Dune team is happy to announce the release of dune `3.19.0' :smile: This release contains some important bug fixes along with some improvements for the `foreign_library' stanza. It introduces support for concurrent builds through the RPC server. If you encounter a problem with this release, you can report it on the [ocaml/dune] repository. [ocaml/dune] Changelog =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=97=8A Fixed =E2=80=A2 Fixed a bug that was causing cram tests attached to multiple al= iases to be run multiple times. (#11547, @Alizter) =E2=80=A2 Fix: pass pkg-config (extra) args in all pkgconfig invocations.= A missing =E2=80=93personality flag would result in pkgconf not finding libraries in some contexts. (#11619, @MisterDA) =E2=80=A2 Fix: Evaluate `enabled_if' when computing the stubs for stanzas= such as `foreign_library' (#11707, @Alizter, @rgrinberg) =E2=80=A2 Fix $ dune describe pp for libraries in the presence of `(include_subdirs unqualified)' (#11729, fixes #10999, @rgrinberg) =E2=80=A2 Fix `$ dune subst' in sub directories of a git repository (#117= 60, fixes #11045, @Richard-Degenne) =E2=80=A2 Fix a crash involving `Path.drop_prefix' when using Melange on Windows (#11767, @nojb) =E2=97=8A Added =E2=80=A2 Added detection and warning for common typos in package depende= ncy constraints (#11600, fixes #11575, @kemsguy7) =E2=80=A2 Added `(extra_objects)' field to `(foreign_library)' stanza with `(:include)' support. (#11683, @Alizter) =E2=97=8A Changed =E2=80=A2 Allow build RPC messages to be handled by dune's RPC server in = eager watch mode (#11622, @gridbugs) =E2=80=A2 Allow concurrent build with RPC server (#11712, @gridbugs) Wrote a Record/Replay Debugging tutorial =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Sid Kshatriya 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 I've written a *tutorial* on Record/Replay debugging. If you're interested in reverse debugging please check it out [here]. You can do Record/Replay style debugging of your `ocamlc.opt' compiled executables. You will be able to place breakpoints on all symbols exposed by the `ocaml.opt' compiler =E2=80=93 this includes C functions + OCaml functions from your OCaml program and do things like reverse-continue. For more context please see an announcement I made a couple of months ago: (What's new in this new discuss.ocaml.org post is to give focus to the tutorial I've very recently written) *How can `rr' / _Software Counters_ mode `rr' help me in OCaml if I'm not interested in gdb style debugging the OCaml executables ?* There are some other useful things that `rr' can do for OCaml-ers. *Here is one:* Let's say you want to know what programs have been executed when you compile a ocaml program via dune. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ dune init project hello_world =E2=94=82 $ cd hello_world/ =E2=94=82 $ rr record -W -- dune b =E2=94=82 rr: Saving execution to trace directory `/home/sidk/.local/shar= e/rr/dune-5'. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Now run `rr ps'. You will get the exact invocations of all the programs that `dune build' triggered ! This takes you all the way down to showing you `ld' and `ar' invocations ! Very useful when you want to know what happened in the whole process tree. /editor=E2=80=99s note: please follow the post link to see this big termi= nal output./ [here] A no-maths guide to monads =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=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: Rapha=C3=ABl Proust 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 Prompted by someone complaining online about Haskell documentation, I wrote a zero-maths guide to monads (in OCaml, but it applies somewhat more broadly, it's just OCaml has nice binding opearators): macOS Metal Framework bindings for compute applications =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=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: Lukasz Stafiniak 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 Hi! I'm happy to announce the `metal' package with bindings to the Metal framework, with a relatively broad coverage except it _does not_ cover anything graphics or UI related. =E2=80=A2 Hosted on GitHub: [lukstafi/ocaml-metal: OCaml bindings to Apple Metal for general compute applications] =E2=80=A2 API documentation: [Metal (metal.Metal)] =E2=80=A2 Released to the repository: [metal 0.1.0 (latest) =C2=B7 OCaml = Package] =E2=80=A2 Example usage: [ocannl/arrayjit/lib/metal_backend.ml at master = =C2=B7 ahrefs/ocannl] Enjoy! P.S. Disclaimer: code contains AI slop (and likely also my own errors). It's my first major employment of / "collaboration" with Large Language Models and I leaned into accepting choices made by the models. [lukstafi/ocaml-metal: OCaml bindings to Apple Metal for general compute applications] [Metal (metal.Metal)] [metal 0.1.0 (latest) =C2=B7 OCaml Package] [ocannl/arrayjit/lib/metal_backend.ml at master =C2=B7 ahrefs/ocannl] 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 [The origin of the pipeline operator (`|>`)] [the ocaml.org blog] [The origin of the pipeline operator (`|>`)] 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 May 20 to 27, 2025.

nanoev 0.1

Simon Cruanes announced

Hello,

I'm happy to announce the first release of nanoev, yet another event loop abstraction. My goal with i= t is to have a narrow-waist interface between event loops (for now, s= elect and poll) and various abstractions built directly= on top (for now using picos), without tying the event loop ab= straction itself to a particular scheduler. The core interface for the even= t loop is basically:

type t

val wakeup_from_outside : t -> unit

val step : t -> unit
(** Run one step of the=
 event loop until something happens *)

val close : t -> Unix.file_descr -> unit
(** Close the file desc=
riptor and clean it up *)

val max_fds : t -> int
(** Maximum number of f=
ile descriptors that can be observed at once. *)

val on_readable :
  t -> Unix.file_descr -> 'a -=
> 'b -> (closed:bool -> 'a -> '=
b -> unit) -> unit

val on_writable :
  t -> Unix.file_descr -> 'a -=
> 'b -> (closed:bool -> 'a -> '=
b -> unit) -> unit

val run_after_s : t -> float -> 'a -> 'b -=
> ('a -> 'b -> unit) -> unit

and nothing else. I've also started experimenting with using it to drive tiny_httpd.

15th MirageOS retreat May 13th - 20th

Continuing this thread, gasche said

I'm just back from the Mirage retrea= t, an event where people interested in M= irage meet for one week to work whatever they want. This retreat was or= ganized by Hannes Mehnert as all past retreats, in Marrakech. Hannes ( @han= nes ) asked participants to write a blog post to spread the word – h= ence this post.

a Mirage retreat, in general

The retreat is unlike most other professional events that I attend, typical= ly academic conferences. We are hosted in a place that is otherwise used as= a hostel within the medina, the old city centre of Marrakech. Bed comfort = is minimal (a room of six people, two of them snoring), but there are peopl= e on-site who prepare food and the food is great. There is very little stru= cture for the day: we had a meeting every morning after breakfast to mentio= n what we had done the day before, and talk sessions in the evening (typica= lly one or two talks for around 40 minutes).

The participants come in all shapes, some are regular contributors to the M= irage ecosystem and some (like me) know very little about Mirage. Some (lik= e me) are very familar with OCaml and others know little about the language= . Some people know about networking, security, system administration, commu= nication protocols. The lack of structure encourages people to wander aroun= d, for example sitting alongside someone doing something specific and preci= se, to try something you and learn along. Last time I ended up writing bits= of a network driver in OCaml, despite knowing nothing about network driver= s; this time I worked on model-based testing of filesystems (see https://discuss.ocaml.org/t/blog-post-us= ing-model-based-testing-on-a-mirage-filesystem-implementation/16666 ), = despite knowing nothing about file system implementations.

Morocco has better network connectivity than during my first retreats, but = it remains somewhat flaky – and our network-usage habits keep increa= sing. In particular, I could not attend any online meeting, and this was very nice – just like conferences, it is liberating to be busy = for one week uninterrupted. In the past I managed to adapt to low-network u= sage fairly well. This time I noticed that I depend on github a lot, and I = don't know how to have a good offline or network-restricted experience, to = do code-reviews in particular. I wish offline version-controlled tools for = code-review and bugtracking were more widely employed.

Overall I find this organization excellent: participants get a place and ti= me to learn from each other. I think it could potentially be used for other= topics. For example people mentioned that it could be interesting to have = a retreat focused on documentation in the OCaml ecosystem, and I find the i= dea interesting.

(The rest of this post is basically a narrated version of my work log for t= he week; please feel free to just skip it.)

My OCaml-focused work

One of my projects for the week was to take the time to review large pull-r= equests on the OCaml compiler that I wouldn't dare attacking usually, becau= se my agenda is perpetually full of other things. I did a first round of re= view on structured di= agnostics, and additional reads through most of the modular explicits pull request (PR).= In particular I wrote a small manual section for modular explicits, submit= ted as a separate PR<= /a>. I hope to have moved from "it would be nice if these were reviewed = someday" to a more short-term phase where I try to get these past the f= inish line before moving to other topics – but we never know.

I also went through the lists of PRs I had been assigned to, sometimes a wh= ile ago. (OCaml triagers assign PRs to each other to keep track of them and= try to bring them to a decision, but in practice we often forget to do thi= s and they linger around.) This was fairly effective and my stack of assign= ed PRs has been about cut in half:

  • reviewed and merged:
  • closed:
    • immediacy computation revamp (@ccasin) #11841
  • adopted and merged:
    • generational stack scanning (@xavierleroy) #13594
    • statmemprofs and bigarrays (@stedolan) #13675
    • recursive module error messages (@shivam-909) #13608
  • adopted but not yet merged
    • distinguish two kinds of mutexes (@gasche) #13716 (needs a review)
    • source locations in implementations and interfaces (@malekbr) #12654 (needs a review)<= /li>

A few of those PRs I "adopted", that is, I took control of the PR as the su= bmitter would to rebase the PR and resubmit. In some cases this was mostly = to apply my own review comments (sometimes someone else's), the change were= minor and I could merge quickly. In some cases the changes were more invas= ive, and I would ask for another review. In one case I got stuck and wasn't= sure how to rebase, so I asked the original author.

"Adopting" PRs in this way is a new process to me, I generally try to guide= the authors through making all the changes themselves. I wanted to go thro= ugh my stack faster, and in some cases I knew that the authors were unrespo= nsive and unavailable to make those changes. I found it fun, but it is prob= ably best reserved to this situation where authors are unavailable.

Side errands

I worked on a race between domain-termination and compaction: #14025. I decided to try to ma= ke Dune more pleasant for building the OCaml compiler, and sent a draft/RFC= PR at dune#11819.= I heard a remark that it's painful not to be able to use lazy thunks anymo= re for library initialization code (lazy thunks are not concurrency-safe in= OCaml 5); I tried to think about why this is hard to fall asleep again aft= er a snoring attack, and ended up writing #14043 instead. I motivated myself into asking for volunteers to review the Relocatable Compiler work.

I also participated as a speaker to two talk sessions in the evening. I did= a short demo of Mono= lith and model-based testing in general – that was before we dec= ided to use it on a Mirage filesystem. I talked about the OCaml Software Fo= undation and recent discussions around improving the security of the OCaml = ecosystem.

MlFront_Signify 2.3.1 - OpenBSD-compatible signify

jbeckford announced

I am pleased to announce the new package MlFront_Signify is av= ailable in opam.

signify was created by OpenBSD for maintainers to sign distrib= utions and for users to verify those distributions. That is described in signify: Secur= ing OpenBSD From Us To You and the signify manpage.

MlFront_Signify is compatible with signify. The C= code comes from firmware update code for the embedded Linux router distrib= ution OpenWrt (much easier to build using OCaml tools compared to OpenBSD c= ode). The executable mlfront-signify= has most of the same CLI options as OpenBSD signify an= d includes the same trivial tests as signify, but on Unix you = should just use your package manager's signify. The main contr= ibution of MlFront_Signify is the OCaml library that is documented at:

I used it with https://discuss.ocaml.= org/t/ann-combining-llvm-mc-lld-precompiled-c-and-bytecode/16675?u=3Djbeckf= ord to perform auto-upgrades. A few MlFront packages participate:

  • MlFront_Signify to verify a potential upgrade
  • MlFront_ZipFile to unpack a verified upgrade
  • MlFront_Cache to provide an immutable store where multiple= versions can co-exist

In particular, the SHA256.sig file in the file listing https:= //github.com/diskuv/dkcoder/releases/tag/2.3.202505202143 was created u= sing MlFront_Signify with the SHA256 checksum fil= e as input. That serves the same purpose as https://cdn.openbsd.org/pub/Ope= nBSD/snapshots/arm64/SHA256.sig.

MlFront_ZipFile has an important bugfix so please upgrade it to 2.3.1 as= well.

Thanks to the Mirage project where I use its mirage-crypto-rng= secure random generator!

Enjoy.

Opam 103: Bootstrapping a New OCaml Project with opam, by OCam= lPro

OCamlPro announced

Greetings Cameleers,

We=E2=80=99re back with a new installment in our opam deep-dives series!

Opam 103: Bootstrapping a New OCaml Project with opam

This time, we=E2=80=99re taking a step back to focus on a beginner-friendly= guide to setting up a toy OCaml project with opam, dune= , cmdliner, and alcotest.

This article is aimed at newer members of the ecosystem who may be wonderin= g:

  • How do I structure an OCaml project from scratch?
  • How to best use opam in my dev workflow?
  • How do I write a minimal .opam file?
  • What about a fully fledged one?

We walk through the opam rationale and offer guidance for buil= ding your first opam-compliant package =E2=80=94 the kind you can confident= ly pin and use locally before getting to publishing it.

As always, we hope this piece serves as a helpful reference for those onboa= rding into the opam and the OCaml ecosystem and getting their = first taste of the tooling.

:link: Check out the other opam deep-dives articles on https://ocamlpro.com/blog/

Feel free to share feedback or thoughts right here in this thread!

Thank you all for your time, and until next time, The OCamlPro Team

Retirement of Multicore CI Pipelines

Mark Elvers announced

We believe that the two OCurrent pipelines setup for testing OCaml multicor= e have now served their purpose and will be retired.

Please let me know if you still feel these have value.

Dune 3.19

Etienne Marais announced

The Dune team is happy to announce the release of dune 3.19.0 = :smile:

This release contains some important bug fixes along with some improvements= for the foreign_library stanza. It introduces support for con= current builds through the RPC server.

If you encounter a problem with this release, you can report it on the ocaml/dune repository.

Changelog

  • Fixed
    • Fixed a bug that was causing cram tests attached to multiple aliases to= be run multiple times. (#11547, @Alizter)
    • Fix: pass pkg-config (extra) args in all pkgconfig invocations. A missi= ng –personality flag would result in pkgconf not finding libraries in some contexts. (#1161= 9, @MisterDA)
    • Fix: Evaluate enabled_if when computing the stubs for stan= zas such as foreign_library (#11707, @Alizter, @rgrinberg)
    • Fix $ dune describe pp for libraries in the presence of (include_= subdirs unqualified) (#11729, fixes #10999, @rgrinberg)
    • Fix $ dune subst in sub directories of a git repository (#= 11760, fixes #11045, @Richard-Degenne)
    • Fix a crash involving Path.drop_prefix when using Melange = on Windows (#11767, @nojb)
  • Added
    • Added detection and warning for common typos in package dependency constraints (#11600, fixes #11575, @kemsguy7)
    • Added (extra_objects) field to (foreign_library) stanza with (:include) support. (#11683, @Alizter)
  • Changed
    • Allow build RPC messages to be handled by dune's RPC server in eager wa= tch mode (#11622, @gridbugs)
    • Allow concurrent build with RPC server (#11712, @gridbugs)

Wrote a Record/Replay Debugging tutorial

Sid Kshatriya announced

I've written a tutorial on Record/Replay debugging. If you're intere= sted in reverse debugging please check it out here.

You can do Record/Replay style debugging of your ocamlc.opt co= mpiled executables. You will be able to place breakpoints on all symbols ex= posed by the ocaml.opt compiler – this includes C funct= ions + OCaml functions from your OCaml program and do things like reverse-c= ontinue.

For more context please see an announcement I made a couple of months ago: https://discuss.ocaml.org/t/ann-a-tool-to-reverse-= debug-ocaml-other-binary-runs/16366/1

(What's new in this new discuss.ocaml.org post is to give focus to the tuto= rial I've very recently written)

How can rr / Software Counters mode rr help me in OCaml if I'm not interested in gdb sty= le debugging the OCaml executables ?

There are some other useful things that rr can do for OCaml-er= s.

Here is one: Let's say you want to know what programs have been exec= uted when you compile a ocaml program via dune.

$ dune init project hello_world
$ cd hello_world/
$ rr record -W -- dune b
rr: Saving execution to trace directory `/home/sidk/.local/share/rr/dune-5'.

Now run rr ps. You will get the exact invocations of all the p= rograms that dune build triggered ! This takes you all the way= down to showing you ld and ar invocations !

Very useful when you want to know what happened in the whole process tree.

editor=E2=80=99s note: please follow the post link to see this big termi= nal output.

A no-maths guide to monads

Rapha=C3=ABl Proust announced

Prompted by someone complaining online about Haskell documentation, I wrote= a zero-maths guide to monads (in OCaml, but it applies somewhat more broad= ly, it's just OCaml has nice binding opearators):

https://raphael-proust.gitlab.io/code/no-maths-guide-to-monads.html

macOS Metal Framework bindings for compute applications

Lukasz Stafiniak announced

Hi!

I'm happy to announce the metal package with bindings to the M= etal framework, with a relatively broad coverage except it does not cover anything graphics or UI related.

Enjoy!

P.S. Disclaimer: code contains AI slop (and likely also my own errors). It'= s my first major employment of / "collaboration" with Large Language Models= and I leaned into accepting choices made by the models.

Other OCaml News

From the ocaml.org blog

Here are links from many OCaml blogs aggregated at the ocaml.org blog.

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.

--=-=-=--