gnu: racket: Unbundle racket-minimal.
This change takes advantage of improved support for layered and tethered installations in Racket 8.2. * gnu/packages/racket.scm (extend-layer): New private variable. This is a script for configuring a new config-tethered layer chaining to an existing Racket installation. * gnu/packages/racket.scm (racket)[source](snippet): Unbundle `racket-minimal`. [inputs]: Remove inputs that properly belong to `racket-minimal`. [native-inputs]: Add `racket-minimal` and `extend-layer`. [arguments]: Stop inheriting from `racket-minimal`. Add phase 'unpack-packages to move the sources and links file into place. Replace 'configure phase using `extend-layer`. Replace 'build phase using `raco setup`. Delete 'install phase. * gnu/packages/patches/racket-sh-via-rktio.patch: Rename to ... * gnu/packages/patches/racket-minimal-sh-via-rktio.patch: ... this file to placate `guix lint`. * gnu/local.mk (dist_patch_DATA): Update accordingly. * gnu/packages/racket.scm (racket-minimal)[source]: Likewise. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
parent
1ae95ebcdd
commit
65bad4d036
|
@ -1685,7 +1685,7 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/ripperx-missing-file.patch \
|
%D%/packages/patches/ripperx-missing-file.patch \
|
||||||
%D%/packages/patches/rpcbind-CVE-2017-8779.patch \
|
%D%/packages/patches/rpcbind-CVE-2017-8779.patch \
|
||||||
%D%/packages/patches/rtags-separate-rct.patch \
|
%D%/packages/patches/rtags-separate-rct.patch \
|
||||||
%D%/packages/patches/racket-sh-via-rktio.patch \
|
%D%/packages/patches/racket-minimal-sh-via-rktio.patch \
|
||||||
%D%/packages/patches/remake-impure-dirs.patch \
|
%D%/packages/patches/remake-impure-dirs.patch \
|
||||||
%D%/packages/patches/retroarch-LIBRETRO_DIRECTORY.patch \
|
%D%/packages/patches/retroarch-LIBRETRO_DIRECTORY.patch \
|
||||||
%D%/packages/patches/rnp-add-version.cmake.patch \
|
%D%/packages/patches/rnp-add-version.cmake.patch \
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
%installer-mirrors))
|
%installer-mirrors))
|
||||||
(sha256 "13qfg56w554vdj5iwa8lpacy83s7bzhhyr44pjns68mkhj69ring")
|
(sha256 "13qfg56w554vdj5iwa8lpacy83s7bzhhyr44pjns68mkhj69ring")
|
||||||
(patches (search-patches
|
(patches (search-patches
|
||||||
"racket-sh-via-rktio.patch"))))
|
"racket-minimal-sh-via-rktio.patch"))))
|
||||||
(home-page "https://racket-lang.org")
|
(home-page "https://racket-lang.org")
|
||||||
(synopsis "Racket without bundled packages such as DrRacket")
|
(synopsis "Racket without bundled packages such as DrRacket")
|
||||||
(inputs
|
(inputs
|
||||||
|
@ -183,10 +183,52 @@ DrRacket IDE, are not included.")
|
||||||
%installer-mirrors))
|
%installer-mirrors))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"10sgzsraxzxp1k2y2wvz8rcjwvhbcd6k72l9lyqr34yazlwfdz26"))))
|
"10sgzsraxzxp1k2y2wvz8rcjwvhbcd6k72l9lyqr34yazlwfdz26"))
|
||||||
|
(snippet
|
||||||
|
#~(begin
|
||||||
|
(use-modules (guix build utils)
|
||||||
|
(ice-9 match)
|
||||||
|
(ice-9 regex))
|
||||||
|
;; unbundle minimal Racket
|
||||||
|
(for-each delete-file-recursively
|
||||||
|
'("collects"
|
||||||
|
"doc"
|
||||||
|
"etc"
|
||||||
|
"README"
|
||||||
|
"src"))
|
||||||
|
;; unbundle package sources included elsewhere
|
||||||
|
(define (substitute/delete file pattern)
|
||||||
|
(substitute
|
||||||
|
file
|
||||||
|
(list (cons pattern
|
||||||
|
(lambda (line matches)
|
||||||
|
;; must match exactly once
|
||||||
|
(match matches
|
||||||
|
((m)
|
||||||
|
(string-append (match:prefix m)
|
||||||
|
(match:suffix m)))))))))
|
||||||
|
(define (unbundle-pkg pkg)
|
||||||
|
(define quoted-pkg (regexp-quote pkg))
|
||||||
|
(with-directory-excursion "share"
|
||||||
|
(substitute/delete
|
||||||
|
"links.rktd"
|
||||||
|
(string-append
|
||||||
|
"[(][^()]+[(]#\"pkgs\" #\""
|
||||||
|
quoted-pkg
|
||||||
|
"\"[)][)]"))
|
||||||
|
(with-directory-excursion "pkgs"
|
||||||
|
(substitute/delete
|
||||||
|
"pkgs.rktd"
|
||||||
|
(string-append
|
||||||
|
"[(]\""
|
||||||
|
quoted-pkg
|
||||||
|
"\" \\. #s[(]"
|
||||||
|
"(pkg-info|[(]sc-pkg-info pkg-info 3[)])"
|
||||||
|
" [(][^()]+[)] [^()]+[)][)]"))
|
||||||
|
(delete-file-recursively pkg))))
|
||||||
|
(unbundle-pkg "racket-lib")))))
|
||||||
(inputs
|
(inputs
|
||||||
`(;; sqlite and libraries for `racket/draw' are needed to build the doc.
|
`(("cairo" ,cairo)
|
||||||
("cairo" ,cairo)
|
|
||||||
("fontconfig" ,fontconfig)
|
("fontconfig" ,fontconfig)
|
||||||
("glib" ,glib)
|
("glib" ,glib)
|
||||||
("glu" ,glu)
|
("glu" ,glu)
|
||||||
|
@ -199,8 +241,67 @@ DrRacket IDE, are not included.")
|
||||||
("mpfr" ,mpfr)
|
("mpfr" ,mpfr)
|
||||||
("pango" ,pango)
|
("pango" ,pango)
|
||||||
("unixodbc" ,unixodbc)
|
("unixodbc" ,unixodbc)
|
||||||
("libedit" ,libedit)
|
("libedit" ,libedit)))
|
||||||
,@(package-inputs racket-minimal)))
|
(native-inputs
|
||||||
|
`(("racket" ,racket-minimal)
|
||||||
|
("extend-layer" ,extend-layer)))
|
||||||
|
(arguments
|
||||||
|
`(#:phases
|
||||||
|
(modify-phases %standard-phases
|
||||||
|
(add-before 'configure 'unpack-packages
|
||||||
|
(lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
|
||||||
|
(let ((racket (assoc-ref (or native-inputs inputs) "racket"))
|
||||||
|
(prefix (assoc-ref outputs "out")))
|
||||||
|
(mkdir-p (string-append prefix "/share/racket/pkgs"))
|
||||||
|
(copy-recursively
|
||||||
|
"share/links.rktd"
|
||||||
|
(string-append prefix "/share/racket/links.rktd"))
|
||||||
|
(copy-recursively
|
||||||
|
"share/pkgs"
|
||||||
|
(string-append prefix "/share/racket/pkgs"))
|
||||||
|
#t)))
|
||||||
|
(replace 'configure
|
||||||
|
(lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
|
||||||
|
(let ((racket (assoc-ref (or native-inputs inputs) "racket"))
|
||||||
|
(prefix (assoc-ref outputs "out")))
|
||||||
|
(apply invoke
|
||||||
|
(string-append racket "/bin/racket")
|
||||||
|
(assoc-ref inputs "extend-layer")
|
||||||
|
racket
|
||||||
|
prefix
|
||||||
|
(map
|
||||||
|
(lambda (lib)
|
||||||
|
(string-append (assoc-ref inputs lib) "/lib"))
|
||||||
|
'("cairo"
|
||||||
|
"fontconfig"
|
||||||
|
"glib"
|
||||||
|
"glu"
|
||||||
|
"gmp"
|
||||||
|
"gtk+"
|
||||||
|
"libjpeg"
|
||||||
|
"libpng"
|
||||||
|
"libx11"
|
||||||
|
"mesa"
|
||||||
|
"mpfr"
|
||||||
|
"pango"
|
||||||
|
"unixodbc"
|
||||||
|
"libedit")))
|
||||||
|
#t)))
|
||||||
|
(replace 'build
|
||||||
|
(lambda* (#:key native-inputs inputs outputs #:allow-other-keys)
|
||||||
|
(invoke (string-append (assoc-ref (or native-inputs inputs)
|
||||||
|
"racket")
|
||||||
|
"/bin/racket")
|
||||||
|
"--config"
|
||||||
|
(string-append (assoc-ref outputs "out")
|
||||||
|
"/etc/racket")
|
||||||
|
"-l"
|
||||||
|
"raco"
|
||||||
|
"setup")
|
||||||
|
#t))
|
||||||
|
(delete 'install))
|
||||||
|
;; we still don't have these:
|
||||||
|
#:tests? #f))
|
||||||
(synopsis "A programmable programming language in the Scheme family")
|
(synopsis "A programmable programming language in the Scheme family")
|
||||||
(description
|
(description
|
||||||
"Racket is a general-purpose programming language in the Scheme family,
|
"Racket is a general-purpose programming language in the Scheme family,
|
||||||
|
@ -211,3 +312,83 @@ languages to complete language implementations.
|
||||||
The main Racket distribution comes with many bundled packages, including the
|
The main Racket distribution comes with many bundled packages, including the
|
||||||
DrRacket IDE, libraries for GUI and web programming, and implementations of
|
DrRacket IDE, libraries for GUI and web programming, and implementations of
|
||||||
languages such as Typed Racket, R5RS and R6RS Scheme, Algol 60, and Datalog.")))
|
languages such as Typed Racket, R5RS and R6RS Scheme, Algol 60, and Datalog.")))
|
||||||
|
|
||||||
|
|
||||||
|
(define extend-layer
|
||||||
|
(scheme-file
|
||||||
|
"extend-layer.rkt"
|
||||||
|
`(module
|
||||||
|
extend-layer racket/base
|
||||||
|
(require racket/cmdline
|
||||||
|
racket/match
|
||||||
|
racket/file
|
||||||
|
racket/list
|
||||||
|
racket/pretty)
|
||||||
|
(define config-file-pth
|
||||||
|
"etc/racket/config.rktd")
|
||||||
|
(define (build-path-string . args)
|
||||||
|
(path->string (apply build-path args)))
|
||||||
|
(define rx:racket
|
||||||
|
;; Guile's reader doesn't support #rx"racket"
|
||||||
|
(regexp "racket"))
|
||||||
|
(command-line
|
||||||
|
#:args (parent-layer prefix . lib-dir*)
|
||||||
|
(let* ([config
|
||||||
|
(for/fold
|
||||||
|
([config (file->value (build-path parent-layer
|
||||||
|
config-file-pth))])
|
||||||
|
([spec (in-list
|
||||||
|
'((lib-dir lib-search-dirs "lib/racket")
|
||||||
|
(share-dir share-search-dirs "share/racket")
|
||||||
|
(links-file
|
||||||
|
links-search-files
|
||||||
|
"share/racket/links.rktd")
|
||||||
|
(pkgs-dir pkgs-search-dirs "share/racket/pkgs")
|
||||||
|
(bin-dir bin-search-dirs "bin")
|
||||||
|
(man-dir man-search-dirs "share/man")
|
||||||
|
(doc-dir doc-search-dirs "share/doc/racket")
|
||||||
|
(include-dir
|
||||||
|
include-search-dirs
|
||||||
|
"include/racket")))])
|
||||||
|
(match-define (list main-key search-key pth) spec)
|
||||||
|
(hash-set*
|
||||||
|
config
|
||||||
|
main-key
|
||||||
|
(build-path-string prefix pth)
|
||||||
|
search-key
|
||||||
|
(list* #f
|
||||||
|
(hash-ref config
|
||||||
|
main-key
|
||||||
|
(build-path-string parent-layer pth))
|
||||||
|
(filter values (hash-ref config search-key null)))))]
|
||||||
|
[config
|
||||||
|
(hash-set config
|
||||||
|
'apps-dir
|
||||||
|
(build-path-string prefix "share/applications"))]
|
||||||
|
[config
|
||||||
|
;; place new foreign lib-search-dirs before old
|
||||||
|
;; foreign dirs, but after Racket layers
|
||||||
|
(let-values
|
||||||
|
([(rkt extra)
|
||||||
|
(partition (lambda (pth)
|
||||||
|
(or (not pth)
|
||||||
|
(regexp-match? rx:racket pth)))
|
||||||
|
(hash-ref config 'lib-search-dirs))])
|
||||||
|
(hash-set config
|
||||||
|
'lib-search-dirs
|
||||||
|
(append rkt
|
||||||
|
lib-dir*
|
||||||
|
extra)))]
|
||||||
|
[bin-dir
|
||||||
|
(hash-ref config 'bin-dir)]
|
||||||
|
[config
|
||||||
|
(hash-set* config
|
||||||
|
'config-tethered-console-bin-dir bin-dir
|
||||||
|
'config-tethered-gui-bin-dir bin-dir)]
|
||||||
|
[new-config-pth
|
||||||
|
(build-path prefix config-file-pth)])
|
||||||
|
(make-parent-directory* new-config-pth)
|
||||||
|
(call-with-output-file*
|
||||||
|
new-config-pth
|
||||||
|
(lambda (out)
|
||||||
|
(pretty-write config out))))))))
|
||||||
|
|
Reference in New Issue