Subject: bug#65366: [PATCH] gnu: texlive-chktex: Fix runtime error.

From: Nicolas Goaziou <[email-masked]>
Date: Sat, 2 Sep 2023 21:18:13 +0200

This fixes <https://issues.guix.gnu.org/65366>.

* gnu/packages/tex.scm (texlive-source): New variable.
(texlive-chktex)[source]: Build binary from source.
[build-system]: Use GNU-BUILD-SYSTEM.
[arguments]<#:phases>: Make sure the `chktex' executable can locate a global
configuration file.
[native-inputs]: Add PKG-CONFIG and TEXLIVE-LIBKPATHSEA.
---

The following patch should (partly) fix the issue with chktex. Because
both `texlive-bin' and `texlive-chktex' provide the `chktex'
executable, one just has to make sure the binary from `texlive-chktex'
is used.

The next step will be to remove it from `texlive-bin', but this need
to go in a separate branch due to the sheer number of rebuilds this
will entail.

Also, the patch paves the way towards more executables being removed
from `texlive-bin', by defining a common `texlive-source' macro.

 gnu/packages/tex.scm | 79 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 63 insertions(+), 16 deletions(-)

diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm
index 9ac9105342..af276cfbdc 100644
--- a/gnu/packages/tex.scm
+++ b/gnu/packages/tex.scm
@@ -162,6 +162,17 @@ (define-syntax-rule (define-deprecated-package old-name name)
   (define-deprecated/public old-name name
     (deprecated-package (symbol->string 'old-name) name)))
 
+(define texlive-source
+  (let ((version "20230313"))
+    (origin
+      (method url-fetch)
+      (uri (string-append "ftp://tug.org/historic/systems/texlive/"
+                          (string-take version 4) "/"
+                          "texlive-" version "-source.tar.xz"))
+      (sha256
+       (base32
+        "1fbrkv7g9j6ipmwjx27l8l9l974rmply8bhf7c2iqc6h3q7aly1q")))))
+
 (define-public texlive-libkpathsea
   (package
     (name "texlive-libkpathsea")
@@ -33358,22 +33369,58 @@ (define-public texlive-chktex
   (package
     (name "texlive-chktex")
     (version (number->string %texlive-revision))
-    (source (texlive-origin
-             name version
-             (list "chktex/"
-                   "doc/chktex/"
-                   "doc/man/man1/chktex.1"
-                   "doc/man/man1/chktex.man1.pdf"
-                   "doc/man/man1/chkweb.1"
-                   "doc/man/man1/chkweb.man1.pdf"
-                   "doc/man/man1/deweb.1"
-                   "doc/man/man1/deweb.man1.pdf"
-                   "scripts/chktex/")
-             (base32
-              "0qyrllxvcymmr1a4sq9c88fw5zchcx0n6yac69s61fg6xypk18bq")))
-    (outputs '("out" "doc"))
-    (build-system texlive-build-system)
-    (arguments (list #:link-scripts #~(list "chkweb.sh" "deweb.pl")))
+    (source
+     (origin
+       (inherit texlive-source)
+       (modules '((guix build utils)
+                  (ice-9 ftw)))
+       (snippet
+        #~(begin
+            (with-directory-excursion "libs"
+              (for-each
+               delete-file-recursively
+               (scandir "."
+                        (lambda (file)
+                          (and (not (member file '("." "..")))
+                               (eq? 'directory (stat:type (stat file))))))))
+            (with-directory-excursion "texk"
+              (let ((preserved-directories '("." ".." "chktex")))
+                (for-each
+                 delete-file-recursively
+                 (scandir "."
+                          (lambda (file)
+                            (and (not (member file preserved-directories))
+                                 (eq? 'directory
+                                      (stat:type (stat file)))))))))))))
+    (build-system gnu-build-system)
+    (arguments
+     (list
+      #:out-of-source? #true
+      #:configure-flags
+      #~(list "--disable-native-texlive-build"
+              "--disable-all-pkgs"
+              "--enable-chktex")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'locate-global-configuration-file
+            ;; `chktex' needs to know where its global configuration file is.
+            ;; However, it cannot understand our convoluted TEXMFMAIN value.
+            ;; This phase forces configuration file name.
+            (lambda _
+              (substitute* "texk/chktex/chktex-src/OpSys.c"
+                (("kpse_var_value\\(\"TEXMFMAIN\"\\)")
+                 (string-append "strdup(\"" #$output "/share/texmf-dist\")")))))
+          (add-after 'install 'post-install
+            (lambda _
+              (with-directory-excursion "texk/chktex"
+                (invoke "make" "install"))))
+          ;; Compilation forces a "/usr/bin/env perl" shebang.  Change it.
+          (add-after 'post-install 'patch-shebang
+            (lambda _
+              (patch-shebang
+               (string-append #$output
+                              "/share/texmf-dist/scripts/chktex/deweb.pl")))))))
+    (native-inputs (list pkg-config texlive-libkpathsea))
     (inputs (list perl))
     (home-page "https://ctan.org/pkg/chktex")
     (synopsis "Check for errors in LaTeX documents")

base-commit: f6cf746938d29ab3d0888a5e58cad97ce634766a
-- 
2.41.0