From 510023184aaea1ea42b999fa6219bc73809da383 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Mon, 5 Jan 2015 13:56:51 +0100 Subject: [PATCH] gnu: Add CUPS. * gnu/packages/cups.scm: New file. * gnu-system.am (GNU_SYSTEM_MODULES): Add it. --- gnu-system.am | 1 + gnu/packages/cups.scm | 293 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 294 insertions(+) create mode 100644 gnu/packages/cups.scm 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 +;;; +;;; 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 . + +(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)))))