Attached is a more comprehensive patch set to add CUPS.

CUPS on non-MacOS systems depends on cups-filters, which in turn depends
on QPDF and IJS.

* QPDF is added by the first patch.

* IJS is part of ghostscript, but for some reason is not built even when
  passing "--with-ijs" as a configure flag.  There is no configure
  script and no usable Makefile in ./ijs, so we actually have to run
  ./autogen.sh after generating macros that work with libtool 2.4.2.
  The second patch adds a new very ugly phase that does just that.  I'd
  love to change this if someone can come up with a better way to do
  this.

* cups-filters also depends on CUPS libraries and binaries, so
  cups-minimal has been added to satisfy this dependency.  During
  installation, cups-filters attempts to install files to the CUPS
  package output directory.  The install phase is modified to direct the
  files to the output directory of cups-filters.

* the CUPS package itself then adds links to the required files in
  cups-filters.  CUPS does not come with a mechanism to load filters,
  backends, charsets, mime files, etc from alternative directories, so I
  chose to use symlinks.

* the CUPS tests are run before the installation of any symlinks, so to
  establish a working test environment quite a lot of fixes to the test
  phase are needed.  Without the files from cups-filters seven tests
  fail.  With the files in place only three tests fail.  I have not been
  able to fix these remaining failures, even though I have been trying
  for a long time.

I have addressed your previous comments about outputs and the CUPS
license (gpl2 instead of gpl2+).

Thanks in advance for your review!

-- Ricardo

>From 8e671fdd888bf9548bf52acf8789500c90d4b072 Mon Sep 17 00:00:00 2001
From: Ricardo Wurmus <ricardo.wur...@mdc-berlin.de>
Date: Wed, 7 Jan 2015 17:49:00 +0100
Subject: [PATCH 1/3] gnu: Add QPDF.

* gnu/packages/pdf.scm (qpdf): New variable.
---
 gnu/packages/pdf.scm | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/gnu/packages/pdf.scm b/gnu/packages/pdf.scm
index 0f9098d..02b55ac 100644
--- a/gnu/packages/pdf.scm
+++ b/gnu/packages/pdf.scm
@@ -37,6 +37,8 @@
   #:use-module (gnu packages gtk)
   #:use-module (gnu packages lua)
   #:use-module (gnu packages curl)
+  #:use-module (gnu packages pcre)
+  #:use-module (gnu packages perl)
   #:use-module (srfi srfi-1))
 
 (define-public poppler
@@ -238,3 +240,43 @@ The library ships with a rudimentary X11 viewer, and a set of command
 line tools for batch rendering (pdfdraw), examining the file structure
 (pdfshow), and rewriting files (pdfclean).")
     (license license:agpl3+)))
+
+(define-public qpdf
+  (package
+   (name "qpdf")
+   (version "5.1.2")
+   (source (origin
+            (method url-fetch)
+            (uri (string-append "mirror://sourceforge/qpdf/qpdf-"
+                                version ".tar.gz"))
+            (sha256 (base32
+                     "1zbvhrp0zjzbi6q2bnbxbg6399r47pq5gw3kspzph81j19fqvpg9"))))
+   (build-system gnu-build-system)
+   (arguments
+      '(#:phases (alist-cons-before
+                  'configure 'patch-paths
+                  (lambda _
+                    (substitute* "make/libtool.mk"
+                      (("SHELL=/bin/bash")
+                       (string-append "SHELL=" (which "bash"))))
+                    (substitute* (append
+                                  '("qtest/bin/qtest-driver")
+                                  (find-files "." "\\.test"))
+                      (("/usr/bin/env") (which "env"))))
+                  %standard-phases)))
+   (native-inputs
+    `(("pkg-config" ,pkg-config)))
+   (propagated-inputs
+    `(("pcre" ,pcre)))
+   (inputs
+    `(("zlib" ,zlib)
+      ("perl" ,perl)))
+   (synopsis "Command-line tools and library for transforming PDF files")
+   (description
+    "QPDF is a command-line program that does structural, content-preserving
+transformations on PDF files.  It could have been called something like
+pdf-to-pdf.  It includes support for merging and splitting PDFs and to
+manipulate the list of pages in a PDF file.  It is not a PDF viewer or a
+program capable of converting PDF into other formats.")
+   (license license:clarified-artistic)
+   (home-page "http://qpdf.sourceforge.net/";)))
-- 
1.9.3

>From 36eac76f1aa129f2e22d4341fe4d64d4c5b8fd0a Mon Sep 17 00:00:00 2001
From: Ricardo Wurmus <ricardo.wur...@mdc-berlin.de>
Date: Fri, 9 Jan 2015 15:19:54 +0100
Subject: [PATCH 2/3] gnu: ghostscript: build IJS library

* gnu/packages/ghostscript.scm (ghostscript): build and install IJS library
  and header files.
---
 gnu/packages/ghostscript.scm | 61 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 49 insertions(+), 12 deletions(-)

diff --git a/gnu/packages/ghostscript.scm b/gnu/packages/ghostscript.scm
index 405b4e7..bef0551 100644
--- a/gnu/packages/ghostscript.scm
+++ b/gnu/packages/ghostscript.scm
@@ -1,6 +1,7 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2013 Andreas Enge <andr...@enge.fr>
 ;;; Copyright © 2014 Mark H Weaver <m...@netris.org>
+;;; Copyright © 2015 Ricardo Wurmus <rek...@elephly.net>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -19,6 +20,7 @@
 
 (define-module (gnu packages ghostscript)
   #:use-module (gnu packages)
+  #:use-module (gnu packages autotools)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages fontutils)
   #:use-module (gnu packages image)
@@ -135,12 +137,17 @@ printing, and psresize, for adjusting page sizes.")
              ("libtiff" ,libtiff)
              ("zlib" ,zlib)))
    (native-inputs
-      `(("perl" ,perl)
-        ("pkg-config" ,pkg-config) ; needed to find libtiff
-        ("python" ,python-wrapper)
-        ("tcl" ,tcl)))
+    `(("perl"       ,perl)
+      ("libtool"    ,libtool "bin")
+      ("libtool"    ,libtool "out")
+      ("automake"   ,automake)
+      ("autoconf"   ,autoconf)
+      ("pkg-config" ,pkg-config) ; needed to find libtiff
+      ("python"     ,python-wrapper)
+      ("tcl"        ,tcl)))
    (arguments
-    `(#:phases
+    `(#:configure-flags '("--with-ijs")
+      #:phases
       (alist-cons-after
        'configure 'patch-config-files
        (lambda _
@@ -148,13 +155,43 @@ printing, and psresize, for adjusting page sizes.")
            (("/bin/sh") (which "bash")))
          (substitute* "base/unixhead.mak"
            (("/bin/sh") (which "bash"))))
-      (alist-cons-after
-       'build 'build-so
-       (lambda _ (system* "make" "so"))
-      (alist-cons-after
-       'install 'install-so
-       (lambda _ (system* "make" "install-so"))
-      %standard-phases)))))
+       (alist-cons-after
+        'build 'install-ijs-so
+        (lambda* (#:key outputs #:allow-other-keys)
+          ;; need to regenerate macros
+          (system* "autoreconf" "-if")
+          (substitute* "autogen.sh"
+            (("\\$srcdir/configure") (string-append (which "bash") " $srcdir/configure")))
+          (system* "bash" "autogen.sh")
+
+          ;; build and install ijs
+          (with-directory-excursion "ijs"
+            (substitute* "autogen.sh"
+              (("/bin/sh") (which "bash")))
+            (system* "bash" "autogen.sh")
+            (substitute* "configure"
+              (("/bin/sh") (which "bash")))
+            (setenv "SHELL" (which "sh"))
+            (setenv "CONFIG_SHELL" (which "sh"))
+            (system* "./configure" (string-append "--prefix=" (assoc-ref outputs "out")))
+            (system* "make")
+            (zero? (system* "make" "install"))))
+         (alist-cons-after
+          'build 'build-so
+          (lambda _ (system* "make" "so"))
+          (alist-cons-after
+           'install 'install-so
+           (lambda _ (system* "make" "install-so"))
+           (alist-cons-after
+            'install 'install-ijs-headers
+            (lambda _
+              (let* ((out        (assoc-ref %outputs "out"))
+                     (ijsinclude (string-append out "/include/ijs/")))
+                (mkdir-p ijsinclude)
+                (for-each (lambda (file)
+                            (copy-file file (string-append ijsinclude (basename file))))
+                          (find-files "ijs/" "\\.h$"))))
+            %standard-phases)))))))
    (synopsis "PostScript and PDF interpreter")
    (description
     "Ghostscript is an interpreter for the PostScript language and the PDF
-- 
1.9.3

>From d42e6a3233b7c5142d1c91d8c2b1c751b74bd444 Mon Sep 17 00:00:00 2001
From: Ricardo Wurmus <ricardo.wur...@mdc-berlin.de>
Date: Mon, 5 Jan 2015 13:56:51 +0100
Subject: [PATCH 3/3] 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 | 311 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 312 insertions(+)
 create mode 100644 gnu/packages/cups.scm

diff --git a/gnu-system.am b/gnu-system.am
index 02da1bf..456e204 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 0000000..4188d28
--- /dev/null
+++ b/gnu/packages/cups.scm
@@ -0,0 +1,311 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2015 Ricardo Wurmus <rek...@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"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       `(,(string-append "--with-test-font-path="
+                         (assoc-ref %build-inputs "font-dejavu")
+                         "/share/fonts/truetype/DejaVuSans.ttf")
+         "--with-gnu-ld"
+         "--disable-static"
+         ,(string-append "--with-rcdir=" (assoc-ref %outputs "out") "/etc/rc.d"))
+       #:phases
+       (alist-cons-before
+        'configure
+        'patch-target-dirs
+        (lambda _
+          (let ((out (assoc-ref %outputs "out")))
+            ;; install backends, banners and filters to cups-filters output
+            ;; directory, not the cups server directory
+            (substitute* "Makefile.in"
+              (("CUPS_DATADIR = @CUPS_DATADIR@")
+               (string-append "CUPS_DATADIR = " out "/share/cups"))
+              (("pkgcupsserverrootdir = \\$\\(CUPS_SERVERROOT\\)")
+               (string-append "pkgcupsserverrootdir = " out))
+              (("pkgbackenddir = \\$\\(CUPS_SERVERBIN\\)/backend")
+               (string-append "pkgbackenddir = "
+                              out
+                              "/backend"))
+              (("pkgfilterdir = \\$\\(CUPS_SERVERBIN\\)/filter")
+               (string-append "pkgfilterdir = "
+                              out
+                              "/filter")))))
+        %standard-phases)))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("fontconfig"   ,fontconfig)
+       ("freetype"     ,freetype)
+       ("font-dejavu"  ,font-dejavu) ;needed by test suite
+       ("ghostscript"  ,ghostscript)
+       ("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.")
+    ;; see COPYING for details
+    (license (list license:gpl2
+                   license:gpl2+
+                   license:gpl3
+                   license:gpl3+
+                   license:lgpl2.0+
+                   license:expat))))
+
+(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 "CUPS printing system")
+    (description
+     "CUPS printing system provides a portable printing layer for UNIX®
+operating systems.  It has been developed by Apple Inc. to promote a standard
+printing solution for all UNIX vendors and users.  CUPS provides the System V
+and Berkeley command-line interfaces.")
+    (license license:gpl2)))
+
+(define-public cups
+  (package
+    (name "cups")
+    (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
+     `(;; 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 ((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" " "
+                 (assoc-ref %build-inputs "cups-filters") "/filter"))
+
+               ;; check for charsets in cups-filters output
+               (("/usr/share/cups/charsets")
+                (string-append
+                 (assoc-ref %build-inputs "cups-filters") "/share/cups/charsets"))
+
+               ;; install additional required filters
+               (("instfilter texttopdf texttopdf pdf")
+                "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")
+
+               ;(("/usr") (assoc-ref %outputs "out"))
+
+               ;; 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 "
+                               (assoc-ref %build-inputs "cups-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 "
+                               (assoc-ref %build-inputs "cups-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"))
+
+              ;; driver file
+              (symlink (string-append cups-filters "/share/cups/drv/cupsfilters.drv")
+                       (string-append out "/share/cups/drv/cupsfilters.drv"))
+
+              ;; ppds
+              (symlink (string-append cups-filters "/share/ppd")
+                       (string-append out "/share/ppd"))
+
+              ;; mime types
+              (for-each
+               (lambda (f)
+                 (symlink (string-append cups-filters f)
+                          (string-append out f)))
+               '("/share/cups/mime/cupsfilters.types"
+                 "/share/cups/mime/cupsfilters.convs"))
+
+              ;; 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"))
+                (system* "rm" "-rf" (string-append out banners))
+                (symlink (string-append cups-filters banners)
+                         (string-append out banners)))
+
+              ;; assorted data
+              (let ((data "/share/cups/data"))
+                (system* "rm" "-rf" (string-append out data))
+                (symlink (string-append cups-filters data)
+                         (string-append out data)))))
+          %standard-phases)))))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (inputs
+     `(("avahi" ,avahi)
+       ("gnutls" ,gnutls)
+       ("cups-filters" ,cups-filters)
+       ("zlib"  ,zlib)))
+    (home-page "http://www.cups.org";)
+    (synopsis "CUPS printing system")
+    (description
+     "CUPS printing system provides a portable printing layer for UNIX®
+operating systems.  It has been developed by Apple Inc. to promote a standard
+printing solution for all UNIX vendors and users.  CUPS provides the System V
+and Berkeley command-line interfaces.")
+    (license license:gpl2)))
-- 
1.9.3

Reply via email to