Subject: [PATCH v2] gnu: texlive-libkpathsea: Add definitions for XDG paths.

From: Liliana Marie Prikler <[email-masked]>
Date: Wed, 14 May 2025 13:46:01 +0200

Without these paths set, if they are unset in the environment, jobs that need
to read from/write to TEXMFVAR or TEXMFCONFIG will fail.  If set, environment
variables take precedence.

* gnu/packages/tex.scm (texlive-libkpathsea): Add replacement, pointing to…
(texlive-libkpathsea/fixed): … this.  Add definitions for XDG_CACHE_HOME and
XDG_CONFIG_HOME.
---
For v2, I'm replacing the entire phase, because this makes it easier to strip
the leading dot and should also make it easier to ungraft.

 gnu/packages/tex.scm | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index 31b7d9ff566..b47baec3497 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -296,6 +296,9 @@ (define-public texlive-source
 (define-public texlive-libkpathsea
   (package
     (name "texlive-libkpathsea")
+    ;; TODO: ungraft on tex-team or a dedicated branch,
+    ;; integrating the missing definitions.
+    (replacement texlive-libkpathsea/fixed)
     (version (package-version texlive-source))
     (source
      (origin
@@ -395,6 +398,47 @@ (define-public texlive-libkpathsea
 of user-specified directories similar to how shells look up executables.")
     (license license:lgpl2.1)))
 
+(define texlive-libkpathsea/fixed
+  (package
+    (inherit texlive-libkpathsea)
+    (arguments
+     (substitute-keyword-arguments (package-arguments texlive-libkpathsea)
+       ((#:phases phases)
+        #~(modify-phases #$phases
+            (replace 'customize-texmf.cnf
+              (lambda _
+                (substitute* "texk/kpathsea/texmf.cnf"
+                  (("^TEXMFROOT = .*") "TEXMFROOT = {$GUIX_TEXMF}/..\n")
+                  (("^TEXMFDIST = .*") "TEXMFDIST = {$GUIX_TEXMF}\n")
+                  ;; Use XDG recommendations for local variables.  Also ignore
+                  ;; system-wide cache, which is not writable; use local one
+                  ;; instead, i.e., "$XDG_CACHE_HOME/texliveYYYY/texmf-var/".
+                  (("^TEXMFVAR = ~/\\.")
+                   (string-append "XDG_CACHE_HOME = ~/.cache\n"
+                                  "TEXMFVAR = $XDG_CACHE_HOME/"))
+                  (("^TEXMFCONFIG = ~/\\.")
+                   (string-append "XDG_CONFIG_HOME = ~/.config\n"
+                                  "TEXMFCONFIG = $XDG_CONFIG_HOME/"))
+                  (("^TEXMFCACHE = .*") "TEXMFCACHE = $TEXMFVAR\n")
+                  ;; "ls-R" files are to be expected only in the TEXMFDIST
+                  ;; directories.  TEXMFLOCAL is not necessary for Guix, but
+                  ;; could be required anyway by external TeX installations.
+                  (("^TEXMF = .*")
+                   "TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!TEXMFLOCAL,TEXMFSYSVAR,TEXMFSYSCONFIG,!!$TEXMFDIST}\n")
+                  (("^TEXMFDBS = .*") "TEXMFDBS = {!!$TEXMFLOCAL,!!$TEXMFDIST}\n")
+                  ;; Set TEXMFCNF.  Since earlier values of variables have
+                  ;; precedence over later ones, insert the desired value first.
+                  (("^TEXMFCNF =")
+                   (string-append
+                    "TEXMFCNF = " #$output "/share/texmf-dist/web2c\n"
+                    "TEXMFCNF ="))
+                  ;; Help TeX finding fonts installed on the system.
+                  (("^OSFONTDIR = .*") "OSFONTDIR = {$XDG_DATA_DIRS}\n")
+                  ;; Don't truncate lines.
+                  (("^error_line = .*$") "error_line = 254\n")
+                  (("^half_error_line = .*$") "half_error_line = 238\n")
+                  (("^max_print_line = .*$") "max_print_line = 1000\n"))))))))))
+
 (define-public texlive-libptexenc
   (package
     (name "texlive-libptexenc")

base-commit: 9f3d8dbda60bb1dd15d2956c334354947df8b3f5
-- 
2.49.0