unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#51745] [PATCH 0/1] Add smlnj.
@ 2021-11-10  8:35 Foo Chuan Wei
  2021-11-10  9:05 ` [bug#51745] [PATCH 1/1] gnu: " Foo Chuan Wei
  2021-12-10 13:59 ` bug#51745: [PATCH 0/1] " Ludovic Courtès
  0 siblings, 2 replies; 3+ messages in thread
From: Foo Chuan Wei @ 2021-11-10  8:35 UTC (permalink / raw)
  To: 51745

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





^ permalink raw reply	[flat|nested] 3+ messages in thread

* [bug#51745] [PATCH 1/1] gnu: Add smlnj.
  2021-11-10  8:35 [bug#51745] [PATCH 0/1] Add smlnj Foo Chuan Wei
@ 2021-11-10  9:05 ` Foo Chuan Wei
  2021-12-10 13:59 ` bug#51745: [PATCH 0/1] " Ludovic Courtès
  1 sibling, 0 replies; 3+ messages in thread
From: Foo Chuan Wei @ 2021-11-10  9:05 UTC (permalink / raw)
  To: 51745

* 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@tobias.gr>
 ;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net>
 ;;; Copyright © 2019, 2020 Brett Gilio <brettg@gnu.org>
+;;; Copyright © 2021 Foo Chuan Wei <chuanwei.foo@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





^ permalink raw reply related	[flat|nested] 3+ messages in thread

* bug#51745: [PATCH 0/1] Add smlnj.
  2021-11-10  8:35 [bug#51745] [PATCH 0/1] Add smlnj Foo Chuan Wei
  2021-11-10  9:05 ` [bug#51745] [PATCH 1/1] gnu: " Foo Chuan Wei
@ 2021-12-10 13:59 ` Ludovic Courtès
  1 sibling, 0 replies; 3+ messages in thread
From: Ludovic Courtès @ 2021-12-10 13:59 UTC (permalink / raw)
  To: 51745-done; +Cc: Foo Chuan Wei

Hi,

Foo Chuan Wei <chuanwei.foo@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’.




^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-12-10 14:00 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-10  8:35 [bug#51745] [PATCH 0/1] Add smlnj Foo Chuan Wei
2021-11-10  9:05 ` [bug#51745] [PATCH 1/1] gnu: " Foo Chuan Wei
2021-12-10 13:59 ` bug#51745: [PATCH 0/1] " Ludovic Courtès

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).