Subject: Re: bug#52729: [PATCH v2] gnu: ocaml: Update to 4.13.

From: Julien Lepiller <[email-masked]>
Date: Thu, 23 Dec 2021 14:01:09 +0100

Le Wed, 22 Dec 2021 14:51:49 +0100,
zimoun <[email-masked]> a écrit :

> Hi,
> 
> On Wed, 22 Dec 2021 at 14:43, Julien Lepiller <[email-masked]>
> wrote:
> 
> > >On a side note, have you tried to replace boot/ocamlc (and
> > >friends) with the bootstrapped ones (camlboot -> ocaml-4.07 -> *).
> > > Other said, what is the most affordable path to exploit camlboot
> > > and have a good
> > >bootstrapping story for OCaml.  
> >
> > Currently we can only use camlboot to bootstrap ocaml 4.07, which
> > is what we do. We plan to improve it so it can build newer versions
> > though.  
> 
> Yes, I remember when discussing the patch adding camlboot and
> ocaml4.07-boot. :-)  That's what you explained [1].
> 
> Well, a direct bootstrap camlboot -> ocaml-4.13 is better for sure,
> but harder.  Instead, my question is: have you tried a chain of
> boostrap: camlboot -> ocaml-4.07 -> ? -> ocaml-4.13.  I could be
> temporary solution waiting camlboot improvements, no?
> 
> 1: <https://issues.guix.gnu.org/46806#11>
> 
> 
> Cheers,
> simon

Here's v2 of the patch series: the first two patches build only the
4.07 version for migrate-parsetree@1 and for ppx-tools-versioned. That
way, they don't fail when updating to ocaml 4.13. I checked that
everything builds like before. I still have issues with bap because
[email-masked] fails.
>From ed8cec81e6a30cc0a0e2f1562bb1a8f12e666dc1 Mon Sep 17 00:00:00 2001
Message-Id: <[email-masked]>
From: Julien Lepiller <[email-masked]>
Date: Wed, 22 Dec 2021 22:58:24 +0100
Subject: [PATCH 1/3] gnu: ocaml-ppx-tools-versioned: Only build ocaml-4.07
 variant.

* gnu/packages/ocaml.scm (ocaml-ppx-tools-versioned): Rename to...
(ocaml4.07-ppx-tools-versioned): ...this.
[arguments]: Use ocaml-4.07.
---
 gnu/packages/ocaml.scm | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index e6001ca37b..9fc3280f89 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -1836,9 +1836,9 @@ (define-public ocaml-migrate-parsetree-1
          "16x8sxc4ygxrr1868qpzfqyrvjf3hfxvjzmxmf6ibgglq7ixa2nq"))))
     (properties '((upstream-name . "ocaml-migrate-parsetree")))))
 
-(define-public ocaml-ppx-tools-versioned
+(define-public ocaml4.07-ppx-tools-versioned
   (package
-    (name "ocaml-ppx-tools-versioned")
+    (name "ocaml4.07-ppx-tools-versioned")
     (version "5.4.0")
     (source (origin
               (method git-fetch)
@@ -1851,10 +1851,13 @@ (define-public ocaml-ppx-tools-versioned
                 "07lnj4yzwvwyh5fhpp1dxrys4ddih15jhgqjn59pmgxinbnddi66"))))
     (build-system dune-build-system)
     (arguments
-     `(#:test-target "."
+     `(#:ocaml ,ocaml-4.07
+       #:dune ,ocaml4.07-dune
+       #:findlib ,ocaml4.07-findlib
+       #:test-target "."
        #:package "ppx_tools_versioned"))
     (propagated-inputs
-     `(("ocaml-migrate-parsetree" ,ocaml-migrate-parsetree-1)))
+     (list (package-with-ocaml4.07 ocaml-migrate-parsetree-1)))
     (properties `((upstream-name . "ppx_tools_versioned")))
     (home-page "https://github.com/let-def/ppx_tools_versioned")
     (synopsis "Variant of ppx_tools")
@@ -1913,7 +1916,7 @@ (define-public ocaml4.07-bitstring
                  (base32
                   "15jjk2pq1vx311gl49s5ag6x5y0654x35w75z07g7kr2q334hqps"))))
       (propagated-inputs
-       `(("ocaml-ppx-tools-versioned" ,ocaml-ppx-tools-versioned)))
+       `(("ocaml-ppx-tools-versioned" ,ocaml4.07-ppx-tools-versioned)))
       (properties '()))))
  
 (define-public ocaml-result
@@ -2751,7 +2754,7 @@ (define-public ocaml4.07-sedlex
                 (base32
                  "05f6qa8x3vhpdz1fcnpqk37fpnyyq13icqsk2gww5idjnh6kng26"))))
      (propagated-inputs
-      `(("ocaml-ppx-tools-versioned" ,ocaml-ppx-tools-versioned)
+      `(("ocaml-ppx-tools-versioned" ,ocaml4.07-ppx-tools-versioned)
         ,@(package-propagated-inputs ocaml-sedlex)))
      (properties '()))))
 
@@ -6728,7 +6731,7 @@ (define-public ocaml4.07-bisect-ppx
            "1njs8xc108rrpx5am5zhhcn6vjva7rsphm8034qp5lgyvnhfgh7q"))))
       (propagated-inputs
        `(("ocaml-migrate-parsetree" ,ocaml-migrate-parsetree)
-         ("ocaml-ppx-tools-versioned" ,ocaml-ppx-tools-versioned)
+         ("ocaml-ppx-tools-versioned" ,ocaml4.07-ppx-tools-versioned)
          ,@(package-propagated-inputs ocaml-bisect-ppx)))
       (native-inputs
        `(("ocaml-ounit2" ,ocaml-ounit2)))
-- 
2.34.0

>From 77660206f96eef8dd91485e295abb35d14c9a346 Mon Sep 17 00:00:00 2001
Message-Id: <[email-masked]>
In-Reply-To: <[email-masked]>
References: <[email-masked]>
From: Julien Lepiller <[email-masked]>
Date: Wed, 22 Dec 2021 23:01:56 +0100
Subject: [PATCH 2/3] gnu: ocaml-migrate-parstree-1: Only build ocaml4.07
 variant.

* gnu/packages/ocaml.scm (ocaml-migrate-parsetree-1): Rename to...
(ocaml4.07-migrate-parsetree): ...this.  Use package-with-ocaml4.07.
---
 gnu/packages/ocaml.scm | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index 9fc3280f89..fd410c1ba9 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -1810,31 +1810,32 @@ (define-public ocaml-migrate-parsetree
     (propagated-inputs
      (list ocaml-ppx-derivers ocamlbuild ocaml-result))
     (properties `((upstream-name . "ocaml-migrate-parsetree")
-                  ;; OCaml 4.07 packages require version 1.*
-                  (ocaml4.07-variant . ,(delay (package-with-ocaml4.07 ocaml-migrate-parsetree-1)))))
+                  (ocaml4.07-variant . ,(delay ocaml4.07-migrate-parsetree))))
     (synopsis "OCaml parsetree converter")
     (description "This library converts between parsetrees of different OCaml
 versions.  For each version, there is a snapshot of the parsetree and conversion
 functions to the next and/or previous version.")
     (license license:lgpl2.1+)))
 
-(define-public ocaml-migrate-parsetree-1
-  (package
-    (inherit ocaml-migrate-parsetree)
-    (name "ocaml-migrate-parsetree-1")
-    (version "1.8.0")
-    (home-page "https://github.com/ocaml-ppx/ocaml-migrate-parsetree")
-    (source
-     (origin
-       (method git-fetch)
-       (uri (git-reference
-             (url home-page)
-             (commit (string-append "v" version))))
-       (file-name (git-file-name name version))
-       (sha256
-        (base32
-         "16x8sxc4ygxrr1868qpzfqyrvjf3hfxvjzmxmf6ibgglq7ixa2nq"))))
-    (properties '((upstream-name . "ocaml-migrate-parsetree")))))
+;; OCaml 4.07 packages require version 1.*
+(define-public ocaml4.07-migrate-parsetree
+  (package-with-ocaml4.07
+    (package
+      (inherit ocaml-migrate-parsetree)
+      (name "ocaml-migrate-parsetree")
+      (version "1.8.0")
+      (home-page "https://github.com/ocaml-ppx/ocaml-migrate-parsetree")
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url home-page)
+               (commit (string-append "v" version))))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "16x8sxc4ygxrr1868qpzfqyrvjf3hfxvjzmxmf6ibgglq7ixa2nq"))))
+      (properties '((upstream-name . "ocaml-migrate-parsetree"))))))
 
 (define-public ocaml4.07-ppx-tools-versioned
   (package
@@ -1857,7 +1858,7 @@ (define-public ocaml4.07-ppx-tools-versioned
        #:test-target "."
        #:package "ppx_tools_versioned"))
     (propagated-inputs
-     (list (package-with-ocaml4.07 ocaml-migrate-parsetree-1)))
+     (list ocaml4.07-migrate-parsetree))
     (properties `((upstream-name . "ppx_tools_versioned")))
     (home-page "https://github.com/let-def/ppx_tools_versioned")
     (synopsis "Variant of ppx_tools")
-- 
2.34.0

>From bb660bfc763b38747f67c8421663efd5acb7a1cb Mon Sep 17 00:00:00 2001
Message-Id: <[email-masked]>
In-Reply-To: <[email-masked]>
References: <[email-masked]>
From: Julien Lepiller <[email-masked]>
Date: Wed, 22 Dec 2021 04:13:53 +0100
Subject: [PATCH 3/3] gnu: ocaml: Update to 4.13.

* gnu/packages/ocaml.scm (ocaml-4.13): New variable.
(ocaml-4.11): Remove variable.
(ocaml-dot-merlin-reader): Update to 4.4-413.
(js-of-ocaml): Update to 3.11.0.
---
 gnu/packages/ocaml.scm | 75 +++++++++++++++++++++++++++++-------------
 1 file changed, 53 insertions(+), 22 deletions(-)

diff --git a/gnu/packages/ocaml.scm b/gnu/packages/ocaml.scm
index fd410c1ba9..5eaa0836e7 100644
--- a/gnu/packages/ocaml.scm
+++ b/gnu/packages/ocaml.scm
@@ -182,10 +182,10 @@ (define-public camlboot
 This package produces a native @command{ocamlc} and a bytecode @command{ocamllex}.")
       (license license:expat))))
 
-(define-public ocaml-4.11
+(define-public ocaml-4.13
   (package
     (name "ocaml")
-    (version "4.11.1")
+    (version "4.13.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -194,7 +194,7 @@ (define-public ocaml-4.11
                     "/ocaml-" version ".tar.xz"))
               (sha256
                (base32
-                "0k4521c0p10c5ams6vjv5qkkjhmpkb0bfn04llcz46ah0f3r2jpa"))))
+                "1s7xwqidpjwfhnpfma4nb93gxfr7g9jfn03s1j03iyavmpgph7ck"))))
     (build-system gnu-build-system)
     (native-search-paths
      (list (search-path-specification
@@ -210,7 +210,10 @@ (define-public ocaml-4.11
      (list libx11 libiberty ;needed for objdump support
            zlib))                       ;also needed for objdump support
     (arguments
-     `(#:phases
+     `(#:configure-flags '("--enable-ocamltest")
+       #:test-target "tests"
+       #:make-flags '("world.opt")
+       #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'patch-/bin/sh-references
            (lambda* (#:key inputs #:allow-other-keys)
@@ -226,16 +229,7 @@ (define-public ocaml-4.11
 patch-/bin/sh-references: ~a: changing `\"/bin/sh\"' to `~a'~%"
                                  file quoted-sh)
                          quoted-sh))))
-                  (find-files "." "\\.ml$"))
-                 #t))))
-         (replace 'build
-           (lambda _
-             (invoke "make" "-j" (number->string (parallel-job-count))
-                     "world.opt")))
-         (replace 'check
-           (lambda _
-             (with-directory-excursion "testsuite"
-               (invoke "make" "all")))))))
+                  (find-files "." "\\.ml$")))))))))
     (home-page "https://ocaml.org/")
     (synopsis "The OCaml programming language")
     (description
@@ -250,7 +244,7 @@ (define-public ocaml-4.11
 
 (define-public ocaml-4.09
   (package
-    (inherit ocaml-4.11)
+    (inherit ocaml-4.13)
     (version "4.09.0")
     (source (origin
               (method url-fetch)
@@ -261,7 +255,33 @@ (define-public ocaml-4.09
               (patches (search-patches "ocaml-4.09-multiple-definitions.patch"))
               (sha256
                (base32
-                "1v3z5ar326f3hzvpfljg4xj8b9lmbrl53fn57yih1bkbx3gr3yzj"))))))
+                "1v3z5ar326f3hzvpfljg4xj8b9lmbrl53fn57yih1bkbx3gr3yzj"))))
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-/bin/sh-references
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let* ((sh (search-input-file inputs "/bin/sh"))
+                    (quoted-sh (string-append "\"" sh "\"")))
+               (with-fluids ((%default-port-encoding #f))
+                 (for-each
+                  (lambda (file)
+                    (substitute* file
+                      (("\"/bin/sh\"")
+                       (begin
+                         (format (current-error-port) "\
+patch-/bin/sh-references: ~a: changing `\"/bin/sh\"' to `~a'~%"
+                                 file quoted-sh)
+                         quoted-sh))))
+                  (find-files "." "\\.ml$"))))))
+         (replace 'build
+           (lambda _
+             (invoke "make" "-j" (number->string (parallel-job-count))
+                     "world.opt")))
+         (replace 'check
+           (lambda _
+             (with-directory-excursion "testsuite"
+               (invoke "make" "all")))))))))
 
 ;; This package is a bootstrap package for ocaml-4.07. It builds from camlboot,
 ;; using the upstream sources for ocaml 4.07. It installs a bytecode ocamllex
@@ -440,7 +460,7 @@ (define-public ocaml-4.07
        ("perl" ,perl)
        ("pkg-config" ,pkg-config)))))
 
-(define-public ocaml ocaml-4.11)
+(define-public ocaml ocaml-4.13)
 
 (define-public ocamlbuild
   (package
@@ -4739,7 +4759,7 @@ (define-public ocaml-craml
 (define-public ocaml-dot-merlin-reader
   (package
     (name "ocaml-dot-merlin-reader")
-    (version "4.3.1-411")
+    (version "4.4-413")
     (source
      (origin
        (method git-fetch)
@@ -4749,7 +4769,7 @@ (define-public ocaml-dot-merlin-reader
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1nwgc9nyy80dc9cgkskyfwv9c785yjyg39s005d4wiagj4fy68v8"))))
+         "0wijg1vh2q6yr46vkv34vvksligd0ajl4hv7m6qbz3ywqr8akg23"))))
     (build-system dune-build-system)
     (arguments '(#:package "dot-merlin-reader"
                  #:tests? #f))          ; no tests
@@ -7621,7 +7641,7 @@ (define-public ocaml-cohttp
 (define-public js-of-ocaml
   (package
     (name "js-of-ocaml")
-    (version "3.9.1")
+    (version "3.11.0")
     (source
      (origin
        (method git-fetch)
@@ -7630,9 +7650,20 @@ (define-public js-of-ocaml
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
-        (base32 "00hdjaj94j3nc6f6wbbpx59h4yc79siphs34i1hry11r56paaqyk"))))
+        (base32 "1x5f1ph9wgx0mgyibssssnrcwp69ihw66gzhsnz9h79czgzyjpp2"))))
     (build-system dune-build-system)
-    (arguments `(#:test-target "."))
+    (arguments
+     `(#:test-target "."
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'fix-failing-test
+           (lambda _
+             ;; Formating difference
+             (with-output-to-file "compiler/tests-jsoo/bin/error2.expected"
+               (lambda _
+                 (format #t
+                         "Fatal error: exception Match_failure(\
+\"compiler/tests-jsoo/bin/error2.ml\", 11, 2)\n\n"))))))))
     (propagated-inputs
      (list ocaml-ppxlib
            ocaml-uchar
-- 
2.34.0