Subject: [PATCH] guix: Restore profile hook for TeX Live font maps.

From: Ricardo Wurmus <[email-masked]>
Date: Fri, 28 Jan 2022 19:18:01 +0100

* gnu/packages/tex.scm (texlive-default-updmap.cfg): New variable.
* guix/profiles.scm (texlive-configuration): Rename this...
(texlive-font-maps): ...to this; update to run updmap-sys on the contents of
the profile to generate only font maps.
(%default-profile-hooks): Add texlive-font-maps.
* guix/status.scm (hook-message): Rename unused texlive-configuration to
texlive-font-maps.
---
 gnu/packages/tex.scm | 12 ++++++
 guix/profiles.scm    | 99 +++++++++++++++++++-------------------------
 guix/status.scm      |  4 +-
 3 files changed, 56 insertions(+), 59 deletions(-)

diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index 89f60f89d5..72437ce2f6 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -4314,6 +4314,18 @@ (define-public texlive-base
                      '()
                      default-packages)))))
 
+(define-public texlive-default-updmap.cfg
+  (origin
+    (method url-fetch)
+    (uri (string-append "https://tug.org/svn/texlive/tags/"
+                        %texlive-tag "/Master/texmf-dist/web2c/updmap.cfg"
+                        "?revision=" (number->string %texlive-revision)))
+    (file-name (string-append "updmap.cfg-"
+                              (number->string %texlive-revision)))
+    (sha256
+     (base32
+      "0zhpyld702im6352fwp41f2hgfkpj2b4j1kfsjqbkijlcmvb6w2c"))))
+
 ;;; TODO: Add a TeX Live profile hook computing fonts maps (and others?)
 ;;; configuration from the packages in the profile, similar to what's done
 ;;; below.
diff --git a/guix/profiles.scm b/guix/profiles.scm
index 1d354ecb78..403dbc18ed 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -1738,8 +1738,8 @@ (define (manual-database/optional manifest)
         (manual-database manifest)
         (return #f))))
 
-(define (texlive-configuration manifest)
-  "Return a derivation that builds a TeXlive configuration for the entries in
+(define (texlive-font-maps manifest)
+  "Return a derivation that builds the TeX Live font maps for the entries in
 MANIFEST."
   (define entry->texlive-input
     (match-lambda
@@ -1768,72 +1768,56 @@ (define build
           ;; Build a modifiable union of all texlive inputs.  We do this so
           ;; that TeX live can resolve the parent and grandparent directories
           ;; correctly.  There might be a more elegant way to accomplish this.
-          (union-build #$output
+          (union-build "/tmp/texlive"
                        '#$(append-map entry->texlive-input
                                       (manifest-entries manifest))
                        #:create-all-directories? #t
                        #:log-port (%make-void-port "w"))
-          (let ((texmf.cnf (string-append
-                            #$output
-                            "/share/texmf-dist/web2c/texmf.cnf")))
-            (when (file-exists? texmf.cnf)
-              (substitute* texmf.cnf
-                (("^TEXMFROOT = .*")
-                 (string-append "TEXMFROOT = " #$output "/share\n"))
-                (("^TEXMF = .*")
-                 "TEXMF = $TEXMFROOT/share/texmf-dist\n"))
-
-              ;; XXX: This is annoying, but it's necessary because texlive-bin
-              ;; does not provide wrapped executables.
-              (setenv "PATH"
-                      (string-append #$(file-append coreutils "/bin")
-                                     ":"
-                                     #$(file-append sed "/bin")))
-              (setenv "PERL5LIB" #$(file-append texlive-bin "/share/tlpkg"))
-              (setenv "TEXMF" (string-append #$output "/share/texmf-dist"))
-
-              ;; Remove invalid maps from config file.
-              (let* ((web2c (string-append #$output "/share/texmf-config/web2c/"))
-                     (maproot (string-append #$output "/share/texmf-dist/fonts/map/"))
-                     (updmap.cfg (string-append web2c "updmap.cfg")))
-                (mkdir-p web2c)
-
-                ;; Some profiles may already have this file, which prevents us
-                ;; from copying it.  Since we need to generate it from scratch
-                ;; anyway, we delete it here.
-                (when (file-exists? updmap.cfg)
-                  (delete-file updmap.cfg))
-                (copy-file #$updmap.cfg updmap.cfg)
-                (make-file-writable updmap.cfg)
-                (let* ((port (open-pipe* OPEN_WRITE
-                                         #$(file-append texlive-bin "/bin/updmap-sys")
-                                         "--syncwithtrees"
-                                         "--nohash"
-                                         "--force"
-                                         (string-append "--cnffile=" web2c "updmap.cfg"))))
-                  (display "Y\n" port)
-                  (when (not (zero? (status:exit-val (close-pipe port))))
-                    (error "failed to filter updmap.cfg")))
-
-                ;; Generate font maps.
-                (invoke #$(file-append texlive-bin "/bin/updmap-sys")
-                        (string-append "--cnffile=" web2c "updmap.cfg")
-                        (string-append "--dvipdfmxoutputdir="
-                                       maproot "updmap/dvipdfmx/")
-                        (string-append "--dvipsoutputdir="
-                                       maproot "updmap/dvips/")
-                        (string-append "--pdftexoutputdir="
-                                       maproot "updmap/pdftex/")))))
-          #t)))
+
+          ;; XXX: This is annoying, but it's necessary because texlive-bin
+          ;; does not provide wrapped executables.
+          (setenv "PATH"
+                  (string-append #$(file-append coreutils "/bin")
+                                 ":"
+                                 #$(file-append sed "/bin")))
+          (setenv "PERL5LIB" #$(file-append texlive-bin "/share/tlpkg"))
+          (setenv "GUIX_TEXMF" "/tmp/texlive/share/texmf-dist")
+
+          ;; Remove invalid maps from config file.
+          (let* ((web2c (string-append #$output "/share/texmf-dist/web2c/"))
+                 (maproot (string-append #$output "/share/texmf-dist/fonts/map/"))
+                 (updmap.cfg (string-append web2c "updmap.cfg")))
+            (mkdir-p web2c)
+            (copy-file #$updmap.cfg updmap.cfg)
+            (make-file-writable updmap.cfg)
+            (let* ((port (open-pipe* OPEN_WRITE
+                                     #$(file-append texlive-bin "/bin/updmap-sys")
+                                     "--syncwithtrees"
+                                     "--nohash"
+                                     "--force"
+                                     (string-append "--cnffile=" updmap.cfg))))
+              (display "Y\n" port)
+              (when (not (zero? (status:exit-val (close-pipe port))))
+                (error "failed to filter updmap.cfg")))
+
+            ;; Generate font maps.
+            (invoke #$(file-append texlive-bin "/bin/updmap-sys")
+                    (string-append "--cnffile=" updmap.cfg)
+                    (string-append "--dvipdfmxoutputdir="
+                                   maproot "dvipdfmx/updmap")
+                    (string-append "--dvipsoutputdir="
+                                   maproot "dvips/updmap")
+                    (string-append "--pdftexoutputdir="
+                                   maproot "pdftex/updmap"))))))
 
   (mlet %store-monad ((texlive-base (manifest-lookup-package manifest "texlive-base")))
     (if texlive-base
-        (gexp->derivation "texlive-configuration" build
+        (gexp->derivation "texlive-font-maps" build
                           #:substitutable? #f
                           #:local-build? #t
                           #:properties
                           `((type . profile-hook)
-                            (hook . texlive-configuration)))
+                            (hook . texlive-font-maps)))
         (return #f))))
 
 (define %default-profile-hooks
@@ -1849,6 +1833,7 @@ (define %default-profile-hooks
         glib-schemas
         gtk-icon-themes
         gtk-im-modules
+        texlive-font-maps
         xdg-desktop-database
         xdg-mime-database))
 
diff --git a/guix/status.scm b/guix/status.scm
index eefe18365f..fba28765df 100644
--- a/guix/status.scm
+++ b/guix/status.scm
@@ -395,8 +395,8 @@ (define (hook-message hook-type)
      (G_ "building XDG MIME database..."))
     ('fonts-dir
      (G_ "building fonts directory..."))
-    ('texlive-configuration
-     (G_ "building TeX Live configuration..."))
+    ('texlive-font-maps
+     (G_ "building TeX Live font maps..."))
     ('manual-database
      (G_ "building database for manual pages..."))
     ('package-cache                    ;package cache generated by 'guix pull'
-- 
2.34.0