summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--gnu-system.am1
-rw-r--r--gnu/packages/cups.scm293
2 files changed, 294 insertions, 0 deletions
diff --git a/gnu-system.am b/gnu-system.am
index f29b45294e..0d627b1e71 100644
--- a/gnu-system.am
+++ b/gnu-system.am
@@ -67,6 +67,7 @@ GNU_SYSTEM_MODULES =				\
   gnu/packages/cross-base.scm			\
   gnu/packages/crypto.scm			\
   gnu/packages/cryptsetup.scm			\
+  gnu/packages/cups.scm				\
   gnu/packages/curl.scm				\
   gnu/packages/cursynth.scm			\
   gnu/packages/cyrus-sasl.scm			\
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
new file mode 100644
index 0000000000..a74e4097eb
--- /dev/null
+++ b/gnu/packages/cups.scm
@@ -0,0 +1,293 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 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 (gnu packages cups)
+  #:use-module ((guix licenses) #:prefix license:)
+  #:use-module (guix packages)
+  #:use-module (guix download)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages)
+  #:use-module (gnu packages avahi)
+  #:use-module (gnu packages compression)
+  #:use-module (gnu packages image)
+  #:use-module (gnu packages fonts) ;font-dejavu
+  #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages ghostscript)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages gnutls)
+  #:use-module (gnu packages pdf)
+  #:use-module (gnu packages pkg-config))
+
+(define-public cups-filters
+  (package
+    (name "cups-filters")
+    (version "1.0.61")
+    (source (origin
+              (method url-fetch)
+              (uri
+               (string-append "http://openprinting.org/download/cups-filters/"
+                              "cups-filters-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1bq48nnrarlbf6qc93bz1n5wlh6j420gppbck3r45sinwhz5wa7m"))
+              (modules '((guix build utils)))
+              (snippet
+               ;; install backends, banners and filters to cups-filters output
+               ;; directory, not the cups server directory
+               '(substitute* "Makefile.in"
+                  (("CUPS_DATADIR = @CUPS_DATADIR@")
+                   "CUPS_DATADIR = $(PREFIX)/share/cups")
+                  (("pkgcupsserverrootdir = \\$\\(CUPS_SERVERROOT\\)")
+                   "pkgcupsserverrootdir = $(PREFIX)")
+                  (("pkgbackenddir = \\$\\(CUPS_SERVERBIN\\)/backend")
+                   "pkgbackenddir = $(PREFIX)/backend")
+                  (("pkgfilterdir = \\$\\(CUPS_SERVERBIN\\)/filter")
+                   "pkgfilterdir = $(PREFIX)/filter")))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:make-flags (list (string-append "PREFIX=" %output))
+       #:configure-flags
+       `(,(string-append "--with-test-font-path="
+                         (assoc-ref %build-inputs "font-dejavu")
+                         "/share/fonts/truetype/DejaVuSans.ttf")
+         ,(string-append "--with-rcdir="
+                         (assoc-ref %outputs "out") "/etc/rc.d"))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("fontconfig"   ,fontconfig)
+       ("freetype"     ,freetype)
+       ("font-dejavu"  ,font-dejavu) ;needed by test suite
+       ("ghostscript"  ,ghostscript)
+       ("ijs"          ,ijs)
+       ("dbus"         ,dbus)
+       ("lcms"         ,lcms)
+       ("libjpeg-8"    ,libjpeg-8)
+       ("libpng"       ,libpng)
+       ("libtiff"      ,libtiff)
+       ("glib"         ,glib)
+       ("qpdf"         ,qpdf)
+       ("poppler"      ,poppler)
+       ("cups-minimal" ,cups-minimal)))
+    (home-page "http://www.linuxfoundation.org/collaborate/workgroups/openprinting/cups-filters")
+    (synopsis "OpenPrinting CUPS filters and backends")
+    (description
+     "Contains backends, filters, and other software that was once part of the
+core CUPS distribution but is no longer maintained by Apple Inc.  In addition
+it contains additional filters developed independently of Apple, especially
+filters for the PDF-centric printing workflow introduced by OpenPrinting.")
+    ;; Different filters and backends have different licenses; see COPYING for
+    ;; details
+    (license (list license:gpl2
+                   license:gpl2+
+                   license:gpl3
+                   license:gpl3+
+                   license:lgpl2.0+
+                   license:expat))))
+
+;; CUPS on non-MacOS systems requires cups-filters.  Since cups-filters also
+;; depends on CUPS libraries and binaries, cups-minimal has been added to
+;; satisfy this dependency.
+(define-public cups-minimal
+  (package
+    (name "cups-minimal")
+    (version "2.0.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "http://www.cups.org/software/"
+                                  version "/cups-" version "-source.tar.gz"))
+              (sha256
+               (base32
+                "1kbc85kwhm1vyzahblrg3qih9yypggs91d13gdrbnaac8q7jd9jr"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       '("--disable-launchd"
+         "--disable-systemd"
+         "--disable-avahi"
+         "--disable-dnssd")
+       ;; Seven tests fail, mostly because of files that are provided by the
+       ;; cups-filters package.
+       #:tests? #f
+       #:phases
+       (alist-cons-before
+        'configure
+        'patch-makedefs
+        (lambda _
+          (substitute* "Makedefs.in"
+            (("INITDIR.*=.*@INITDIR@") "INITDIR = @prefix@/@INITDIR@")
+            (("/bin/sh") (which "sh"))))
+        (alist-cons-before
+         'build
+         'patch-tests
+         (lambda _
+           (substitute* "test/ippserver.c"
+             (("#  else /\\* HAVE_AVAHI \\*/") "#elif defined(HAVE_AVAHI)")))
+         %standard-phases))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("zlib"  ,zlib)
+       ("gnutls" ,gnutls)))
+    (home-page "http://www.cups.org")
+    (synopsis "The Common Unix Printing System")
+    (description
+     "CUPS is a printing system that uses the Internet Printing
+Protocol (IPP).  It provides System V and BSD command-line interfaces, as well
+as a Web interface and a C programming interface to manage printers and print
+jobs.  It supports printing to both local (parallel, serial, USB) and
+networked printers, and printers can be shared from one computer to another.
+Internally, CUPS uses PostScript Printer Description (PPD) files to describe
+printer capabilities and features and a wide variety of generic and
+device-specific programs to convert and print many types of files.")
+    (license license:gpl2)))
+
+(define-public cups
+  (package (inherit cups-minimal)
+    (name "cups")
+    (arguments
+     `(;; Three tests fail:
+       ;; * two tests in ipp-1.1.test related to "RFC 2911 section 3.2.6:
+       ;;   Get-Jobs Operation"
+       ;; * test of number of error/warning messages, probably related to a
+       ;;   missing font.
+       #:tests? #f
+       #:configure-flags
+       '("--disable-launchd"
+         "--disable-systemd")
+       #:phases
+       (alist-cons-before
+        'configure
+        'patch-makedefs
+        (lambda _
+          (substitute* "Makedefs.in"
+            (("INITDIR.*=.*@INITDIR@") "INITDIR = @prefix@/@INITDIR@")
+            (("/bin/sh") (which "sh"))))
+        (alist-cons-before
+         'check
+         'patch-tests
+         (lambda _
+           (let ((filters (assoc-ref %build-inputs "cups-filters"))
+                 (catpath (string-append
+                           (assoc-ref %build-inputs "coreutils") "/bin/"))
+                 (testdir (string-append (getcwd) "/tmp/")))
+             (mkdir testdir)
+             (substitute* "test/run-stp-tests.sh"
+               ((" *BASE=/tmp/") (string-append "BASE=" testdir))
+
+               ;; allow installation of filters from output dir and from
+               ;; cups-filters
+               (("for dir in /usr/libexec/cups/filter /usr/lib/cups/filter")
+                (string-append
+                 "for dir in "
+                 (assoc-ref %outputs "out") "/lib/cups/filter "
+                 filters "/filter"))
+
+               ;; check for charsets in cups-filters output
+               (("/usr/share/cups/charsets")
+                (string-append filters "/share/cups/charsets"))
+
+               ;; install additional required filters
+               (("instfilter texttopdf texttopdf pdf")
+                (string-append
+                 "instfilter texttopdf texttopdf pdf;"
+                 "instfilter imagetoraster imagetoraster raster;"
+                 "instfilter gstoraster gstoraster raster;"
+                 "instfilter urftopdf urftopdf pdf;"
+                 "instfilter rastertopdf rastertopdf pdf;"
+                 "instfilter pstopdf pstopdf pdf"))
+
+               ;; specify location of lpstat binary
+               (("description=\"`lpstat -l")
+                "description=\"`../systemv/lpstat -l")
+
+               ;; patch shebangs of embedded scripts
+               (("#!/bin/sh") (string-append "#!" (which "sh")))
+
+               ;; also link mime definitions from cups-filters
+               ;; to enable the additional filters for the test suite
+               (("ln -s \\$root/conf/mime\\.types")
+                (string-append
+                 "ln -s " filters
+                 "/share/cups/mime/cupsfilters.types $BASE/share/mime; "
+                 "ln -s $root/conf/mime.types"))
+               (("ln -s \\$root/conf/mime\\.convs")
+                (string-append
+                 "ln -s " filters
+                 "/share/cups/mime/cupsfilters.convs $BASE/share/mime; "
+                 "ln -s $root/conf/mime.convs")))
+
+             ;; fix search path for "cat"
+             (substitute* "cups/testfile.c"
+               (("cupsFileFind\\(\"cat\", \"/bin\"")
+                (string-append "cupsFileFind(\"cat\", \"" catpath "\""))
+               (("cupsFileFind\\(\"cat\", \"/bin:/usr/bin\"")
+                (string-append "cupsFileFind(\"cat\", \"" catpath "\"")))))
+         (alist-cons-after
+          'install
+          'install-cups-filters-symlinks
+          (lambda* (#:key inputs outputs #:allow-other-keys)
+            (let ((out (assoc-ref outputs "out"))
+                  (cups-filters (assoc-ref inputs "cups-filters")))
+              ;; charsets
+              (symlink
+               (string-append cups-filters "/share/cups/charsets")
+               (string-append out "/share/charsets"))
+
+              ;; mime types, driver file, ppds
+              (for-each
+               (lambda (f)
+                 (symlink (string-append cups-filters f)
+                          (string-append out f)))
+               '("/share/cups/mime/cupsfilters.types"
+                 "/share/cups/mime/cupsfilters.convs"
+                 "/share/cups/drv/cupsfilters.drv"
+                 "/share/ppd"))
+
+              ;; filters
+              (for-each
+               (lambda (f)
+                 (symlink f
+                          (string-append out "/lib/cups/filter" (basename f))))
+               (find-files (string-append cups-filters "/filter") ".*"))
+
+              ;; backends
+              (for-each
+               (lambda (f)
+                 (symlink (string-append cups-filters f)
+                          (string-append out "/lib/cups" f)))
+               '("/backend/parallel"
+                 "/backend/serial"))
+
+              ;; banners
+              (let ((banners "/share/cups/banners"))
+                (delete-file-recursively (string-append out banners))
+                (symlink (string-append cups-filters banners)
+                         (string-append out banners)))
+
+              ;; assorted data
+              (let ((data "/share/cups/data"))
+                (delete-file-recursively (string-append out data))
+                (symlink (string-append cups-filters data)
+                         (string-append out data)))))
+          %standard-phases)))))
+    (inputs
+     `(("avahi" ,avahi)
+       ("gnutls" ,gnutls)
+       ("cups-filters" ,cups-filters)
+       ("zlib"  ,zlib)))))