From: Foo Chuan Wei <chuanwei.foo@hotmail.com>
To: 51745@debbugs.gnu.org
Subject: [bug#51745] [PATCH 1/1] gnu: Add smlnj.
Date: Wed, 10 Nov 2021 09:05:59 +0000 [thread overview]
Message-ID: <PU1PR01MB21556F4657869CEC5B7474938D939@PU1PR01MB2155.apcprd01.prod.exchangelabs.com> (raw)
In-Reply-To: <PU1PR01MB215590A376F501377C2848958D939@PU1PR01MB2155.apcprd01.prod.exchangelabs.com>
* 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
next prev parent reply other threads:[~2021-11-10 9:07 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-10 8:35 [bug#51745] [PATCH 0/1] Add smlnj Foo Chuan Wei
2021-11-10 9:05 ` Foo Chuan Wei [this message]
2021-12-10 13:59 ` bug#51745: " Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=PU1PR01MB21556F4657869CEC5B7474938D939@PU1PR01MB2155.apcprd01.prod.exchangelabs.com \
--to=chuanwei.foo@hotmail.com \
--cc=51745@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).