summary refs log tree commit diff
path: root/guix/build-system/texlive.scm
diff options
context:
space:
mode:
authorRicardo Wurmus <rekado@elephly.net>2017-06-09 11:46:14 +0200
committerRicardo Wurmus <rekado@elephly.net>2017-06-15 17:03:16 +0200
commit205794c8684076696a3e474a6c9f6d53460b744d (patch)
tree81e5396e2e2705ffa1c9f2fb72e6f090dd5cd658 /guix/build-system/texlive.scm
parent010f476fda242aa6f05384aee88ba7d37979213f (diff)
downloadguix-205794c8684076696a3e474a6c9f6d53460b744d.tar.gz
build-system: Add 'texlive-build-system'.
* guix/build-system/texlive.scm: New file.
* guix/build/texlive-build-system.scm: New file.
* Makefile.am (MODULES): Add them.
* doc/guix.texi (Build Systems): Document it.
* gnu/packages/tex.scm (%texlive-tag, %texlive-revision): Remove variables.
(texlife-ref): Remove procedure.
Diffstat (limited to 'guix/build-system/texlive.scm')
-rw-r--r--guix/build-system/texlive.scm164
1 files changed, 164 insertions, 0 deletions
diff --git a/guix/build-system/texlive.scm b/guix/build-system/texlive.scm
new file mode 100644
index 0000000000..d4085ea7e8
--- /dev/null
+++ b/guix/build-system/texlive.scm
@@ -0,0 +1,164 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (guix build-system texlive)
+  #:use-module (guix store)
+  #:use-module (guix utils)
+  #:use-module (guix packages)
+  #:use-module (guix derivations)
+  #:use-module (guix search-paths)
+  #:use-module (guix build-system)
+  #:use-module (guix build-system gnu)
+  #:use-module (guix svn-download)
+  #:use-module (ice-9 match)
+  #:export (%texlive-build-system-modules
+            texlive-build
+            texlive-build-system
+            texlive-ref
+            %texlive-tag
+            %texlive-revision))
+
+;; Commentary:
+;;
+;; Standard build procedure for Texlive packages.
+;;
+;; Code:
+
+;; These variables specify the SVN tag and the matching SVN revision.
+(define %texlive-tag "texlive-2017.0")
+(define %texlive-revision 44445)
+
+(define (texlive-ref component id)
+  "Return a <svn-reference> object for the package ID, which is part of the
+given Texlive COMPONENT."
+  (svn-reference
+   (url (string-append "svn://www.tug.org/texlive/tags/"
+                       %texlive-tag "/Master/texmf-dist/"
+                       "source/" component "/" id))
+   (revision %texlive-revision)))
+
+(define %texlive-build-system-modules
+  ;; Build-side modules imported by default.
+  `((guix build texlive-build-system)
+    ,@%gnu-build-system-modules))
+
+(define (default-texlive-bin)
+  "Return the default texlive-bin package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((tex-mod (resolve-interface '(gnu packages tex))))
+    (module-ref tex-mod 'texlive-bin)))
+
+(define (default-texlive-latex-base)
+  "Return the default texlive-latex-base package."
+  ;; Lazily resolve the binding to avoid a circular dependency.
+  (let ((tex-mod (resolve-interface '(gnu packages tex))))
+    (module-ref tex-mod 'texlive-latex-base)))
+
+(define* (lower name
+                #:key
+                source inputs native-inputs outputs
+                system target
+                (texlive-latex-base (default-texlive-latex-base))
+                (texlive-bin (default-texlive-bin))
+                #:allow-other-keys
+                #:rest arguments)
+  "Return a bag for NAME."
+  (define private-keywords
+    '(#:source #:target #:inputs #:native-inputs
+      #:texlive-latex-base #:texlive-bin))
+
+  (bag
+    (name name)
+    (system system)
+    (host-inputs `(,@(if source
+                         `(("source" ,source))
+                         '())
+                   ,@inputs
+
+                   ;; Keep the standard inputs of 'gnu-build-system'.
+                   ,@(standard-packages)))
+    (build-inputs `(("texlive-bin" ,texlive-bin)
+                    ("texlive-latex-base" ,texlive-latex-base)
+                    ,@native-inputs))
+    (outputs outputs)
+    (build texlive-build)
+    (arguments (strip-keyword-arguments private-keywords arguments))))
+
+(define* (texlive-build store name inputs
+                        #:key
+                        (tests? #f)
+                        tex-directory
+                        (build-targets #f)
+                        (tex-format "luatex")
+                        (phases '(@ (guix build texlive-build-system)
+                                    %standard-phases))
+                        (outputs '("out"))
+                        (search-paths '())
+                        (system (%current-system))
+                        (guile #f)
+                        (substitutable? #t)
+                        (imported-modules %texlive-build-system-modules)
+                        (modules '((guix build texlive-build-system)
+                                   (guix build utils))))
+  "Build SOURCE with INPUTS."
+  (define builder
+    `(begin
+       (use-modules ,@modules)
+       (texlive-build #:name ,name
+                      #:source ,(match (assoc-ref inputs "source")
+                                       (((? derivation? source))
+                                        (derivation->output-path source))
+                                       ((source)
+                                        source)
+                                       (source
+                                        source))
+                      #:tex-directory ,tex-directory
+                      #:build-targets ,build-targets
+                      #:tex-format ,tex-format
+                      #:system ,system
+                      #:tests? ,tests?
+                      #:phases ,phases
+                      #:outputs %outputs
+                      #:search-paths ',(map search-path-specification->sexp
+                                            search-paths)
+                      #:inputs %build-inputs)))
+
+  (define guile-for-build
+    (match guile
+      ((? package?)
+       (package-derivation store guile system #:graft? #f))
+      (#f                               ; the default
+       (let* ((distro (resolve-interface '(gnu packages commencement)))
+              (guile  (module-ref distro 'guile-final)))
+         (package-derivation store guile system #:graft? #f)))))
+
+  (build-expression->derivation store name builder
+                                #:inputs inputs
+                                #:system system
+                                #:modules imported-modules
+                                #:outputs outputs
+                                #:guile-for-build guile-for-build
+                                #:substitutable? substitutable?))
+
+(define texlive-build-system
+  (build-system
+    (name 'texlive)
+    (description "The build system for TeX Live packages")
+    (lower lower)))
+
+;;; texlive.scm ends here