GNU bug report logs - #51745
[PATCH 0/1] Add smlnj.

Previous Next

Package: guix-patches;

Reported by: Foo Chuan Wei <chuanwei.foo <at> hotmail.com>

Date: Wed, 10 Nov 2021 08:57:01 UTC

Severity: normal

Tags: patch

Done: Ludovic Courtès <ludo <at> gnu.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 51745 in the body.
You can then email your comments to 51745 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to guix-patches <at> gnu.org:
bug#51745; Package guix-patches. (Wed, 10 Nov 2021 08:57:01 GMT) Full text and rfc822 format available.

Acknowledgement sent to Foo Chuan Wei <chuanwei.foo <at> hotmail.com>:
New bug report received and forwarded. Copy sent to guix-patches <at> gnu.org. (Wed, 10 Nov 2021 08:57:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Foo Chuan Wei <chuanwei.foo <at> hotmail.com>
To: guix-patches <at> gnu.org
Subject: [PATCH 0/1] Add smlnj.
Date: Wed, 10 Nov 2021 08:35:53 +0000
This patch adds Standard ML of New Jersey 110.99.2 for x86_64-linux and
i686-linux.

There are some WIP patches in the guix-patches mailing list
(https://issues.guix.gnu.org/38606), but those patches did not succeed
in building smlnj + libraries.

Note that binary patching is necessary to deal with a hardcoded
"/bin/sh" in the bootfiles. Further reading about the /bin/sh issue:
https://lists.gnu.org/archive/html/help-guix/2021-11/msg00031.html

It is not feasible to avoid pre-built binaries. The documentation itself
says:
> When pulling the latest sources via subversion, there is no guarantee
> that config/install.sh will operate successfully due to a lack of
> usable bootfiles. In this case you might be able to generate new
> bootfiles using the bootstrap compiler (of an older version). Even
> that can be very difficult or even impossible [...]
Source: https://www.smlnj.org/dist/working/110.99.2/index.html

Credits:
* Brett Gilio's smlnj patch (https://issues.guix.gnu.org/38606#3), which
  this patch builds upon.
* I got help from Josselin Poiret on IRC
  (https://logs.guix.gnu.org/guix/2021-11-08.log#135443).
* I looked at how smlnj is packaged in NixOS:
  * https://github.com/NixOS/nixpkgs/blob/21.05/pkgs/development/compilers/smlnj/default.nix
  * https://web.archive.org/web/20140704103009/http://lists.science.uu.nl/pipermail/nix-dev/attachments/20101215/e1beb921/attachment.obj


Foo Chuan Wei (1):
  gnu: Add smlnj.

 gnu/packages/sml.scm | 261 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 260 insertions(+), 1 deletion(-)


base-commit: 7a4a77e05ac0ff29f7769bb689358dc76e2f58f4
-- 
2.25.1





Information forwarded to guix-patches <at> gnu.org:
bug#51745; Package guix-patches. (Wed, 10 Nov 2021 09:07:02 GMT) Full text and rfc822 format available.

Message #8 received at 51745 <at> debbugs.gnu.org (full text, mbox):

From: Foo Chuan Wei <chuanwei.foo <at> hotmail.com>
To: 51745 <at> debbugs.gnu.org
Subject: [PATCH 1/1] gnu: Add smlnj.
Date: Wed, 10 Nov 2021 09:05:59 +0000
* gnu/packages/sml.scm (smlnj): New variable.
---
 gnu/packages/sml.scm | 261 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 260 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/sml.scm b/gnu/packages/sml.scm
index b7e96f028c..c7e8da35e2 100644
--- a/gnu/packages/sml.scm
+++ b/gnu/packages/sml.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2017, 2021 Tobias Geerinckx-Rice <me <at> tobias.gr>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado <at> elephly.net>
 ;;; Copyright © 2019, 2020 Brett Gilio <brettg <at> gnu.org>
+;;; Copyright © 2021 Foo Chuan Wei <chuanwei.foo <at> hotmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -28,7 +29,8 @@
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module ((guix licenses) #:prefix license:)
-  #:use-module (guix packages))
+  #:use-module (guix packages)
+  #:use-module (guix utils))
 
 (define-public polyml
   (package
@@ -75,3 +77,260 @@ function interface, and a symbolic debugger.")
     (license
      (list license:lgpl2.1
            license:lgpl2.1+))))
+
+(define (smlnj-file version filename hash)
+  (origin
+    (method url-fetch)
+    (uri (string-append "http://smlnj.cs.uchicago.edu/dist/working/"
+                        version "/" filename))
+    (sha256 (base32 hash))))
+
+(define-public smlnj
+  (package
+    (name "smlnj")
+    (version "110.99.2")
+    (source #f)  ; Sources are passed as native-inputs.
+    (supported-systems '("x86_64-linux" "i686-linux"))
+    (build-system gnu-build-system)
+    (outputs '("out" "doc"))
+    (arguments
+     `(#:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'unpack
+           (lambda* (#:key inputs #:allow-other-keys)
+             (for-each
+               (lambda (file)
+                 (invoke "tar" "xvf" (assoc-ref inputs file)))
+               (list (if (string=? "i686-linux" ,(%current-system))
+                       "boot.x86-unix"
+                       "boot.amd64-unix")
+                     "config"
+                     "cm"
+                     "compiler"
+                     "runtime"
+                     "system"
+                     "MLRISC"
+                     "smlnj-lib"
+                     "old-basis"
+                     "ckit"
+                     "nlffi"
+                     "cml"
+                     "eXene"
+                     "ml-lpt"
+                     "ml-lex"
+                     "ml-yacc"
+                     "ml-burg"
+                     "pgraph"
+                     "trace-debug-profile"
+                     "heap2asm"
+                     "smlnj-c"
+                     "doc"
+                     "asdl"))
+             ;; Same directory structure as what the config/unpack script
+             ;; would produce.
+             (mkdir "base")
+             (rename-file "runtime" "base/runtime")
+             (rename-file "compiler" "base/compiler")
+             (rename-file "cm" "base/cm")
+             (rename-file "old-basis" "base/old-basis")
+             (rename-file "system" "base/system")
+             #t))
+         (delete 'configure)
+         (replace 'patch-source-shebangs
+           (lambda _
+             ;; Fix paths to /bin/sh.
+             (substitute* (list "config/install.sh"
+                                (if (string=? "i686-linux" ,(%current-system))
+                                  "base/runtime/objs/mk.x86-linux"
+                                  "base/runtime/objs/mk.amd64-linux")
+                                "asdl/configure"
+                                "asdl/src/asdlgen/Makefile.in")
+               (("^SHELL[[:space:]]*=[[:space:]]*/bin/sh")
+                (string-append "SHELL=" (which "sh"))))
+             (substitute* "asdl/configure"
+               (("^SHELL=\\$\\{CONFIG_SHELL-/bin/sh\\}")
+                (string-append "SHELL=" (which "sh"))))
+             (substitute* (list "asdl/src/gen/fragments/mkfrags_sh.in"
+                                "asdl/src/gen/fragments/mkmk_sh.in")
+               (("^#!/bin/sh")
+                (string-append "#!" (which "sh"))))
+             #t))
+         (replace 'build
+           (lambda* (#:key inputs outputs #:allow-other-keys)
+             (substitute* "config/chk-global-names.sh"
+               (("^CC=.*")
+                (string-append "CC=" ,(cc-for-target))))
+
+             ;; /bin and /usr/bin do not exist in the build environment.
+             (substitute* "config/_arch-n-opsys"
+               (("^export PATH") "")
+               (("^PATH=\"/bin:/usr/bin\"") "")
+               (("uname") (which "uname")))
+             (substitute* "base/runtime/config/gen-posix-names.sh"
+               (("^PATH=/bin:/usr/bin") ""))
+
+             ;; The build process uses an SML Basis Library function
+             ;; `OS.Process.system`, which uses "/bin/sh" (this is hardcoded).
+             ;; However, /bin/sh does not exist in the Guix build environment.
+             ;; Solution: binary patch — replace "/bin/sh" with "/tmp/sh".
+             (symlink (which "sh") "/tmp/sh")
+             (invoke "sed" "-i" "s,/bin/sh,/tmp/sh,"
+                     (if (string=? "i686-linux" ,(%current-system))
+                       "sml.boot.x86-unix/SMLNJ-BASIS/.cm/x86-unix/basis-common.cm"
+                       "sml.boot.amd64-unix/SMLNJ-BASIS/.cm/amd64-unix/basis-common.cm"))
+
+             ;; Build.
+             (invoke "./config/install.sh" "-default"
+                     (if (string=? "i686-linux" ,(%current-system))
+                       "32"
+                       "64"))
+
+             ;; Undo the binary patch.
+             (for-each
+               (lambda (file)
+                 (invoke "sed" "-i" "s,/tmp/sh,/bin/sh," file))
+               (if (string=? "i686-linux" ,(%current-system))
+                 '("bin/.heap/sml.x86-linux"
+                   "lib/SMLNJ-BASIS/.cm/x86-unix/basis-common.cm")
+                 '("bin/.heap/sml.amd64-linux"
+                   "lib/SMLNJ-BASIS/.cm/amd64-unix/basis-common.cm")))
+
+             ;; Set SMLNJ_HOME in the bin/ files, so that `sml` is able to find
+             ;; the SML/NJ Library.
+             (let ((out (assoc-ref outputs "out")))
+               (for-each
+                 (lambda (file)
+                   (invoke "sed" "-i"
+                           (string-append "2iSMLNJ_HOME=${SMLNJ_HOME:-" out "}")
+                           file))
+                 '("bin/.link-sml"
+                   "bin/.run-sml"
+                   "bin/ml-build"
+                   "bin/ml-makedepend")))))
+        (replace 'install
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let* ((out (assoc-ref outputs "out"))
+                    (out-bin (string-append out "/bin/"))
+                    (out-lib (string-append out "/lib/"))
+                    (out-man (string-append out "/share/man/")))
+               (copy-recursively "bin" out-bin)
+               (copy-recursively "lib" out-lib)
+               (copy-recursively "doc/man" out-man))
+             #t))
+        (add-after 'install 'install-doc
+           (lambda* (#:key outputs #:allow-other-keys)
+             (let ((doc (string-append (assoc-ref outputs "doc")
+                                       "/share/doc/smlnj")))
+               (mkdir-p doc)
+               (copy-recursively "doc" doc))
+             #t)))))
+    (native-inputs
+     `(,(if (string=? "i686-linux" (%current-system))
+          `("boot.x86-unix"
+            ,(smlnj-file version
+                         "boot.x86-unix.tgz"
+                         "117dq1g387vcy1105dlpw770gzrg423jng89ynraiy6kiaalvbcq"))
+          `("boot.amd64-unix"
+            ,(smlnj-file version
+                         "boot.amd64-unix.tgz"
+                         "0cbaz8sxp30y2a4blm0pzk9aa1g9jj65d6d7kydvn0w7m22rjjff")))
+       ("config"
+        ,(smlnj-file version
+                     "config.tgz"
+                     "1sq60frd66kv807bahsyxda355qq67zvvb4sr1d72cv6capv5nsg"))
+       ("cm"
+        ,(smlnj-file version
+                     "cm.tgz"
+                     "087yy9k9vyyvhb24rni6js7s8iqbs8vjm9kjd9s311swjd66qhjc"))
+       ("compiler"
+        ,(smlnj-file version
+                     "compiler.tgz"
+                     "149vrmiba0dqggr15axqqzzfmd0kx7kchlr49gii6hw5dal6vqnn"))
+       ("runtime"
+        ,(smlnj-file version
+                     "runtime.tgz"
+                     "0c3q7qr2i3r91sx9p3z1ar7gvyk6qsm5gcbpbyj6l67qzn192yc3"))
+       ("system"
+        ,(smlnj-file version
+                     "system.tgz"
+                     "0aflnqh9zi9f8vs9pjlxysxplrwl98aiaxx4n41sba4m1r30n0za"))
+       ("MLRISC"
+        ,(smlnj-file version
+                     "MLRISC.tgz"
+                     "1kkga7r7qnw09s8yhqbhrq8gxf6c8x0fiwsbwkr8ls6xwv48sp74"))
+       ("smlnj-lib"
+        ,(smlnj-file version
+                     "smlnj-lib.tgz"
+                     "14fvqgn580k3ylvfhbkwv4cw87ipggq548r7jzp8fzfn2h6wdl01"))
+       ("old-basis"
+        ,(smlnj-file version
+                     "old-basis.tgz"
+                     "11j7a0sxyd1kwxjvxnarab5vc3x43gl90m07wxm37fd4jbfd1fn1"))
+       ("ckit"
+        ,(smlnj-file version
+                     "ckit.tgz"
+                     "1fbfjb2fhr6zkcz5jhqh3888zska6vffndyqwvk6rpbcl7an8niq"))
+       ("nlffi"
+        ,(smlnj-file version
+                     "nlffi.tgz"
+                     "0p5z77x295xfh71481kbd5pwis52kv03vxpad4pzkpk0l6smcgmj"))
+       ("cml"
+        ,(smlnj-file version
+                     "cml.tgz"
+                     "13xchaamwanxhwklsgkn1rmkr044h9qsj0rbr9c7pm903yivdwcn"))
+       ("eXene"
+        ,(smlnj-file version
+                     "eXene.tgz"
+                     "0p4snql0a1a952h98ma9ybmp7z1q305mz859b0mxhsg3jdrzl9wb"))
+       ("ml-lpt"
+        ,(smlnj-file version
+                     "ml-lpt.tgz"
+                     "0m00vglg95apdpzsy6qv88izj5ai4ibylxni01an75xpnxyy5qbg"))
+       ("ml-lex"
+        ,(smlnj-file version
+                     "ml-lex.tgz"
+                     "1pmi5qwjcf1h5nfi7d4vvm7cf90g6dlk2mqikj0y9c464ia1l2jc"))
+       ("ml-yacc"
+        ,(smlnj-file version
+                     "ml-yacc.tgz"
+                     "1zla2m1rn8r8k85ps9r2mw38xkh276j7aqv9f69v55102hchx13p"))
+       ("ml-burg"
+        ,(smlnj-file version
+                     "ml-burg.tgz"
+                     "14cqasasa273x09phykzjgk1wl6vrkdcwrdi39hnacp443cilz7x"))
+       ("pgraph"
+        ,(smlnj-file version
+                     "pgraph.tgz"
+                     "183fv61xlac5kpxn5m4iqgdvc2xb1chlxy5ip4i25x589bh4b5k9"))
+       ("trace-debug-profile"
+        ,(smlnj-file version
+                     "trace-debug-profile.tgz"
+                     "1k0w581kr43mpjzm7778xgx1rpz45aq1h80jdr6jls5vz3k8ia18"))
+       ("heap2asm"
+        ,(smlnj-file version
+                     "heap2asm.tgz"
+                     "0p9s42acngxh0401wm6fqs3im3rzzw9sh448x38zhdi47h8h1m9n"))
+       ("smlnj-c"
+        ,(smlnj-file version
+                     "smlnj-c.tgz"
+                     "054b1nhg5yk2jj01p11k08qzq8zc9jzg4mbgkcmcqaq7axp1rnxm"))
+       ("doc"
+        ,(smlnj-file version
+                     "doc.tgz"
+                     "0s35zrxdj76wzdz7c1i8ij00n6lfll4vjnypsy2j17q1maw7fq8j"))
+       ("asdl"
+        ,(smlnj-file version
+                     "asdl.tgz"
+                     "0mad2df5pmkdsb69gflxma6m6i3gla6hdmjjnkzk76pagpr8zb0m"))))
+    (home-page "http://www.smlnj.org")
+    (synopsis "Standard ML of New Jersey interactive compiler")
+    (description
+      "SML/NJ is an implementation of the Standard ML programming language.
+Standard ML has many features, including type safety, polymorphism, algebraic
+data types with pattern matching, higher-order functions, and a sophisticated
+module system.  It is especially well-suited for writing compilers and other
+language processors.")
+    (license (license:fsf-free
+               "https://www.smlnj.org/license.html"
+               "https://www.gnu.org/licenses/license-list#StandardMLofNJ"))))
-- 
2.25.1





Reply sent to Ludovic Courtès <ludo <at> gnu.org>:
You have taken responsibility. (Fri, 10 Dec 2021 14:00:02 GMT) Full text and rfc822 format available.

Notification sent to Foo Chuan Wei <chuanwei.foo <at> hotmail.com>:
bug acknowledged by developer. (Fri, 10 Dec 2021 14:00:02 GMT) Full text and rfc822 format available.

Message #13 received at 51745-done <at> debbugs.gnu.org (full text, mbox):

From: Ludovic Courtès <ludo <at> gnu.org>
To: 51745-done <at> debbugs.gnu.org
Cc: Foo Chuan Wei <chuanwei.foo <at> hotmail.com>
Subject: Re: bug#51745: [PATCH 0/1] Add smlnj.
Date: Fri, 10 Dec 2021 14:59:25 +0100
Hi,

Foo Chuan Wei <chuanwei.foo <at> hotmail.com> skribis:

> This patch adds Standard ML of New Jersey 110.99.2 for x86_64-linux and
> i686-linux.
>
> There are some WIP patches in the guix-patches mailing list
> (https://issues.guix.gnu.org/38606), but those patches did not succeed
> in building smlnj + libraries.
>
> Note that binary patching is necessary to deal with a hardcoded
> "/bin/sh" in the bootfiles. Further reading about the /bin/sh issue:
> https://lists.gnu.org/archive/html/help-guix/2021-11/msg00031.html
>
> It is not feasible to avoid pre-built binaries. The documentation itself
> says:
>> When pulling the latest sources via subversion, there is no guarantee
>> that config/install.sh will operate successfully due to a lack of
>> usable bootfiles. In this case you might be able to generate new
>> bootfiles using the bootstrap compiler (of an older version). Even
>> that can be very difficult or even impossible [...]
> Source: https://www.smlnj.org/dist/working/110.99.2/index.html

Noted.  This is obviously below our demanding standards, but I
understand this is not avoidable right now.

It would be great if you could get in touch with upstream though.  You
could mention that OCaml is now bootstrapped from source, thanks to the
work by Gabriel Scherrer, Julie Lepiller, et al.  Perhaps that’s enough
of an incentive to get SMLNJ bootstrapped?  :-)

> Credits:
> * Brett Gilio's smlnj patch (https://issues.guix.gnu.org/38606#3), which
>   this patch builds upon.
> * I got help from Josselin Poiret on IRC
>   (https://logs.guix.gnu.org/guix/2021-11-08.log#135443).
> * I looked at how smlnj is packaged in NixOS:
>   * https://github.com/NixOS/nixpkgs/blob/21.05/pkgs/development/compilers/smlnj/default.nix
>   * https://web.archive.org/web/20140704103009/http://lists.science.uu.nl/pipermail/nix-dev/attachments/20101215/e1beb921/attachment.obj

I added Brett as co-author in the commit log.

> * gnu/packages/sml.scm (smlnj): New variable.

Applied, thank you and everyone involved!

Ludo’.




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Sat, 08 Jan 2022 12:24:08 GMT) Full text and rfc822 format available.

This bug report was last modified 2 years and 107 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.