summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicolas Goaziou <mail@nicolasgoaziou.fr>2023-06-18 22:45:43 +0200
committerNicolas Goaziou <mail@nicolasgoaziou.fr>2023-07-18 18:15:05 +0200
commitec97cf15693a0567daa741ecf6d21e6e7ec68134 (patch)
tree68c8b48eb9b057e0576e2ced0aac1e1ab40e7a72
parentc8e75dfa2439cbd9bc5ca9a4d849d76250809dc8 (diff)
downloadguix-ec97cf15693a0567daa741ecf6d21e6e7ec68134.tar.gz
guix: Let texlive importer handle linked scripts.
* guix/import/texlive.scm (tlpdb): Also retrieve so-called binfiles.
(formats):
(linked-scripts): New functions.
(tlpdb->package): Use new functions to set #:LINK-SCRIPTS argument and
possibly INPUTS.
* tests/texlive.scm (%fake-tlpdb): Add test data.
("texlive->guix-package, single script, no extension"):
("texlive->guix-package, multiple scripts, with extensions"):
("texlive->guix-package, script with associated input"):  New tests.
-rw-r--r--guix/import/texlive.scm83
-rw-r--r--tests/texlive.scm152
2 files changed, 215 insertions, 20 deletions
diff --git a/guix/import/texlive.scm b/guix/import/texlive.scm
index 5458a43456..554258f20d 100644
--- a/guix/import/texlive.scm
+++ b/guix/import/texlive.scm
@@ -183,6 +183,7 @@ When TEXLIVE-ONLY is true, only TeX Live packages are returned."
               (srcfiles . list)
               (runfiles . list)
               (docfiles . list)
+              (binfiles . list)
               (depend   . simple-list)
               (execute  . simple-list)))
            (record
@@ -264,6 +265,46 @@ When TEXLIVE-ONLY is true, only TeX Live packages are returned."
                              packages)
                  (append packages deps)))))))
 
+(define (formats package-data)
+  "Return a list of formats to build according to PACKAGE-DATA."
+  (and=> (assoc-ref package-data 'execute)
+         (lambda (actions)
+           (delete-duplicates
+            (filter-map
+             (lambda (action)
+               (match (string-split action #\space)
+                 (("AddFormat" fmt . _)
+                  (string-drop fmt (string-length "name=")))
+                 (_ #f)))
+             ;; Get the right (alphabetic) order.
+             (reverse actions))))))
+
+(define (linked-scripts name package-database)
+  "Return a list of script names to symlink from \"bin/\" directory for
+package NAME according to PACKAGE-DATABASE.  Consider as scripts files with
+\".lua\", \".pl\", \".py\", \".sh\" extensions, and files without extension."
+  (and-let* ((data (assoc-ref package-database name))
+             ;; Check if binaries are associated to the package.
+             (depend (assoc-ref data 'depend))
+             ((member (string-append name ".ARCH") depend))
+             ;; List those binaries.
+             (bin-data (assoc-ref package-database
+                                  ;; Any *nix-like architecture will do.
+                                  (string-append name ".x86_64-linux")))
+             (binaries (map basename (assoc-ref bin-data 'binfiles)))
+             ;; List scripts candidates.  Bail out if there are none.
+             (runfiles (assoc-ref data 'runfiles))
+             (scripts (filter (cut string-prefix? "texmf-dist/scripts/" <>)
+                              runfiles))
+             ((pair? scripts)))
+    (filter-map (lambda (script)
+                  (and (any (lambda (ext)
+                              (member (basename script ext) binaries))
+                            '(".lua" ".pl" ".py" ".sh"))
+                       (basename script)))
+                ;; Get the right (alphabetic) order.
+                (reverse scripts))))
+
 (define* (files-differ? directory package-name
                         #:key
                         (package-database tlpdb)
@@ -348,7 +389,9 @@ of those files are returned that are unexpectedly installed."
              (source (with-store store
                        (download-multi-svn-to-store
                         store ref (string-append name "-svn-multi-checkout")))))
-    (let ((meta-package? (null? locs)))
+    (let* ((meta-package? (null? locs))
+           (scripts (and (not meta-package?)
+                         (linked-scripts texlive-name package-database))))
       (values
        `(package
           (name ,name)
@@ -369,25 +412,10 @@ of those files are returned that are unexpectedly installed."
           (build-system ,(if meta-package?
                              'trivial-build-system
                              'texlive-build-system))
+          ;; Generate arguments field.
           ,@(if meta-package?
                 '((arguments (list #:builder #~(mkdir #$output))))
-                (let* ((formats
-                        ;; Translate AddFormat execute actions into
-                        ;; a #:create-formats argument.
-                        (and-let*
-                            ((actions (assoc-ref data 'execute))
-                             (formats
-                              (delete-duplicates
-                               (filter-map
-                                (lambda (action)
-                                  (match (string-split action #\space)
-                                    (("AddFormat" fmt . _)
-                                     (string-drop fmt (string-length "name=")))
-                                    (_ #f)))
-                                actions)))
-                             ((pair? formats)))
-                          (reverse formats)))
-                       ;; Check if setting #:texlive-latex-bin? is appropriate.
+                (let* ((formats (formats data))
                        (latex-bin-dependency?
                         (member texlive-name
                                 (latex-bin-dependency-tree package-database)))
@@ -395,14 +423,20 @@ of those files are returned that are unexpectedly installed."
                         (append (if latex-bin-dependency?
                                     '(#:texlive-latex-bin? #f)
                                     '())
-                                (if formats
+                                (if (pair? scripts)
+                                    `(#:link-scripts #~(list ,@scripts))
+                                    '())
+                                (if (pair? formats)
                                     `(#:create-formats #~(list ,@formats))
                                     '()))))
                   (if (pair? arguments)
                       `((arguments (list ,@arguments)))
                       '())))
+          ;; Native inputs.
+          ;;
           ;; Texlive build system generates font metrics whenever a font
-          ;; metrics file has the same base name as a Metafont file.
+          ;; metrics file has the same base name as a Metafont file.  In this
+          ;; case, provide `texlive-metafont'.
           ,@(or (and-let* ((runfiles (assoc-ref data 'runfiles))
                            (metrics
                             (filter-map (lambda (f)
@@ -416,6 +450,15 @@ of those files are returned that are unexpectedly installed."
                                  runfiles)))
                   '((native-inputs (list texlive-metafont))))
                 '())
+          ;; Inputs.
+          ,@(match (filter-map (lambda (s)
+                                 (cond ((string-suffix? ".pl" s) 'perl)
+                                       ((string-suffix? ".py" s) 'python)
+                                       (else #f)))
+                               (or scripts '()))
+              (() '())
+              (inputs `((inputs (list ,@inputs)))))
+          ;; Propagated inputs.
           ,@(match (translate-depends depends)
               (() '())
               (inputs
diff --git a/tests/texlive.scm b/tests/texlive.scm
index 063cde6465..98461f7e51 100644
--- a/tests/texlive.scm
+++ b/tests/texlive.scm
@@ -69,6 +69,19 @@
       "texmf-dist/tex/latex/adforn/adforn.sty"
       "texmf-dist/tex/latex/adforn/uornementsadf.fd")
      (catalogue-license . "lppl gpl2"))
+    ("authorindex"
+     (name . "authorindex")
+     (shortdesc . "Index citations by author names")
+     (longdesc . "This package allows the user to...")
+     (depend "authorindex.ARCH")
+     (docfiles "texmf-dist/doc/latex/authorindex/COPYING")
+     (runfiles
+      "texmf-dist/scripts/authorindex/authorindex"
+      "texmf-dist/tex/latex/authorindex/authorindex.sty")
+     (catalogue-license . "lppl"))
+    ("authorindex.x86_64-linux"
+     (name . "authorindex.x86_64-linux")
+     (binfiles "bin/amd64-netbsd/authorindex"))
     ("chs-physics-report"
      . ((name . "ch-physics-report")
         (shortdesc . "Physics lab reports...")
@@ -92,6 +105,22 @@
      (shortdesc . "TeXworks editor...")
      (longdesc . "See http...")
      (depend "texworks" "collection-basic"))
+    ("cyrillic-bin"
+     (name . "cyrillic-bin")
+     (shortdesc . "Cyrillic bibtex and makeindex")
+     (depend "cyrillic-bin.ARCH")
+     (docfiles
+      "texmf-dist/doc/man/man1/rubibtex.1"
+      "texmf-dist/doc/man/man1/rubibtex.man1.pdf")
+     (runfiles
+      "texmf-dist/scripts/texlive-extra/rumakeindex.sh"
+      "texmf-dist/scripts/texlive-extra/rubibtex.sh"))
+    ("cyrillic-bin.x86_64-linux"
+     (name . "cyrillic-bin.x86_64-linux")
+     (shortdesc . "x86_64-linux files of cyrillic-bin")
+     (binfiles
+      "bin/x86_64-linux/rubibtex"
+      "bin/x86_64-linux/rumakeindex"))
     ("example"
      . ((name . "example")
         (shortdesc . "Typeset examples...")
@@ -133,6 +162,24 @@
       "texmf-dist/tex/lollipop/lollipop.ini"
       "texmf-dist/tex/lollipop/lollipop.tex")
      (catalogue-license . "gpl3"))
+    ("pax"
+     (name . "pax")
+     (shortdesc . "Extract and reinsert PDF...")
+     (longdesc . "If PDF files are...")
+     (depend "pax.ARCH")
+     (docfiles
+      "texmf-dist/doc/latex/pax/README")
+     (srcfiles
+      "texmf-dist/source/latex/pax/Makefile"
+      "texmf-dist/source/latex/pax/build.xml")
+     (runfiles
+      "texmf-dist/scripts/pax/pdfannotextractor.pl")
+     (catalogue-license . "lppl gpl"))
+    ("pax.x86_64-linux"
+     (name . "pax.x86_64-linux")
+     (shortdesc . "x86_64-linux files of pax")
+     (binfiles
+      "bin/x86_64-linux/pdfannotextractor"))
     ("stricttex"
      . ((name
          . "stricttex")
@@ -646,4 +693,109 @@ completely compatible with Plain TeX.")
                (format #t "~s~%" result)
                (pk 'fail result #f)))))))
 
+(test-assert "texlive->guix-package, single script, no extension"
+  ;; Replace network resources with sample data.
+  (mock ((guix build svn) svn-fetch
+         (lambda* (url revision directory
+                       #:key (svn-command "svn")
+                       (user-name #f)
+                       (password #f)
+                       (recursive? #t))
+           (mkdir-p directory)
+           (with-output-to-file (string-append directory "/foo")
+             (lambda ()
+               (display "source")))))
+        (let ((result (texlive->guix-package "authorindex"
+                                             #:package-database
+                                             (lambda _ %fake-tlpdb))))
+          (match result
+            (('package
+               ('name "texlive-authorindex")
+               ('version _)
+               ('source _)
+               ('outputs _)
+               ('build-system 'texlive-build-system)
+               ('arguments
+                ('list '#:link-scripts ('gexp ('list "authorindex"))))
+               ('home-page (? string?))
+               ('synopsis (? string?))
+               ('description (? string?))
+               ('license _))
+             #true)
+            (_
+             (begin
+               (format #t "~s~%" result)
+               (pk 'fail result #f)))))))
+
+(test-assert "texlive->guix-package, multiple scripts, with extensions"
+  ;; Replace network resources with sample data.
+  (mock ((guix build svn) svn-fetch
+         (lambda* (url revision directory
+                       #:key (svn-command "svn")
+                       (user-name #f)
+                       (password #f)
+                       (recursive? #t))
+           (mkdir-p directory)
+           (with-output-to-file (string-append directory "/foo")
+             (lambda ()
+               (display "source")))))
+        (let ((result (texlive->guix-package "cyrillic-bin"
+                                             #:package-database
+                                             (lambda _ %fake-tlpdb))))
+          (match result
+            (('package
+               ('name "texlive-cyrillic-bin")
+               ('version _)
+               ('source _)
+               ('outputs _)
+               ('build-system 'texlive-build-system)
+               ('arguments
+                ('list '#:link-scripts
+                       ('gexp ('list "rubibtex.sh" "rumakeindex.sh"))))
+               ('home-page _)
+               ('synopsis _)
+               ('description _)
+               ('license _))
+             #true)
+            (_
+             (begin
+               (format #t "~s~%" result)
+               (pk 'fail result #f)))))))
+
+(test-assert "texlive->guix-package, script with associated input"
+  ;; Replace network resources with sample data.
+  (mock ((guix build svn) svn-fetch
+         (lambda* (url revision directory
+                       #:key (svn-command "svn")
+                       (user-name #f)
+                       (password #f)
+                       (recursive? #t))
+           (mkdir-p directory)
+           (with-output-to-file (string-append directory "/foo")
+             (lambda ()
+               (display "source")))))
+        (let ((result (texlive->guix-package "pax"
+                                             #:package-database
+                                             (lambda _ %fake-tlpdb))))
+          (match result
+            (('package
+               ('name "texlive-pax")
+               ('version _)
+               ('source _)
+               ('outputs _)
+               ('build-system 'texlive-build-system)
+               ('arguments
+                ('list '#:link-scripts ('gexp ('list "pdfannotextractor.pl"))))
+               ('inputs
+                ('list 'perl))
+               ('home-page _)
+               ('synopsis _)
+               ('description _)
+               ('license _))
+             #true)
+            (_
+             (begin
+               (format #t "~s~%" result)
+               (pk 'fail result #f)))))))
+
 (test-end "texlive")