gnu: Add smlnj.
* gnu/packages/sml.scm (smlnj): New variable. Co-authored-by: Brett Gilio <brettg@gnu.org> Signed-off-by: Ludovic Courtès <ludo@gnu.org>master
parent
16e9e53838
commit
f0adb870ac
|
@ -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"))))
|
||||
|
|
Reference in New Issue