diff options
-rw-r--r-- | gnu/packages/tex.scm | 215 | ||||
-rw-r--r-- | guix/build/texlive-build-system.scm | 32 | ||||
-rw-r--r-- | guix/profiles.scm | 48 |
3 files changed, 99 insertions, 196 deletions
diff --git a/gnu/packages/tex.scm b/gnu/packages/tex.scm index 67fec8b474..fb61a6c1ba 100644 --- a/gnu/packages/tex.scm +++ b/gnu/packages/tex.scm @@ -35,6 +35,7 @@ #:use-module ((guix licenses) #:prefix license:) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix build-system copy) #:use-module (guix build-system gnu) #:use-module (guix build-system perl) #:use-module (guix build-system python) @@ -430,6 +431,32 @@ files from LOCATIONS with expected checksum HASH. CODE is not currently in use. (substitute-commands iso-8859-1-encoded-scripts)) #t))) + (add-after 'check 'customize-texmf.cnf + ;; The default texmf.cnf is provided by this package, texlive-bin. + ;; Every variable of interest is set relatively to the GUIX_TEXMF + ;; environment variable defined via a search path specification + ;; further below. The configuration file is patched after the test + ;; suite has run, as it relies on the default configuration to find + ;; its paths (and the GUIX_TEXMF variable isn't set yet). + (lambda _ + ;; The current directory is build/ because of the out-of-tree + ;; build. + (let* ((source (first (scandir ".." (cut string-suffix? + "source" <>)))) + (texmf.cnf (string-append "../" source + "/texk/kpathsea/texmf.cnf"))) + (substitute* texmf.cnf + (("^TEXMFROOT = .*") + "TEXMFROOT = {$GUIX_TEXMF}/..\n") + (("^TEXMF = .*") + "TEXMF = {$GUIX_TEXMF}\n") + (("^%TEXMFCNF = .*") + "TEXMFCNF = {$GUIX_TEXMF}/web2c\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"))) + #t)) (add-after 'install 'postint (lambda* (#:key inputs outputs #:allow-other-keys #:rest args) (let* ((out (assoc-ref outputs "out")) @@ -450,11 +477,7 @@ files from LOCATIONS with expected checksum HASH. CODE is not currently in use. "/tlpkg")) (config.guess (string-append (assoc-ref inputs "config") "/bin/config.guess"))) - (substitute* (string-append share "/texmf-dist/web2c/texmf.cnf") - ;; 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")) + ;; Create symbolic links for the latex variants and their ;; man pages. (with-directory-excursion (string-append out "/bin/") @@ -477,6 +500,11 @@ files from LOCATIONS with expected checksum HASH. CODE is not currently in use. (("\\$TEXMFROOT/") (string-append share "/"))) + ;; Likewise for updmap.pl. + (substitute* (string-append scripts "/updmap.pl") + (("\\$TEXMFROOT/tlpkg") + (string-append share "/tlpkg"))) + ;; Likewise for the tlmgr. (substitute* (string-append scripts "/tlmgr.pl") ((".*\\$::installerdir = \\$Master.*" all) @@ -495,13 +523,8 @@ files from LOCATIONS with expected checksum HASH. CODE is not currently in use. (patch-source-shebangs)))))))) (native-search-paths (list (search-path-specification - (variable "TEXMF") - (files '("share/texmf-dist")) - (separator #f)) - (search-path-specification - (variable "TEXMFCNF") - (files '("share/texmf-dist/web2c")) - (separator #f)))) + (variable "GUIX_TEXMF") + (files '("share/texmf-dist"))))) (synopsis "TeX Live, a package of the TeX typesetting system") (description "TeX Live provides a comprehensive TeX document production system. @@ -3004,7 +3027,7 @@ tables.") ;; The following fonts are propagated as a texlive-union as the font ;; maps need to be recreated for the fonts to be usable. They are ;; required by xmltex through mlnames.sty and unicode.sty. - `(("texlive" ,(texlive-union + `(("texlive" ,(texlive-updmap.cfg (list texlive-amsfonts texlive-babel @@ -3756,127 +3779,81 @@ It includes little more than the required set of LaTeX packages.") '() default-packages))))) -;; For use in package definitions only -(define-public texlive-union +;;; 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. +(define-public texlive-updmap.cfg (lambda* (#:optional (packages '())) - "Return 'texlive-union' package which is a union of PACKAGES and the -standard LaTeX packages." + "Return a 'texlive-updmap.cfg' package which contains the fonts map +configuration of a base set of packages plus PACKAGES." (let ((default-packages (match (package-propagated-inputs texlive-base) (((labels packages) ...) packages)))) - (package (inherit texlive-base) - (name "texlive-union") - (build-system trivial-build-system) + (package + (version (number->string %texlive-revision)) + (source (origin + (method url-fetch) + (uri (string-append "https://tug.org/svn/texlive/tags/" + %texlive-tag + "/Master/texmf-dist/web2c/updmap.cfg" + "?revision=" version)) + (file-name "updmap.cfg") + (sha256 + (base32 + "0faqknqxs80qp9ywk0by5k85s0yalg97c4lja4q56lsyblrr4j7i")))) + (name "texlive-updmap.cfg") + (build-system copy-build-system) (arguments - '(#:modules ((guix build union) + '(#:modules ((guix build copy-build-system) (guix build utils) - (guix build texlive-build-system) - (guix build gnu-build-system) - (guix build gremlin) - (guix elf)) - #:builder - (begin - (use-modules (ice-9 match) - (ice-9 popen) - (srfi srfi-26) - (guix build union) - (guix build utils) - (guix build texlive-build-system)) - (let* ((out (assoc-ref %outputs "out")) - (texmf.cnf (string-append out "/share/texmf-dist/web2c/texmf.cnf"))) - ;; Build a modifiable union of all inputs (but exclude bash and - ;; the updmap.cfg file) - (match (filter (match-lambda - ((name . _) - (not (member name '("bash" - "coreutils" - "sed" - "updmap.cfg"))))) - %build-inputs) - (((names . directories) ...) - (union-build (assoc-ref %outputs "out") - directories - #:create-all-directories? #t - #:log-port (%make-void-port "w")))) - - ;; The configuration file "texmf.cnf" is provided by the - ;; "texlive-bin" package. We take it and override only the - ;; setting for TEXMFROOT and TEXMF. This file won't be consulted - ;; by default, though, so we still need to set TEXMFCNF. - (substitute* texmf.cnf - (("^TEXMFROOT = .*") - (string-append "TEXMFROOT = " out "/share\n")) - (("^TEXMF = .*") - "TEXMF = $TEXMFROOT/share/texmf-dist\n")) - (setenv "PATH" (string-append - (assoc-ref %build-inputs "bash") "/bin:" - (assoc-ref %build-inputs "coreutils") "/bin:" - (assoc-ref %build-inputs "sed") "/bin:" - (string-append out "/bin"))) - (for-each - (cut wrap-program <> - `("TEXMFCNF" ":" suffix (,(dirname texmf.cnf))) - `("TEXMF" ":" suffix (,(string-append out "/share/texmf-dist")))) - (find-files (string-append out "/bin") ".*")) - - ;; Remove invalid maps from config file. - (let ((web2c (string-append out "/share/texmf-config/web2c/")) - (maproot (string-append out "/share/texmf-dist/fonts/map/"))) - (mkdir-p web2c) - (copy-file - (assoc-ref %build-inputs "updmap.cfg") - (string-append web2c "updmap.cfg")) - (make-file-writable (string-append web2c "updmap.cfg")) + (ice-9 popen) + (ice-9 textual-ports)) + #:install-plan '(("updmap.cfg" "share/texmf-config/web2c/") + ("map" "share/texmf-dist/fonts/map")) + #:phases + (modify-phases %standard-phases + (add-before 'install 'regenerate-updmap.cfg + (lambda _ + (make-file-writable "updmap.cfg") + ;; Disable unavailable map files. (let* ((port (open-pipe* OPEN_WRITE "updmap-sys" "--syncwithtrees" "--nohash" - (string-append "--cnffile=" web2c "updmap.cfg")))) + "--cnffile" "updmap.cfg"))) (display "Y\n" port) (when (not (zero? (status:exit-val (close-pipe port)))) (error "failed to filter updmap.cfg"))) + + ;; Set TEXMFSYSVAR to a sane and writable value; updmap fails + ;; if it cannot create its log file there. + (setenv "TEXMFSYSVAR" (getcwd)) + ;; Generate maps. (invoke "updmap-sys" - (string-append "--cnffile=" web2c "updmap.cfg") - (string-append "--dvipdfmxoutputdir=" - maproot "dvipdfmx/updmap/") - (string-append "--dvipsoutputdir=" - maproot "dvips/updmap/") - (string-append "--pdftexoutputdir=" - maproot "pdftex/updmap/")) - ;; Having this file breaks all file lookups later. - (delete-file (string-append out "/share/texmf-dist/ls-R"))) - #t)))) - (inputs - `(("bash" ,bash-minimal) - ,@(map (lambda (package) - (list (package-name package) package)) - (append default-packages packages)))) - (native-inputs - `(("coreutils" ,coreutils) - ("sed" ,sed) - ("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 - "0faqknqxs80qp9ywk0by5k85s0yalg97c4lja4q56lsyblrr4j7i")))))) + "--cnffile" "updmap.cfg" + "--dvipdfmxoutputdir" "map/dvipdfmx/updmap/" + "--dvipsoutputdir" "map/dvips/updmap/" + "--pdftexoutputdir" "map/pdftex/updmap/")))))) + (propagated-inputs (map (lambda (package) + (list (package-name package) package)) + (append default-packages packages))) (home-page (package-home-page texlive-bin)) - (synopsis "Union of TeX Live packages") - (description "This package provides a subset of the TeX Live -distribution.") - (license (fold (lambda (package result) - (match (package-license package) - ((lst ...) - (append lst result)) - ((? license:license? license) - (cons license result)))) - '() - (append default-packages packages))))))) + (synopsis "TeX Live fonts map configuration") + (description "This package contains the fonts map configuration file +generated for the base TeX Live packages as well as, optionally, user-provided +ones.") + (license (delete-duplicates + (fold (lambda (package result) + (match (package-license package) + ((lst ...) + (append lst result)) + ((? license:license? license) + (cons license result)))) + '() + (append default-packages packages)))))))) + +;;; Deprecated. +(define texlive-union texlive-updmap.cfg) ;; For use in package definitions only (define-public texlive-tiny diff --git a/guix/build/texlive-build-system.scm b/guix/build/texlive-build-system.scm index a4c81f07cd..4c255700bb 100644 --- a/guix/build/texlive-build-system.scm +++ b/guix/build/texlive-build-system.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2021 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; ;;; This file is part of GNU Guix. ;;; @@ -40,35 +41,8 @@ (string-append "&" format) file)) -(define* (configure #:key inputs #:allow-other-keys) - (let* ((out (string-append (getcwd) "/.texlive-union")) - (texmf.cnf (string-append out "/share/texmf-dist/web2c/texmf.cnf"))) - ;; Build a modifiable union of all inputs (but exclude bash) - (match inputs - (((names . directories) ...) - (union-build out (filter directory-exists? directories) - #:create-all-directories? #t - #:log-port (%make-void-port "w")))) - - ;; The configuration file "texmf.cnf" is provided by the - ;; "texlive-bin" package. We take it and override only the - ;; setting for TEXMFROOT and TEXMF. This file won't be consulted - ;; by default, though, so we still need to set TEXMFCNF. - (substitute* texmf.cnf - (("^TEXMFROOT = .*") - (string-append "TEXMFROOT = " out "/share\n")) - (("^TEXMF = .*") - "TEXMF = $TEXMFROOT/share/texmf-dist\n")) - (setenv "TEXMFCNF" (dirname texmf.cnf)) - (setenv "TEXMF" (string-append out "/share/texmf-dist")) - - ;; Don't truncate lines. - (setenv "error_line" "254") ; must be less than 255 - (setenv "half_error_line" "238") ; must be less than error_line - 15 - (setenv "max_print_line" "1000")) - (mkdir "build")) - (define* (build #:key inputs build-targets tex-format #:allow-other-keys) + (mkdir "build") (for-each (cut compile-with-latex tex-format <>) (if build-targets build-targets (scandir "." (cut string-suffix? ".ins" <>))))) @@ -85,7 +59,7 @@ (define %standard-phases (modify-phases gnu:%standard-phases (delete 'bootstrap) - (replace 'configure configure) + (delete 'configure) (replace 'build build) (delete 'check) (replace 'install install))) diff --git a/guix/profiles.scm b/guix/profiles.scm index 59a313ea08..deefce2e26 100644 --- a/guix/profiles.scm +++ b/guix/profiles.scm @@ -1526,53 +1526,6 @@ the entries in MANIFEST." `((type . profile-hook) (hook . manual-database)))) -(define (texlive-configuration manifest) - "Return a derivation that builds a TeXlive configuration for the entries in -MANIFEST." - (define entry->texlive-input - (match-lambda - (($ <manifest-entry> name version output thing deps) - (if (string-prefix? "texlive-" name) - (cons (gexp-input thing output) - (append-map entry->texlive-input deps)) - '())))) - (define build - (with-imported-modules '((guix build utils) - (guix build union)) - #~(begin - (use-modules (guix build utils) - (guix build union)) - - ;; 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 - '#$(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")))) - #t))) - - (with-monad %store-monad - (if (any (cut string-prefix? "texlive-" <>) - (map manifest-entry-name (manifest-entries manifest))) - (gexp->derivation "texlive-configuration" build - #:substitutable? #f - #:local-build? #t - #:properties - `((type . profile-hook) - (hook . texlive-configuration))) - (return #f)))) - (define %default-profile-hooks ;; This is the list of derivation-returning procedures that are called by ;; default when making a non-empty profile. @@ -1584,7 +1537,6 @@ MANIFEST." glib-schemas gtk-icon-themes gtk-im-modules - texlive-configuration xdg-desktop-database xdg-mime-database)) |