diff mbox series

[bug#53878,v6,03/24] gnu: racket: Use Git origins for Racket packages.

Message ID 20220227023450.1877215-4-philip@philipmcgrath.com
State Accepted
Headers show
Series Update Racket to 8.4. Adjust Chez Scheme packages. | expand

Checks

Context Check Description
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch success View Laminar job
cbaines/issue success View issue

Commit Message

Philip McGrath Feb. 27, 2022, 2:34 a.m. UTC
* gnu/packages/patches/racket-gui-tethered-launcher-backport.patch:
Adjust path.
* gnu/packages/racket.scm (racket-packages-origin,
simple-racket-origin): New procedures.
(extend-layer): Rename to ...
(configure-layer.rkt): ... this variable. Tweak command-line
arguments. Adapt to 'config-tethered-apps-dir'.
(racket): Stop inheriting from 'racket-minimal'.
[version]: Use '%racket-version'.
[source]: Stop using bundled tarball.
[inputs]: Remove labels. Add 'racket-minimal' and package sources.
[native-inputs]: Remove, since cross-compilation doesn't work yet.
[arguments]: Rewrite to use G-expressions, package sources from
'inputs', an explicit 'install' phase, and the revised
'configure-layer.rkt'.
---
 ...acket-gui-tethered-launcher-backport.patch |   6 +-
 gnu/packages/racket.scm                       | 714 +++++++++++++-----
 2 files changed, 539 insertions(+), 181 deletions(-)

Comments

Liliana Marie Prikler Feb. 27, 2022, 8:42 a.m. UTC | #1
Hi,

Am Samstag, dem 26.02.2022 um 21:34 -0500 schrieb Philip McGrath:
> * gnu/packages/patches/racket-gui-tethered-launcher-backport.patch:
> Adjust path.
> * gnu/packages/racket.scm (racket-packages-origin,
> simple-racket-origin): New procedures.
> (extend-layer): Rename to ...
> (configure-layer.rkt): ... this variable. Tweak command-line
> arguments. Adapt to 'config-tethered-apps-dir'.
> (racket): Stop inheriting from 'racket-minimal'.
> [version]: Use '%racket-version'.
> [source]: Stop using bundled tarball.
> [inputs]: Remove labels. Add 'racket-minimal' and package sources.
> [native-inputs]: Remove, since cross-compilation doesn't work yet.
> [arguments]: Rewrite to use G-expressions, package sources from
> 'inputs', an explicit 'install' phase, and the revised
> 'configure-layer.rkt'.
> ---
>  ...acket-gui-tethered-launcher-backport.patch |   6 +-
>  gnu/packages/racket.scm                       | 714 +++++++++++++---
> --
>  2 files changed, 539 insertions(+), 181 deletions(-)
> 
> diff --git a/gnu/packages/patches/racket-gui-tethered-launcher-
> backport.patch b/gnu/packages/patches/racket-gui-tethered-launcher-
> backport.patch
> index abf253486f..1e018eaa79 100644
> --- a/gnu/packages/patches/racket-gui-tethered-launcher-
> backport.patch
> +++ b/gnu/packages/patches/racket-gui-tethered-launcher-
> backport.patch
> @@ -7,13 +7,13 @@ Related to racket/racket#4133
>  
>  (cherry picked from commit 563c68432f127729592f234ef30c31e92618b517)
>  ---
> - share/pkgs/gui-lib/mred/installer.rkt | 3 ++-
> + gui-lib/mred/installer.rkt | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
>  
>  diff --git a/gui-lib/mred/installer.rkt b/gui-lib/mred/installer.rkt
>  index b1691472..9ef06c53 100644
> ---- a/share/pkgs/gui-lib/mred/installer.rkt
> -+++ b/share/pkgs/gui-lib/mred/installer.rkt
> +--- a/gui-lib/mred/installer.rkt
> ++++ b/gui-lib/mred/installer.rkt
>  @@ -72,4 +72,5 @@
>      (list "-A" (path->string (find-system-path 'addon-dir)))))
>   
> diff --git a/gnu/packages/racket.scm b/gnu/packages/racket.scm
> index 00ec587eeb..c4e5ee1311 100644
> --- a/gnu/packages/racket.scm
> +++ b/gnu/packages/racket.scm
> @@ -28,7 +28,9 @@ (define-module (gnu packages racket)
>    #:use-module (guix gexp)
>    #:use-module (guix build-system gnu)
>    #:use-module (srfi srfi-1)
> +  #:use-module (srfi srfi-26)
>    #:use-module (ice-9 match)
> +  #:use-module (ice-9 exceptions)
>    #:use-module (gnu packages)
>    #:use-module (gnu packages autotools)
>    #:use-module (gnu packages bash)
> @@ -389,172 +391,504 @@ (define-public racket-bootstrap-chez-
> bootfiles
>  Chez Scheme.")
>       (license (list license:asl2.0)))))
>  
> +(define (racket-packages-origin name origin spec0 . spec*)
> +  "Extract from ORIGIN the sources for the Racket packages specified
> by SPEC0
> +and any additional arguments SPEC*.  In the resulting file-like
> object, each
> +package's source will be in the directory
> \"/share/racket/pkgs/PKG/\", where
> +PKG is the Racket name for the package.  The NAME will be used in
> the store
> +file name for the resulting file-like object.
>  
> -(define %installer-mirrors
> -  ;; Source:
> -  ;;
> https://github.com/racket/racket-lang-org/blob/master/download/data.rkt#L58
> -  ;; Matthew Flatt says: "note that many are commented out"
> -  ;; INVARIANT: End with a trailing "/"!
> -  '("https://mirror.racket-lang.org/installers/"
> -    "https://www.cs.utah.edu/plt/installers/"
> -    "https://plt.cs.northwestern.edu/racket-mirror/"
> -    "https://mirror.csclub.uwaterloo.ca/racket/racket-installers/"
> -    ;; Universität Tübingen is using a self-signed HTTPS
> certificate:
> -    "http://mirror.informatik.uni-tuebingen.de/mirror/racket/"
> -    "https://racket.infogroep.be/"
> -    ))
> +A package specification is a list of the form:
>  
> -(define %main-repo-main-distribution-pkgs
> -  ;; These are the packages developed in the main Racket Git
> repository
> -  ;; that are part of the main distribution.
> -  '("at-exp-lib"
> -    "base"
> -    "compiler-lib"
> -    ;; NOT "compiler-test"
> -    "compiler"
> -    "net-doc"
> -    "net-lib"
> -    ;; NOT "net-test"
> -    "net"
> -    ;; NOT "plt-services"
> -    ;; NOT "racket-benchmarks"
> -    ;; NOT "racket-build-guide"
> -    "racket-doc"
> -    "racket-index"
> -    "racket-lib"
> -    ;; NOT "racket-test-core"
> -    ;; NOT "racket-test-extra"
> -    ;; NOT "racket-test"
> -    "zo-lib"))
> +  (PKG PATH)
>  
> +where PATH is the path to the package source relative to ORIGIN---
> possibly
> +\".\".  As a special case, a package specification may also be a
> string, which
> +is equivalent to:
> +
> +  (PKG PKG)
> +
> +Examples:
> +
> +- \"expeditor\"
> +- (\"main-distribution\" \".\")
> +- (\"racket-lib\" \"pkgs/racket-lib\")"
> +  (computed-file
> +   (string-append "racket-pkg-" name "-sources")
> +   (with-imported-modules `((guix build utils))
> +     #~(begin
> +         (use-modules (guix build utils))
> +         (mkdir-p (string-append #$output "/share/racket/pkgs"))
> +         (chdir (string-append #$output "/share/racket/pkgs"))
> +         #$@(map (match-lambda
> +                   ((? string? name)
> +                    #~(copy-recursively #$(file-append origin
> (string-append "/" name))
> +                                        #$name))
> +                   ((name ".")
> +                    #~(copy-recursively #$origin #$name))
> +                   ((name path)
> +                    #~(copy-recursively #$(file-append origin
> (string-append "/" path))
> +                                        #$name)))
> +                 (cons spec0 spec*))))))
Perhaps I wasn't clear enough about this in v5, but I think spec should
be a single argument rather than multiple ones.  This way, if we do
find that we need to extend it to support an additional argument, we
don't have to awkwardly code around the #:rest.

> +(define (simple-racket-origin repo hash spec0 . spec*)
> +  "Like 'racket-packages-origin', but specialized for packages
> hosted at
> +\"https://github.com/racket/REPO\" with sha256 checksum HASH.  REPO
> is also
> +used to build the name of the resulting store item."
> +  (apply racket-packages-origin
> +         repo
> +         (origin
> +           (method git-fetch)
> +           (uri (git-reference
> +                 (url (format #f "https://github.com/racket/~a"
> repo))
> +                 (commit %racket-commit)))
> +           (sha256 hash)
> +           (file-name (git-file-name (string-append "racket-" repo)
> +                                     %racket-version)))
> +         spec0
> +         spec*))
Same here, plus it saves us the trouble of a additional "apply".

The effect for 
> +      (simple-racket-origin
> +       "2d" (base32
> "1zzcz5qyjv7syi41vb8jkxjp1rqgj61zbsdrg0nlc4qy9qsafzgr")
> +       "2d" "2d-doc" "2d-lib")
would be that '("2d" "2d-doc" "2d-lib") is more clearly delimited from
the package name and hash, and

> +      (racket-packages-origin
> +       "racket" %racket-origin
> +       '("base" "pkgs/base") ;; FIXME belongs in racket-minimal
> +       '("racket-lib" "pkgs/racket-lib") ;; FIXME belongs in racket-
> minimal
> +       '("at-exp-lib" "pkgs/at-exp-lib")
> +       '("compiler" "pkgs/compiler")
> +       '("compiler-lib" "pkgs/compiler-lib")
> +       '("net" "pkgs/net")
> +       '("net-doc" "pkgs/net-doc")
> +       '("net-lib" "pkgs/net-lib")
> +       '("racket-doc" "pkgs/racket-doc")
> +       '("racket-index" "pkgs/racket-index")
> +       '("sandbox-lib" "pkgs/sandbox-lib")
> +       '("zo-lib" "pkgs/zo-lib"))
'(("base" "pkgs/base") ("racket-lib" "pkgs/racket-lib") ...)
needs less quoting over-all.

> +      (simple-racket-origin
> +       "class-iop" (base32
> "08z57q83cr7wnh6g8ah3hdhmsmf9zp1jfs7yvxv188l3hzvygy5l")
> +       "class-iop-lib")
While single strings like this do each cost three additional characters
that way, I wouldn't special-case them.


Cheers
diff mbox series

Patch

diff --git a/gnu/packages/patches/racket-gui-tethered-launcher-backport.patch b/gnu/packages/patches/racket-gui-tethered-launcher-backport.patch
index abf253486f..1e018eaa79 100644
--- a/gnu/packages/patches/racket-gui-tethered-launcher-backport.patch
+++ b/gnu/packages/patches/racket-gui-tethered-launcher-backport.patch
@@ -7,13 +7,13 @@  Related to racket/racket#4133
 
 (cherry picked from commit 563c68432f127729592f234ef30c31e92618b517)
 ---
- share/pkgs/gui-lib/mred/installer.rkt | 3 ++-
+ gui-lib/mred/installer.rkt | 3 ++-
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/gui-lib/mred/installer.rkt b/gui-lib/mred/installer.rkt
 index b1691472..9ef06c53 100644
---- a/share/pkgs/gui-lib/mred/installer.rkt
-+++ b/share/pkgs/gui-lib/mred/installer.rkt
+--- a/gui-lib/mred/installer.rkt
++++ b/gui-lib/mred/installer.rkt
 @@ -72,4 +72,5 @@
     (list "-A" (path->string (find-system-path 'addon-dir)))))
  
diff --git a/gnu/packages/racket.scm b/gnu/packages/racket.scm
index 00ec587eeb..c4e5ee1311 100644
--- a/gnu/packages/racket.scm
+++ b/gnu/packages/racket.scm
@@ -28,7 +28,9 @@  (define-module (gnu packages racket)
   #:use-module (guix gexp)
   #:use-module (guix build-system gnu)
   #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
   #:use-module (ice-9 match)
+  #:use-module (ice-9 exceptions)
   #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages bash)
@@ -389,172 +391,504 @@  (define-public racket-bootstrap-chez-bootfiles
 Chez Scheme.")
      (license (list license:asl2.0)))))
 
+(define (racket-packages-origin name origin spec0 . spec*)
+  "Extract from ORIGIN the sources for the Racket packages specified by SPEC0
+and any additional arguments SPEC*.  In the resulting file-like object, each
+package's source will be in the directory \"/share/racket/pkgs/PKG/\", where
+PKG is the Racket name for the package.  The NAME will be used in the store
+file name for the resulting file-like object.
 
-(define %installer-mirrors
-  ;; Source:
-  ;; https://github.com/racket/racket-lang-org/blob/master/download/data.rkt#L58
-  ;; Matthew Flatt says: "note that many are commented out"
-  ;; INVARIANT: End with a trailing "/"!
-  '("https://mirror.racket-lang.org/installers/"
-    "https://www.cs.utah.edu/plt/installers/"
-    "https://plt.cs.northwestern.edu/racket-mirror/"
-    "https://mirror.csclub.uwaterloo.ca/racket/racket-installers/"
-    ;; Universität Tübingen is using a self-signed HTTPS certificate:
-    "http://mirror.informatik.uni-tuebingen.de/mirror/racket/"
-    "https://racket.infogroep.be/"
-    ))
+A package specification is a list of the form:
 
-(define %main-repo-main-distribution-pkgs
-  ;; These are the packages developed in the main Racket Git repository
-  ;; that are part of the main distribution.
-  '("at-exp-lib"
-    "base"
-    "compiler-lib"
-    ;; NOT "compiler-test"
-    "compiler"
-    "net-doc"
-    "net-lib"
-    ;; NOT "net-test"
-    "net"
-    ;; NOT "plt-services"
-    ;; NOT "racket-benchmarks"
-    ;; NOT "racket-build-guide"
-    "racket-doc"
-    "racket-index"
-    "racket-lib"
-    ;; NOT "racket-test-core"
-    ;; NOT "racket-test-extra"
-    ;; NOT "racket-test"
-    "zo-lib"))
+  (PKG PATH)
 
+where PATH is the path to the package source relative to ORIGIN---possibly
+\".\".  As a special case, a package specification may also be a string, which
+is equivalent to:
+
+  (PKG PKG)
+
+Examples:
+
+- \"expeditor\"
+- (\"main-distribution\" \".\")
+- (\"racket-lib\" \"pkgs/racket-lib\")"
+  (computed-file
+   (string-append "racket-pkg-" name "-sources")
+   (with-imported-modules `((guix build utils))
+     #~(begin
+         (use-modules (guix build utils))
+         (mkdir-p (string-append #$output "/share/racket/pkgs"))
+         (chdir (string-append #$output "/share/racket/pkgs"))
+         #$@(map (match-lambda
+                   ((? string? name)
+                    #~(copy-recursively #$(file-append origin (string-append "/" name))
+                                        #$name))
+                   ((name ".")
+                    #~(copy-recursively #$origin #$name))
+                   ((name path)
+                    #~(copy-recursively #$(file-append origin (string-append "/" path))
+                                        #$name)))
+                 (cons spec0 spec*))))))
+
+(define (simple-racket-origin repo hash spec0 . spec*)
+  "Like 'racket-packages-origin', but specialized for packages hosted at
+\"https://github.com/racket/REPO\" with sha256 checksum HASH.  REPO is also
+used to build the name of the resulting store item."
+  (apply racket-packages-origin
+         repo
+         (origin
+           (method git-fetch)
+           (uri (git-reference
+                 (url (format #f "https://github.com/racket/~a" repo))
+                 (commit %racket-commit)))
+           (sha256 hash)
+           (file-name (git-file-name (string-append "racket-" repo)
+                                     %racket-version)))
+         spec0
+         spec*))
 
 (define-public racket
   (package
-    (inherit racket-minimal)
     (name "racket")
     (version %racket-version)
-    (source
-     (origin
-       (method url-fetch)
-       (uri (map (lambda (base)
-                   (string-append base version "/racket-src.tgz"))
-                 %installer-mirrors))
-       (sha256
-        (base32
-         "0dsv7br85nvh5gjfihznq9jb1dzas0f6gnv5qwc9zmb7yn75nrp5"))
-       (patches
-        ;; remove in Racket 8.5
-        ;; see https://github.com/racket/racket/issues/4133
-        (search-patches "racket-gui-tethered-launcher-backport.patch"))
-       (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
-            (with-directory-excursion "share/pkgs"
-              (for-each delete-file-recursively
-                        '#+%main-repo-main-distribution-pkgs))
-            ;; Minimal workaround for FSDG issue:
-            ;; see <https://github.com/racket/srfi/pull/15>.
-            ;; We will backport a better fix once we use Git
-            ;; origins for Racket packages.
-            (delete-file-recursively "share/pkgs/srfi-doc-nonfree")
-            (substitute* "share/pkgs/srfi/info.rkt"
-              (("\"srfi-doc-nonfree\"")
-               ""))))))
+    (source #f)
     (inputs
-     `(("cairo" ,cairo)
-       ("fontconfig" ,fontconfig)
-       ("glib" ,glib)
-       ("glu" ,glu)
-       ("gmp" ,gmp)
-       ("gtk+" ,gtk+)                   ; propagates gdk-pixbuf+svg
-       ("libjpeg" ,libjpeg-turbo)
-       ("libpng" ,libpng)
-       ("libx11" ,libx11)
-       ("mesa" ,mesa)
-       ("mpfr" ,mpfr)
-       ("pango" ,pango)
-       ("unixodbc" ,unixodbc)
-       ("libedit" ,libedit)))
-    (native-inputs
-     `(("racket" ,racket-minimal)
-       ("extend-layer" ,extend-layer)
-       ("main-repo" ,%racket-origin)))
+     (list
+      cairo
+      fontconfig
+      glib
+      glu
+      gmp
+      gtk+ ;; propagates gdk-pixbuf+svg
+      libjpeg-turbo
+      libpng
+      libx11 ;; ?? wayland ??
+      mesa
+      mpfr
+      pango
+      unixodbc
+      libedit ;; TODO reconsider in light of expeditor and readline-gpl
+      racket-minimal ;; <-- TODO non-tethered layer
+      (simple-racket-origin
+       "2d" (base32 "1zzcz5qyjv7syi41vb8jkxjp1rqgj61zbsdrg0nlc4qy9qsafzgr")
+       "2d" "2d-doc" "2d-lib")
+      (simple-racket-origin
+       "algol60" (base32 "09kj6asypmc24n29w0izc9p0q8hpga2hpkchsypfwn5c8zpvihlx")
+       '("algol60" "."))
+      (racket-packages-origin
+       "racket" %racket-origin
+       '("base" "pkgs/base") ;; FIXME belongs in racket-minimal
+       '("racket-lib" "pkgs/racket-lib") ;; FIXME belongs in racket-minimal
+       '("at-exp-lib" "pkgs/at-exp-lib")
+       '("compiler" "pkgs/compiler")
+       '("compiler-lib" "pkgs/compiler-lib")
+       '("net" "pkgs/net")
+       '("net-doc" "pkgs/net-doc")
+       '("net-lib" "pkgs/net-lib")
+       '("racket-doc" "pkgs/racket-doc")
+       '("racket-index" "pkgs/racket-index")
+       '("sandbox-lib" "pkgs/sandbox-lib")
+       '("zo-lib" "pkgs/zo-lib"))
+      (simple-racket-origin
+       "cext-lib" (base32 "00w38jpv88fpl4pgj6ndnysvn0s21rjvj0xhznay80msan0vc341")
+       "cext-lib" "dynext-lib")
+      (simple-racket-origin
+       "class-iop" (base32 "08z57q83cr7wnh6g8ah3hdhmsmf9zp1jfs7yvxv188l3hzvygy5l")
+       "class-iop-lib")
+      (simple-racket-origin
+       "compatibility" (base32 "0bfqwscjpyi325br5pa6g62g9c8lq18a80zp5g3d2qzn3n3mi6x0")
+       "compatibility" "compatibility-doc" "compatibility-lib")
+      (simple-racket-origin
+       "contract-profile" (base32 "1xm2z8g0dpv5d9h2sg680vx1a8ix9gbsdpxxb8qv1w7akp73paj3")
+       '("contract-profile" "."))
+      (simple-racket-origin
+       "data" (base32 "10iabgrk9alaggvksnyb0hdq7f1p30pq6pq2bcakvhzpxwiv1f55")
+       "data" "data-doc" "data-enumerate-lib" "data-lib")
+      (simple-racket-origin
+       "datalog" (base32 "0n5j5gnqh7g31mvgx19ggl18hirzbvq2r189lbngmnrmbc7b73fp")
+       '("datalog" "."))
+      (simple-racket-origin
+       "db" (base32 "1n02ja0yj3mjjhmz0yv04yfhyvrsznbljn8bjviyfxnm4xf9rcc5")
+       "db" "db-doc" "db-lib")
+      (simple-racket-origin
+       "deinprogramm" (base32 "1is6fapgv6rxfjz47nh6qf3kh7y7sjdinakaxqffi46gf1al8prd")
+       "deinprogramm" "deinprogramm-signature")
+      (simple-racket-origin
+       "distributed-places" (base32 "1dajpkj9balqcpv6cdk9hwjz592h1vq8rrx5vncariiac4vbdpa0")
+       "distributed-places" "distributed-places-doc" "distributed-places-lib")
+      (simple-racket-origin
+       "draw" (base32 "1xgjfbh70hqw67z88iqqajg98d04qwbzn6im2wj47rs28jxlm9ly")
+       "draw" "draw-doc" "draw-lib")
+      (simple-racket-origin
+       "drracket" (base32 "0m3l4an3nq2ycd1h287s1az2v2zprjbzd8if2x7d5r71vaj4i00c")
+       "drracket"
+       "drracket-plugin-lib"
+       "drracket-tool"
+       "drracket-tool-doc"
+       "drracket-tool-lib"
+       "drracket-tool-text-lib")
+      (simple-racket-origin
+       "ds-store" (base32 "0ajr27kipp4dr1qlisaghsb3h7lhhjwrfw2r79b5myczsa1mp661")
+       "ds-store" "ds-store-doc" "ds-store-lib")
+      (simple-racket-origin
+       "eli-tester" (base32 "0icx6wn14gjm8kdmq1jppqgq87sxkras4qb5xmdr6wigxafhjqyk")
+       '("eli-tester"  "."))
+      (simple-racket-origin
+       "eopl" (base32 "1fmiixj6rxsgzwvgva8lvrvv0gl49v2405mp3s0i7ipis5c4n27s")
+       '("eopl" "."))
+      (simple-racket-origin
+       "errortrace" (base32 "14m7rhaxngj36070iw15am434hm438pfgmwjfsiqhsglz4pcxhip")
+       "errortrace" "errortrace-doc" "errortrace-lib")
+      (simple-racket-origin
+       "expeditor" (base32 "07djzxs6307l51mcsk3yr2g4g47ayxa3878g7sf5xhqdr4hd9vxf")
+       "expeditor" "expeditor-doc" "expeditor-lib")
+      (simple-racket-origin
+       "frtime" (base32 "0ydz2yn8vvv6z7brwlswcyx0f31a6y6d443i89rysfvd2xkhpfd5")
+       '("frtime" "."))
+      (simple-racket-origin
+       "future-visualizer" (base32 "1758qq769m0r14xf64sl2ix2l9z340kvapar0j7s5kdg42lmvnhm")
+       "future-visualizer"
+       "future-visualizer-pict"
+       "future-visualizer-typed")
+      (simple-racket-origin
+       "games" (base32 "0kpn3izlx1ccd0pj0dnvmnrhny51b85xy418a7psj70lz8j8415d")
+       '("games" "."))
+      (racket-packages-origin
+       "gui" (origin
+               (method git-fetch)
+               (uri (git-reference
+                     (url "https://github.com/racket/gui")
+                     (commit %racket-commit)))
+               (sha256 (base32
+                        "1x33jgrx3r32k7hgwr591z3xqv1m2r5nc4km2fnxv0ak2xa0j3gj"))
+               (patches
+                ;; remove in Racket 8.5
+                ;; see https://github.com/racket/racket/issues/4133
+                (search-patches "racket-gui-tethered-launcher-backport.patch"))
+               (file-name (git-file-name "racket-gui" %racket-version)))
+       "gui" "gui-doc" "gui-lib" "tex-table")
+      (simple-racket-origin
+       "gui-pkg-manager" (base32 "1ji9448d723nklqvycwdswj0ni28sabrncag14f9mx47did5myb5")
+       "gui-pkg-manager-lib")
+      (simple-racket-origin
+       "htdp" (base32 "0r4ykybcpr10y2db9rlza9pr0xh58nd7ac389mjcxp8g386hgihl")
+       "htdp" "htdp-doc" "htdp-lib")
+      (simple-racket-origin
+       "html" (base32 "18n1jnjgzfknc8nv8dppi85nb8q08gqdwkg6hfjk08x0p00anx2x")
+       "html" "html-doc" "html-lib")
+      (simple-racket-origin
+       "icons" (base32 "1s5a6j11fg3fdr6b7vm2q7q178d7q8b8igy73bs211r27qrd1gg7")
+       '("icons" "."))
+      (simple-racket-origin
+       "images" (base32 "0rpjxqw34bq5m08kh1ldl1mr7s9z1lyydxxcyzb292kqh9qiqvfl")
+       "images" "images-doc" "images-gui-lib" "images-lib")
+      (simple-racket-origin
+       "lazy" (base32 "176ylzgbdsbmqknpihaz519afq71pyjkv1h87j5v8jfbpbddyfsf")
+       '("lazy" "."))
+      (simple-racket-origin
+       "macro-debugger" (base32 "14hyrwbkffr61fk44l02xb47bhv5zccw0ymaa9kxld86hvyqhqbm")
+       "macro-debugger" "macro-debugger-text-lib")
+      (simple-racket-origin
+       "main-distribution" (base32 "0m2n9s32s8a4a2gn4ywrm9l8jycdm5ayi5w9kh5wchhrrw7qzq7y")
+       '("main-distribution" "."))
+      (simple-racket-origin
+       "make" (base32 "10852fj30bz5r46c3d99s37fkgy5yh44gb01j29sf3kxnhi0g2sa")
+       '("make" "."))
+      (simple-racket-origin
+       "math" (base32 "02sqbnvxvmvslk33b44fx4v93zafcvhva0cx8z21jqbl5wp217ac")
+       "math" "math-doc" "math-lib")
+      (simple-racket-origin
+       "mysterx" (base32 "11p9jzrafw0hizhl0cs4sxx7rv281185q8hryic2rpk0kzjdyr48")
+       '("mysterx" "."))
+      (simple-racket-origin
+       "mzcom" (base32 "0rc9pfj7gwm5azghqvcibz6si1x5s2v8mr2yngk7ssq9gzfbi6a4")
+       '("mzcom" "."))
+      (simple-racket-origin
+       "mzscheme" (base32 "192c52zi726h5wjamxrhivjw2waq1im0zpyxhbrkrxknm8x84bs9")
+       "mzscheme" "mzscheme-doc" "mzscheme-lib")
+      (racket-packages-origin
+       "net-cookies" (origin
+                       (method git-fetch)
+                       (uri (git-reference
+                             (url "https://github.com/RenaissanceBug/racket-cookies")
+                             (commit %racket-commit)))
+                       (sha256 (base32
+                                "0k0hifxhywl5c3hjcaiizc098dpyk001d981p572gly116yvjxc1"))
+                       (file-name
+                        (git-file-name "RenaissanceBug-racket-cookies" %racket-version)))
+       "net-cookies" "net-cookies-doc" "net-cookies-lib")
+      (racket-packages-origin
+       "optimization-coach"
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/stamourv/optimization-coach")
+               (commit %racket-commit)))
+         (sha256 (base32
+                  "0b27sw48d7rhz0hin88c7rbr9vpg1c23sn82nd4jkmq54h6gasr1"))
+         (file-name
+          (git-file-name "stamourv-optimization-coach" %racket-version)))
+       '("optimization-coach" "."))
+      (simple-racket-origin
+       "option-contract" (base32 "026b7n5l0c3024nymshz8zp1yhn493rdzgpflzfd52hj7awafqhk")
+       "option-contract" "option-contract-doc" "option-contract-lib")
+      (simple-racket-origin
+       "parser-tools" (base32 "08pvz4zramirzm3j64hbhjm0mmh5zfy37iv4s3vmq0rj49cr8fl3")
+       "parser-tools" "parser-tools-doc" "parser-tools-lib")
+      (simple-racket-origin
+       "pconvert" (base32 "00czi0p399mmyrvxyrs5kniizpkqfxyz2ncxqi2jy79a7wk79pb1")
+       "pconvert-lib")
+      (simple-racket-origin
+       "pict" (base32 "0g1iwdr6qh1xb0crhj96830vjjnbds409xbpqn7j5sh0ksy6vr5x")
+       "pict" "pict-doc" "pict-lib")
+      (simple-racket-origin
+       "pict-snip" (base32 "081nwiy4a0n4f7xws16hqbhf0j3kz5alizndi3nnyr3chm4kng6x")
+       "pict-snip" "pict-snip-doc" "pict-snip-lib")
+      (simple-racket-origin
+       "picturing-programs" (base32 "1g6xr39hx1j03gb3d4dljm3v91xcj2gfpq3dgy5xvplzr6cmmxgr")
+       '("picturing-programs" "."))
+      (simple-racket-origin
+       "plai" (base32 "0i983sh0r0zm2ng4j44m5aw9669kh5fhp91bzpc9jm280rfcqvyl")
+       "plai" "plai-doc" "plai-lib")
+      (simple-racket-origin
+       "planet" (base32 "0r2yqrzrmdjjyr14k6hhlzc5kzrcx3583m1s02mhrcmpfw0s85w9")
+       "planet" "planet-doc" "planet-lib")
+      (simple-racket-origin
+       "plot" (base32 "07kq32si34ybcwz8idxxcrzssg8diyrp1nfgkcj0mmvr45321zm7")
+       "plot" "plot-compat" "plot-doc" "plot-gui-lib" "plot-lib")
+      (simple-racket-origin
+       "preprocessor" (base32 "1p5aid58ifnjy4xl0ysh85cq39k25661v975jrpk182z3k5621mg")
+       '("preprocessor" "."))
+      (simple-racket-origin
+       "profile" (base32 "179i86lyby29nywz60l4vnadi02w8b12h7501nm5h5g4pq9jjmbb")
+       "profile" "profile-doc" "profile-lib")
+      (racket-packages-origin
+       "quickscript" (origin
+                       (method git-fetch)
+                       (uri (git-reference
+                             (url "https://github.com/Metaxal/quickscript")
+                             (commit %racket-commit)))
+                       (sha256 (base32
+                                "100g3yqhbjdq06b6l6d72ywsw29awgy8crqg33wj7h12xq07nzcr"))
+                       (file-name (git-file-name "Metaxal-quickscript" %racket-version)))
+       '("quickscript" "."))
+      (simple-racket-origin
+       "r5rs" (base32 "1g3cysj7z88r38vkzvi8g2fb2hn4yg1fdhy5smxw303jxgl3inp6")
+       "r5rs" "r5rs-doc" "r5rs-lib")
+      (simple-racket-origin
+       "r6rs" (base32 "0b1ymzdp10r0flw2acbidjsh5ma1pm5hy54jss37sxf89z3xbvm4")
+       "r6rs" "r6rs-doc" "r6rs-lib")
+      (racket-packages-origin
+       "racket-cheat" (origin
+                        (method git-fetch)
+                        (uri (git-reference
+                              (url "https://github.com/jeapostrophe/racket-cheat")
+                              (commit %racket-commit)))
+                        (sha256 (base32
+                                 "06wcj558rzkbl2bwkmikyspya9v1f4iwlzwnwxpkc33h2xapwabr"))
+                        (file-name
+                         (git-file-name "jeapostrophe-racket-cheat" %racket-version)))
+       '("racket-cheat" "."))
+      (simple-racket-origin
+       "racklog" (base32 "1rgrvwy3kr9b9w5cghsffiv3ly00yfvvzr5xaaw83g1w7yin0mnb")
+       '("racklog" "."))
+      (simple-racket-origin
+       "rackunit" (base32 "057z31rja6h3nabh5b2xgwfrzmlm6h1cv1qcgf3xfy4g2q5dqn5p")
+       "rackunit"
+       "rackunit-doc"
+       "rackunit-gui"
+       "rackunit-lib"
+       "rackunit-plugin-lib"
+       "rackunit-typed"
+       "schemeunit"
+       "testing-util-lib")
+      (simple-racket-origin
+       "readline" (base32 "13kbcn2wchv82d709mw3r8n37bk8iwq0y4kpvm9dbzx0w2pxkfwn")
+       "readline" "readline-doc" "readline-lib")
+      (simple-racket-origin
+       "realm" (base32 "0hxcgla08iack54j8v40fj51811chpy66ym2zq76zb52c7kzn0hi")
+       '("realm" "."))
+      (simple-racket-origin
+       "redex" (base32 "0vlgxbnbgrlihk1hh5zd6hsc4566ldi4q76f87z5vai54dxkwy2f")
+       "redex"
+       "redex-benchmark"
+       "redex-doc"
+       "redex-examples"
+       "redex-gui-lib"
+       "redex-lib"
+       "redex-pict-lib")
+      (simple-racket-origin
+       "sasl" (base32 "0ibh4wb4gn8pggx6gkv4vk4d6rwzn5nrvjibhvkzhaynf6lhb824")
+       "sasl" "sasl-doc" "sasl-lib")
+      (simple-racket-origin
+       "scheme-lib" (base32 "0pcf0y8rp4qyjhaz5ww5sr5diq0wpcdfrrnask7zapyklzx1jx8x")
+       '("scheme-lib" "."))
+      (simple-racket-origin
+       "scribble" (base32 "0rgvnsykrxkah6s5fw1vyp9lxsb4z9w6hgwk5j6wbwjp2gsfczbm")
+       "scribble"
+       "scribble-doc"
+       "scribble-html-lib"
+       "scribble-lib"
+       "scribble-text-lib")
+      (simple-racket-origin
+       "serialize-cstruct-lib"
+       (base32 "1rq3n1fa7ldjwx3lrh9ybhig7jlsw1crpzyklbzp3xqdw6jymfnz")
+       '("serialize-cstruct-lib" "."))
+      (simple-racket-origin
+       "sgl" (base32 "0nkymhdyjrwi5h199j4w5zh7y3x3ai42gsiwxzh0hy7yqrqqg9zv")
+       '("sgl" "."))
+      (simple-racket-origin
+       "shell-completion" (base32 "04m144gy2mp4fiq6rcbf12wjr8mws8k9scfhg9lc38vqppp4lxsj")
+       '("shell-completion" "."))
+      (simple-racket-origin
+       "simple-tree-text-markup"
+       (base32 "0fyd9gfz6bnv0m1901wv5mnhc05rm8hw9i6ddrqx33hs6qsg2zqr")
+       "simple-tree-text-markup"
+       "simple-tree-text-markup-doc"
+       "simple-tree-text-markup-lib")
+      (simple-racket-origin
+       "slatex" (base32 "0pkm2isbbdk63slrbsxcql7rr0wdrw5kapw1xq4ps5k8dhlzv8x0")
+       '("slatex" "."))
+      (simple-racket-origin
+       "slideshow" (base32 "1znv1i2d0610hhy71q932xy7wka00q3q50in1xfnk8ibg7nzkagm")
+       "slideshow" "slideshow-doc" "slideshow-exe" "slideshow-lib" "slideshow-plugin")
+      (simple-racket-origin
+       "snip" (base32 "01r9wc5xr3q3n4yyif6j0a37rgdzmpslxn05k13ksik73b3wj6hj")
+       "snip" "snip-lib")
+      (simple-racket-origin
+       "typed-racket" (base32 "1462kj9yswsxbnw71casylzlvhd7cxrml2v9j7rcsnn9hmrqx4vv")
+       "source-syntax"
+       "typed-racket"
+       "typed-racket-compatibility"
+       "typed-racket-doc"
+       "typed-racket-lib"
+       "typed-racket-more")
+      (racket-packages-origin
+       "srfi" (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/racket/srfi")
+                      ;; Includes an FSDG fix: return to %racket-commit in 8.5.
+                      ;; See <https://github.com/racket/srfi/pull/15>.
+                      (commit "7243029b135741ce08ae30f877e2f49a2a460b22")))
+                (sha256 (base32
+                         "0aqbcdv2dfc2xnk0h6zfi56p7bpwqji8s88qds3d03hhh9k28gvn"))
+                ;; Use the relevant version for srfi-doc and srfi-lib,
+                ;; since we're using a newer commit than the v8.4 tag.
+                (file-name (git-file-name "racket-srfi" "1.1")))
+       "srfi" "srfi-doc" "srfi-lib" "srfi-lite-lib")
+      (simple-racket-origin
+       "string-constants" (base32 "1qizjq4n0hzdgdcjjpr94464gsywpsk2g9mnvwzqr7dcqbrsfvn6")
+       "string-constants" "string-constants-doc" "string-constants-lib")
+      (simple-racket-origin
+       "swindle" (base32 "164gdsphjzdl2vv7zxz7dfk9jwax8njpmim6sidm8qz8a8589y67")
+       '("swindle" "."))
+      (simple-racket-origin
+       "syntax-color" (base32 "1vf2fc3qvx8a1igi7swsg8gaqhx786sa0vqxd18xhbsidfgb5ywp")
+       "syntax-color" "syntax-color-doc" "syntax-color-lib")
+      (simple-racket-origin
+       "trace" (base32 "070ihla5j796hdarn5wxdwn4xj0xnkm50shgh49jy994mribvhia")
+       '("trace" "."))
+      (simple-racket-origin
+       "unix-socket" (base32 "02dfwas5ynbpyz74w9kwb4wgb37y5wys7svrlmir8k0n9ph9vq0y")
+       "unix-socket" "unix-socket-doc" "unix-socket-lib")
+      (simple-racket-origin
+       "web-server" (base32 "1zgb6jl7zx6258ljs8f3lvryrq5n5zpd71dqzr698m92kw3x2pkn")
+       "web-server" "web-server-doc" "web-server-lib")
+      (simple-racket-origin
+       "wxme" (base32 "1qp5gr9gqsakiq3alw6m4yyv5vw4i3hp4y4nhq8vl2nkjmirvn0b")
+       "wxme" "wxme-lib")
+      (simple-racket-origin
+       "xrepl" (base32 "12zjgsy5zqm3fck3ihg4a70wj56s2cnnjyb4jlfi5nnsfqyrnxg3")
+       "xrepl" "xrepl-doc" "xrepl-lib")))
+    (build-system gnu-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         (add-before 'configure 'unpack-packages
-           (let ((unpack (assoc-ref %standard-phases 'unpack)))
-             (lambda* (#:key  native-inputs inputs outputs #:allow-other-keys)
-               (let* ((racket (assoc-ref (or native-inputs inputs) "racket"))
-                      (prefix (assoc-ref outputs "out"))
-                      (pkgs-dir (string-append prefix "/share/racket/pkgs")))
-                 (mkdir-p pkgs-dir)
-                 (copy-recursively
-                  "share/links.rktd"
-                  (string-append prefix "/share/racket/links.rktd"))
-                 (copy-recursively "share/pkgs" pkgs-dir)
-                 ;; NOTE: unpack changes the working directory
-                 (unpack #:source (assoc-ref (or native-inputs inputs)
-                                             "main-repo"))
-                 (for-each (lambda (pkg)
-                             (define dest (string-append pkgs-dir "/" pkg))
-                             (mkdir-p dest)
-                             (copy-recursively (string-append "pkgs/" pkg)
-                                               dest))
-                           ',%main-repo-main-distribution-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))
+     ;; We're using #:configure-flags to pass flags for
+     ;; `configure-layer.rkt` and #:make-flags to pass arguments for
+     ;; `raco pkg install`.
+     (list
+      #:configure-flags
+      #~`("--extra-foreign-lib-search-dirs"
+          ,(format #f "~s"
+                   '(#$@(map (lambda (name)
+                               (cond
+                                ((this-package-input name)
+                                 => (cut file-append <> "/lib"))
+                                (else
+                                 (raise-exception
+                                  (make-exception
+                                   (make-assertion-failure)
+                                   (make-exception-with-message
+                                    "missing input to the 'racket' package")
+                                   (make-exception-with-irritants
+                                    (list name)))))))
+                             '("cairo"
+                               "fontconfig-minimal" ;; aka fontconfig
+                               "glib"
+                               "glu"
+                               "gmp"
+                               "gtk+"
+                               "libjpeg-turbo"
+                               "libpng"
+                               "libx11"
+                               "mesa"
+                               "mpfr"
+                               "pango"
+                               "unixodbc"
+                               "libedit")))))
+      #:make-flags #~`("main-distribution")
+      #:tests? #f ;; packaged separately
+      #:modules '((guix build gnu-build-system)
+                  (guix build utils)
+                  (guix build union)
+                  (ice-9 match))
+      #:imported-modules `((guix build union)
+                           ,@%gnu-build-system-modules)
+      #:phases
+      #~(modify-phases %standard-phases
+          (delete 'unpack)
+          (replace 'configure
+            (lambda* (#:key inputs configure-flags #:allow-other-keys)
+              (let* ((racket (search-input-file inputs "bin/racket")))
+                (apply invoke
+                       racket
+                       #$configure-layer.rkt
+                       `(,@configure-flags
+                         ,(dirname (dirname racket))
+                         ,#$output))
+                (invoke racket
+                        "--config" (string-append #$output "/etc/racket")
+                        "-l" "raco" "setup"
+                        "--no-user"))))
+          (replace 'build
+            (lambda* (#:key inputs #:allow-other-keys)
+              ;; We use "share/racket/pkgs" for sources to distinguish them
+              ;; from the "lib/racket/pkgs" of a potential parent layer.
+              (union-build (string-append #$output "/lib/racket/pkgs")
+                           (search-path-as-list '("share/racket/pkgs")
+                                                (map cdr inputs))
+                           #:create-all-directories? #t)))
+          (replace 'install
+            (lambda* (#:key inputs make-flags #:allow-other-keys)
+              (let ((racket (search-input-file inputs "/bin/racket")))
+                (unless (null? make-flags)
+                  (invoke racket
+                          "-l-"
+                          "pkg/dirs-catalog"
+                          "--link"
+                          "local-catalog"
+                          (string-append #$output "/lib/racket/pkgs"))
+                  (apply invoke
+                         racket
+                         "--config" (string-append #$output "/etc/racket")
+                         "-l" "raco"
+                         "pkg" "install"
+                         "--installation"
+                         "--auto"
+                         "--catalog" "local-catalog"
+                         make-flags))))))))
+    (home-page "https://racket-lang.org")
     (synopsis "Programmable programming language in the Scheme family")
     (description
      "Racket is a general-purpose programming language in the Scheme family,
@@ -564,17 +898,20 @@  (define dest (string-append pkgs-dir "/" pkg))
 
 The main Racket distribution comes with many bundled packages, including the
 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.")
+    ;; https://download.racket-lang.org/license.html
+    ;; The LGPL components are only used by Racket BC.
+    (license (list license:asl2.0 license:expat))))
 
-(define extend-layer
+(define configure-layer.rkt
   (scheme-file
-   "extend-layer.rkt"
+   "configure-layer.rkt"
    `(module
-     extend-layer racket/base
+     configure-layer racket/base
      (require racket/cmdline
               racket/match
               racket/file
+              racket/port
               racket/list
               racket/pretty)
      (define config-file-pth
@@ -584,8 +921,14 @@  (define (build-path-string . args)
      (define rx:racket
        ;; Guile's reader doesn't support #rx"racket"
        (regexp "racket"))
+     (define extra-foreign-lib-search-dirs '())
      (command-line
-      #:args (parent-layer prefix . lib-dir*)
+      #:once-each
+      [("--extra-foreign-lib-search-dirs") dir-list
+       "foreign library directories, as a list of strings in `read` syntax"
+       (set! extra-foreign-lib-search-dirs
+             (call-with-input-string dir-list read))]
+      #:args (parent-layer prefix)
       (let* ([config
               (for/fold
                ([config (file->value (build-path parent-layer
@@ -615,27 +958,42 @@  (define rx:racket
                                  (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"))]
+              (hash-update config
+                           'lib-search-dirs
+                           (lambda (dirs)
+                             ;; add after other layers, but before older
+                             ;; foreign lib search directories
+                             (define-values [rkt old-foreign-dirs]
+                               (partition (lambda (pth)
+                                            (or (not pth)
+                                                (regexp-match? rx:racket pth)))
+                                          dirs))
+                             (append rkt
+                                     extra-foreign-lib-search-dirs
+                                     old-foreign-dirs)))]
              [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)))]
+              (hash-set* config
+                         'apps-dir
+                         (build-path-string prefix "share/applications")
+                         'absolute-installation? #t
+                         ;; Let Guix coexist with other installation
+                         ;; methods without clobbering user-specific packages.
+                         ;; This could be set in various places, but doing
+                         ;; it here is convienient, at least until we support
+                         ;; cross-compilation.
+                         'installation-name
+                         (string-append (version)
+                                        "-guix"
+                                        (match (system-type 'gc)
+                                          ['cgc "-cgc"]
+                                          ;; workaround Guile reader/printer:
+                                          ['|3m| "-bc"]
+                                          [_ ""])))]
              [bin-dir
               (hash-ref config 'bin-dir)]
              [config
               (hash-set* config
+                         'config-tethered-apps-dir (hash-ref config 'apps-dir)
                          'config-tethered-console-bin-dir bin-dir
                          'config-tethered-gui-bin-dir bin-dir)]
              [new-config-pth