From 0aa34e820ca30171b1e5d75dd9e3b85d75ccaf83 Mon Sep 17 00:00:00 2001 From: Andreas Enge Date: Sat, 14 Mar 2015 22:42:41 +0100 Subject: [PATCH] gnu: texlive: Make the package structure more modular. * gnu/packages/texlive.scm (texlive-bin, texlive-texmf): New variables. The first one contains the binaries; the second one the texmf tree. (texlive): Drop output "data". Create the output "out" as the union of the suitable subdirectories of texlive-bin and texlive-texmf, and wrap the binaries, setting TEXMFCNF to the value corresponding to texlive-texmf. --- gnu/packages/texlive.scm | 248 ++++++++++++++++++++++++++------------- 1 file changed, 166 insertions(+), 82 deletions(-) diff --git a/gnu/packages/texlive.scm b/gnu/packages/texlive.scm index f757350135..56149ab58e 100644 --- a/gnu/packages/texlive.scm +++ b/gnu/packages/texlive.scm @@ -1,5 +1,5 @@ ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2013, 2014 Andreas Enge +;;; Copyright © 2013, 2014, 2015 Andreas Enge ;;; Copyright © 2014 Eric Bavier ;;; Copyright © 2015 Mark H Weaver ;;; @@ -23,7 +23,9 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix build-system gnu) + #:use-module (guix build-system trivial) #:use-module (gnu packages) + #:use-module (gnu packages bash) #:use-module (gnu packages compression) #:use-module (gnu packages fontutils) #:use-module (gnu packages gd) @@ -31,6 +33,7 @@ #:use-module (gnu packages gtk) #:use-module (gnu packages icu4c) #:use-module (gnu packages image) + #:use-module (gnu packages lua) #:use-module (gnu packages pdf) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) @@ -57,54 +60,48 @@ (sha256 (base32 "0qsr55ms1278dhmgixs5qqwd4fxhh369ihkki6wgh8xaqm8p48p0")))) -(define-public texlive +(define-public texlive-bin (package - (name "texlive") + (name "texlive-bin") (version "2014") - (source (origin - (method url-fetch) - (uri "ftp://tug.org/historic/systems/texlive/2014/texlive-20140525-source.tar.xz") - (sha256 (base32 - "1glmaw2jv42grbsn05kay825j66scimjqqc32776bb1356q4xfq8")))) + (source + (origin + (method url-fetch) + (uri "ftp://tug.org/historic/systems/texlive/2014/texlive-20140525-source.tar.xz") + (sha256 (base32 + "1glmaw2jv42grbsn05kay825j66scimjqqc32776bb1356q4xfq8")))) (build-system gnu-build-system) - (inputs `(("texlive-extra-src" ,texlive-extra-src) - ("texlive-texmf-src" ,texlive-texmf-src) - ("cairo" ,cairo) - ("fontconfig" ,fontconfig) - ("fontforge" ,fontforge) - ("freetype" ,freetype) - ("gd" ,gd) - ("ghostscript" ,ghostscript) - ("graphite2" ,graphite2) - ("harfbuzz" ,harfbuzz) - ("icu4c" ,icu4c) - ("libpaper" ,libpaper) - ("libpng" ,libpng) - ("libxaw" ,libxaw) - ("libxt" ,libxt) - ("perl" ,perl) - ("pixman" ,pixman) - ("poppler" ,poppler) - ("potrace" ,potrace) - ("python" ,python-2) ; incompatible with Python 3 (print syntax) - ("ruby" ,ruby) - ("tcsh" ,tcsh) - ("teckit" ,teckit) - ("zlib" ,zlib) - ("zziplib" ,zziplib))) + (inputs + `(("texlive-extra-src" ,texlive-extra-src) + ("cairo" ,cairo) + ("fontconfig" ,fontconfig) + ("fontforge" ,fontforge) + ("freetype" ,freetype) + ("gd" ,gd) + ("ghostscript" ,ghostscript) + ("graphite2" ,graphite2) + ("harfbuzz" ,harfbuzz) + ("icu4c" ,icu4c) + ("libpaper" ,libpaper) + ("libpng" ,libpng) + ("libxaw" ,libxaw) + ("libxt" ,libxt) + ("perl" ,perl) + ("pixman" ,pixman) + ("poppler" ,poppler) + ("potrace" ,potrace) + ("python" ,python-2) ; incompatible with Python 3 (print syntax) + ("ruby" ,ruby) + ("tcsh" ,tcsh) + ("teckit" ,teckit) + ("zlib" ,zlib) + ("zziplib" ,zziplib))) (native-inputs `(("pkg-config" ,pkg-config))) - (outputs '("out" "data")) (arguments `(#:out-of-source? #t #:configure-flags `("--disable-native-texlive-build" - ;; Although the texmf-dist data is taken from texlive-texmf, - ;; setting datarootdir is still useful: - ;; "make install" creates symbolic links to scripts in this place. - ,(string-append "--datarootdir=" (assoc-ref %outputs "data")) - ,(string-append "--infodir=" (assoc-ref %outputs "out") "/share/info") - ,(string-append "--mandir=" (assoc-ref %outputs "out") "/share/man") "--with-system-cairo" "--with-system-freetype2" "--with-system-gd" @@ -130,64 +127,151 @@ (alist-cons-after 'install 'postinst (lambda* (#:key inputs outputs #:allow-other-keys #:rest args) - (let ((texlive-extra (assoc-ref inputs "texlive-extra-src")) - (texlive-texmf (assoc-ref inputs "texlive-texmf-src")) - (out (assoc-ref outputs "out")) - (data (assoc-ref outputs "data")) - (unpack (assoc-ref %standard-phases 'unpack)) - (patch-source-shebangs - (assoc-ref %standard-phases 'patch-source-shebangs))) + (let* ((out (assoc-ref outputs "out")) + (share (string-append out "/share")) + (texlive-extra (assoc-ref inputs "texlive-extra-src")) + (unpack (assoc-ref %standard-phases 'unpack)) + (patch-source-shebangs + (assoc-ref %standard-phases 'patch-source-shebangs))) ;; Create symbolic links for the latex variants and their ;; man pages. (with-directory-excursion (string-append out "/bin/") (for-each symlink '("pdftex" "pdftex" "xetex" "luatex") '("latex" "pdflatex" "xelatex" "lualatex"))) - (with-directory-excursion (string-append out "/share/man/man1/") + (with-directory-excursion (string-append share "/man/man1/") (symlink "luatex.1" "lualatex.1")) - ;; Delete texmf-dist from "data", since it will be reinstalled - ;; from texlive-texmf. - (system* "rm" "-r" (string-append data "/texmf-dist")) ;; Unpack texlive-extra and install tlpkg. (mkdir "texlive-extra") (with-directory-excursion "texlive-extra" (apply unpack (list #:source texlive-extra)) (apply patch-source-shebangs (list #:source texlive-extra)) - (system* "mv" "tlpkg" data) - (chdir "..")) - ;; Unpack and install texlive-texmf. - (mkdir "texlive-texmf") - (with-directory-excursion "texlive-texmf" - (apply unpack (list #:source texlive-texmf)) - (apply patch-source-shebangs (list #:source texlive-texmf)) - ;; Register "data" for kpathsea in texmf.cnf. - (substitute* "texmf-dist/web2c/texmf.cnf" - (("TEXMFROOT = \\$SELFAUTOPARENT") - (string-append "TEXMFROOT = " data))) - (system* "mv" "texmf-dist" data) - (chdir "..")) - ;; texmf.cnf must also be placed in "out", since kpsewhich does - ;; not know about "data" until it has found this file. - (mkdir (string-append out "/share/texmf-dist")) - (mkdir (string-append out "/share/texmf-dist/web2c")) - (copy-file (string-append data "/texmf-dist/web2c/texmf.cnf") - (string-append out "/share/texmf-dist/web2c/texmf.cnf")))) - (alist-cons-after 'patch-shebangs 'texconfig - (lambda* (#:key outputs #:allow-other-keys) - (let ((out (assoc-ref outputs "out"))) - ;; Configure the texlive system; inspired from - ;; http://slackbuilds.org/repository/13.37/office/texlive/ - (setenv "PATH" (string-append (getenv "PATH") ":" out "/bin")) - (system* "updmap-sys" "--nohash" "--syncwithtrees") - (system* "mktexlsr") - (system* "fmtutil-sys" "--all"))) - %standard-phases)))) - (synopsis "Tex Live, a package of the TeX typesetting system") + (system* "mv" "tlpkg" share)))) + %standard-phases))) + (synopsis "TeX Live, a package of the TeX typesetting system") (description "TeX Live provides a comprehensive TeX document production system. It includes all the major TeX-related programs, macro packages, and fonts that are free software, including support for many languages around the -world.") +world. + +This package contains the binaries.") + (license (license:fsf-free "http://tug.org/texlive/copying.html")) + (home-page "http://www.tug.org/texlive/"))) + +(define-public texlive-texmf + (package + (name "texlive-texmf") + (version "2014") + (source texlive-texmf-src) + (build-system gnu-build-system) + (inputs + `(("texlive-bin" ,texlive-bin) + ("lua" ,lua) + ("perl" ,perl) + ("python" ,python-2) ; incompatible with Python 3 (print syntax) + ("ruby" ,ruby) + ("tcsh" ,tcsh))) + (arguments + `(#:modules ((guix build gnu-build-system) + (guix build utils) + (srfi srfi-26)) + #:imported-modules ((guix build gnu-build-system) + (guix build utils)) + #:phases + (alist-cons-before + 'texmf-config 'install + (lambda* (#:key outputs #:allow-other-keys) + (let ((share (string-append (assoc-ref outputs "out") "/share"))) + (mkdir-p share) + (system* "mv" "texmf-dist" share))) + (alist-cons-after + 'patch-source-shebangs 'texmf-config + (lambda* (#:key inputs outputs #:allow-other-keys) + (let* ((share (string-append (assoc-ref outputs "out") "/share")) + (texmfroot (string-append share "/texmf-dist/web2c")) + (texmfcnf (string-append texmfroot "/texmf.cnf")) + (texbin (string-append (assoc-ref inputs "texlive-bin") + "/bin"))) + ;; Register SHARE as TEXMFROOT in texmf.cnf. + (substitute* texmfcnf + (("TEXMFROOT = \\$SELFAUTOPARENT") + (string-append "TEXMFROOT = " share))) + ;; Configure the texmf-dist tree; inspired from + ;; http://slackbuilds.org/repository/13.37/office/texlive/ + (setenv "PATH" (string-append (getenv "PATH") ":" texbin)) + (setenv "TEXMFCNF" texmfroot) + (system* "updmap-sys" "--nohash" "--syncwithtrees") + (system* "mktexlsr") + (system* "fmtutil-sys" "--all"))) + (map (cut assq <> %standard-phases) + '(set-paths unpack patch-source-shebangs)))))) + (synopsis "TeX Live, a package of the TeX typesetting system") + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains the complete tree of texmf-dist data.") + (license (license:fsf-free "http://tug.org/texlive/copying.html")) + (home-page "http://www.tug.org/texlive/"))) + +(define-public texlive + (package + (name "texlive") + (version "2014") + (source #f) + (build-system trivial-build-system) + (inputs `(("bash" ,bash) ; for wrap-program + ("texlive-bin" ,texlive-bin) + ("texlive-texmf" ,texlive-texmf))) + (arguments + `(#:modules ((guix build utils)) + #:builder + ;; Build the union of texlive-bin and texlive-texmf, but take the + ;; conflicting subdirectory share/texmf-dist from texlive-texmf. + (begin + (use-modules (guix build utils)) + (let ((out (assoc-ref %outputs "out")) + (bin (assoc-ref %build-inputs "texlive-bin")) + (texmf (assoc-ref %build-inputs "texlive-texmf")) + (bash (assoc-ref %build-inputs "bash"))) + (mkdir out) + (with-directory-excursion out + (for-each + (lambda (name) + (symlink (string-append bin "/" name) name)) + '("include" "lib")) + (mkdir "bin") + (with-directory-excursion "bin" + (setenv "PATH" (string-append bash "/bin")) + (for-each + (lambda (name) + (symlink name (basename name)) + (wrap-program + (basename name) + `("TEXMFCNF" = + (,(string-append texmf "/share/texmf-dist/web2c"))))) + (find-files (string-append bin "/bin/") ""))) + (mkdir "share") + (with-directory-excursion "share" + (for-each + (lambda (name) + (symlink (string-append bin "/share/" name) name)) + '("info" "man" "tlpkg")) + (for-each + (lambda (name) + (symlink (string-append texmf "/share/" name) name)) + '("texmf-dist" "texmf-var")))))))) + (synopsis "TeX Live, a package of the TeX typesetting system") + (description + "TeX Live provides a comprehensive TeX document production system. +It includes all the major TeX-related programs, macro packages, and fonts +that are free software, including support for many languages around the +world. + +This package contains the complete TeX Live distribution.") (license (license:fsf-free "http://tug.org/texlive/copying.html")) (home-page "http://www.tug.org/texlive/")))