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.
This commit is contained in:
parent
c8e75dfa24
commit
ec97cf1569
2 changed files with 215 additions and 20 deletions
|
@ -183,6 +183,7 @@ When TEXLIVE-ONLY is true, only TeX Live packages are returned."
|
||||||
(srcfiles . list)
|
(srcfiles . list)
|
||||||
(runfiles . list)
|
(runfiles . list)
|
||||||
(docfiles . list)
|
(docfiles . list)
|
||||||
|
(binfiles . list)
|
||||||
(depend . simple-list)
|
(depend . simple-list)
|
||||||
(execute . simple-list)))
|
(execute . simple-list)))
|
||||||
(record
|
(record
|
||||||
|
@ -264,6 +265,46 @@ When TEXLIVE-ONLY is true, only TeX Live packages are returned."
|
||||||
packages)
|
packages)
|
||||||
(append packages deps)))))))
|
(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
|
(define* (files-differ? directory package-name
|
||||||
#:key
|
#:key
|
||||||
(package-database tlpdb)
|
(package-database tlpdb)
|
||||||
|
@ -348,7 +389,9 @@ of those files are returned that are unexpectedly installed."
|
||||||
(source (with-store store
|
(source (with-store store
|
||||||
(download-multi-svn-to-store
|
(download-multi-svn-to-store
|
||||||
store ref (string-append name "-svn-multi-checkout")))))
|
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
|
(values
|
||||||
`(package
|
`(package
|
||||||
(name ,name)
|
(name ,name)
|
||||||
|
@ -369,25 +412,10 @@ of those files are returned that are unexpectedly installed."
|
||||||
(build-system ,(if meta-package?
|
(build-system ,(if meta-package?
|
||||||
'trivial-build-system
|
'trivial-build-system
|
||||||
'texlive-build-system))
|
'texlive-build-system))
|
||||||
|
;; Generate arguments field.
|
||||||
,@(if meta-package?
|
,@(if meta-package?
|
||||||
'((arguments (list #:builder #~(mkdir #$output))))
|
'((arguments (list #:builder #~(mkdir #$output))))
|
||||||
(let* ((formats
|
(let* ((formats (formats data))
|
||||||
;; 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.
|
|
||||||
(latex-bin-dependency?
|
(latex-bin-dependency?
|
||||||
(member texlive-name
|
(member texlive-name
|
||||||
(latex-bin-dependency-tree package-database)))
|
(latex-bin-dependency-tree package-database)))
|
||||||
|
@ -395,14 +423,20 @@ of those files are returned that are unexpectedly installed."
|
||||||
(append (if latex-bin-dependency?
|
(append (if latex-bin-dependency?
|
||||||
'(#:texlive-latex-bin? #f)
|
'(#:texlive-latex-bin? #f)
|
||||||
'())
|
'())
|
||||||
(if formats
|
(if (pair? scripts)
|
||||||
|
`(#:link-scripts #~(list ,@scripts))
|
||||||
|
'())
|
||||||
|
(if (pair? formats)
|
||||||
`(#:create-formats #~(list ,@formats))
|
`(#:create-formats #~(list ,@formats))
|
||||||
'()))))
|
'()))))
|
||||||
(if (pair? arguments)
|
(if (pair? arguments)
|
||||||
`((arguments (list ,@arguments)))
|
`((arguments (list ,@arguments)))
|
||||||
'())))
|
'())))
|
||||||
|
;; Native inputs.
|
||||||
|
;;
|
||||||
;; Texlive build system generates font metrics whenever a font
|
;; 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))
|
,@(or (and-let* ((runfiles (assoc-ref data 'runfiles))
|
||||||
(metrics
|
(metrics
|
||||||
(filter-map (lambda (f)
|
(filter-map (lambda (f)
|
||||||
|
@ -416,6 +450,15 @@ of those files are returned that are unexpectedly installed."
|
||||||
runfiles)))
|
runfiles)))
|
||||||
'((native-inputs (list texlive-metafont))))
|
'((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)
|
,@(match (translate-depends depends)
|
||||||
(() '())
|
(() '())
|
||||||
(inputs
|
(inputs
|
||||||
|
|
|
@ -69,6 +69,19 @@
|
||||||
"texmf-dist/tex/latex/adforn/adforn.sty"
|
"texmf-dist/tex/latex/adforn/adforn.sty"
|
||||||
"texmf-dist/tex/latex/adforn/uornementsadf.fd")
|
"texmf-dist/tex/latex/adforn/uornementsadf.fd")
|
||||||
(catalogue-license . "lppl gpl2"))
|
(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"
|
("chs-physics-report"
|
||||||
. ((name . "ch-physics-report")
|
. ((name . "ch-physics-report")
|
||||||
(shortdesc . "Physics lab reports...")
|
(shortdesc . "Physics lab reports...")
|
||||||
|
@ -92,6 +105,22 @@
|
||||||
(shortdesc . "TeXworks editor...")
|
(shortdesc . "TeXworks editor...")
|
||||||
(longdesc . "See http...")
|
(longdesc . "See http...")
|
||||||
(depend "texworks" "collection-basic"))
|
(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"
|
("example"
|
||||||
. ((name . "example")
|
. ((name . "example")
|
||||||
(shortdesc . "Typeset examples...")
|
(shortdesc . "Typeset examples...")
|
||||||
|
@ -133,6 +162,24 @@
|
||||||
"texmf-dist/tex/lollipop/lollipop.ini"
|
"texmf-dist/tex/lollipop/lollipop.ini"
|
||||||
"texmf-dist/tex/lollipop/lollipop.tex")
|
"texmf-dist/tex/lollipop/lollipop.tex")
|
||||||
(catalogue-license . "gpl3"))
|
(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"
|
("stricttex"
|
||||||
. ((name
|
. ((name
|
||||||
. "stricttex")
|
. "stricttex")
|
||||||
|
@ -646,4 +693,109 @@ completely compatible with Plain TeX.")
|
||||||
(format #t "~s~%" result)
|
(format #t "~s~%" result)
|
||||||
(pk 'fail result #f)))))))
|
(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")
|
(test-end "texlive")
|
||||||
|
|
Reference in a new issue