~ruther/guix-local

298d0d381e8eecbf2e14a996d43efd4f2f316e36 — Maxim Cournoyer 3 years ago da923bc
gnu: hplip: Use gexps.

* gnu/packages/cups.scm (hplip) [arguments]: Use gexps.
* gnu/packages/cups.scm (hplip-minimal): Likewise.
1 files changed, 119 insertions(+), 127 deletions(-)

M gnu/packages/cups.scm
M gnu/packages/cups.scm => gnu/packages/cups.scm +119 -127
@@ 542,127 542,119 @@ should only be used as part of the Guix cups-pk-helper service.")
    (outputs (list "out" "ppd"))
    (build-system gnu-build-system)
    (arguments
     `(#:imported-modules ((guix build python-build-system)
     (list
      #:imported-modules `((guix build python-build-system)
                           ,@%gnu-build-system-modules)
       #:modules ((guix build gnu-build-system)
      #:modules '((guix build gnu-build-system)
                  (guix build utils)
                  ((guix build python-build-system) #:prefix python:))
       #:configure-flags
       `("--disable-imageProcessor-build"
         "--disable-network-build"
         ,(string-append "--prefix=" (assoc-ref %outputs "out"))
         ,(string-append "--sysconfdir=" (assoc-ref %outputs "out") "/etc")
         ,(string-append "LDFLAGS=-Wl,-rpath="
                         (assoc-ref %outputs "out") "/lib")
         ;; Disable until mime.types merging works (FIXME).
         "--disable-fax-build"
         "--enable-new-hpcups"
         ;; TODO add foomatic drv install eventually.
         ;; TODO --enable-policykit eventually.
         ,(string-append "--with-cupsfilterdir="
                         (assoc-ref %outputs "out") "/lib/cups/filter")
         ,(string-append "--with-cupsbackenddir="
                         (assoc-ref %outputs "out") "/lib/cups/backend")
         ,(string-append "--with-hpppddir="
                         (assoc-ref %outputs "ppd") "/share/ppd/HP")
         ,(string-append "--with-icondir="
                         (assoc-ref %outputs "out") "/share/applications")
         ,(string-append "--with-systraydir="
                         (assoc-ref %outputs "out") "/etc/xdg")
         "--enable-qt5" "--disable-qt4")
       #:phases
       (modify-phases %standard-phases
         (add-after 'unpack 'fix-hard-coded-file-names
           (lambda* (#:key inputs outputs #:allow-other-keys)
             (let ((out (assoc-ref outputs "out"))
                   ;; FIXME: use merged ppds (I think actually only
                   ;; drvs need to be merged).
                   (cupsdir (assoc-ref inputs "cups-minimal")))
               (substitute* (find-files "." "\\.py$")
                 ;; Refer to the correct default configuration file name.
                 (("/etc/hp/hplip.conf")
                  (string-append out "/etc/hp/hplip.conf")))
               (substitute* "base/g.py"
                 (("'/usr/share;[^']*'")
                  (string-append "'" cupsdir "/share'"))
                 (("'/etc/hp/hplip.conf'")
                  (string-append "'" out
                                 "/etc/hp/hplip.conf" "'")))

               (substitute* "Makefile.in"
                 (("[[:blank:]]check-plugin\\.py[[:blank:]]") " ")
                 ;; FIXME Use beginning-of-word in regexp.
                 (("[[:blank:]]plugin\\.py[[:blank:]]") " ")
                 (("/usr/include/libusb-1.0")
                  (search-input-directory inputs "/include/libusb-1.0"))
                 (("hplip_statedir =.*$")
                  ;; Don't bail out while trying to create
                  ;; /var/lib/hplip.  We can safely change its value
                  ;; here because it's hard-coded in the code anyway.
                  "hplip_statedir = $(prefix)\n")
                 (("hplip_confdir = /etc/hp")
                  ;; This is only used for installing the default config.
                  (string-append "hplip_confdir = " out
                                 "/etc/hp"))
                 (("halpredir = /usr/share/hal/fdi/preprobe/10osvendor")
                  ;; We don't use hal.
                  (string-append "halpredir = " out
                                 "/share/hal/fdi/preprobe/10osvendor"))
                 (("rulesdir = /etc/udev/rules.d")
                  ;; udev rules will be merged by base service.
                  (string-append "rulesdir = " out
                                 "/lib/udev/rules.d"))
                 (("rulessystemdir = /usr/lib/systemd/system")
                  ;; We don't use systemd.
                  (string-append "rulessystemdir = " out
                                 "/lib/systemd/system"))
                 (("/etc/sane.d")
                  (string-append out "/etc/sane.d"))))))
         (add-before 'configure 'fix-build-with-python-3.8
           (lambda* (#:key inputs #:allow-other-keys)
             (let ((python (assoc-ref inputs "python")))
               ;; XXX: The configure script looks for Python headers in the
               ;; wrong places as of version 3.20.3.  Help it by adding the
               ;; include directory on C_INCLUDE_PATH.
               (when python
                 (setenv "C_INCLUDE_PATH"
                         (string-append python "/include/python"
                                        (python:python-version python)
                                        ":" (getenv "C_INCLUDE_PATH")))))))
         (add-after 'install 'install-models-dat
           (lambda* (#:key outputs #:allow-other-keys)
             (let* ((out (assoc-ref outputs "out"))
                    (models-dir (string-append out
                                               "/share/hplip/data/models")))
               (install-file "data/models/models.dat" models-dir))))
         (add-after 'install 'wrap-binaries
           ;; Scripts in /bin are all symlinks to .py files in /share/hplip.
           ;; Symlinks are immune to the Python build system's 'WRAP phase,
           ;; and the .py files can't be wrapped because they are reused as
           ;; modules.  Replacing the symlinks in /bin with copies and
           ;; wrapping them also doesn't work (“ModuleNotFoundError:
           ;; No module named 'base'”).  Behold: a custom WRAP-PROGRAM.
           (lambda* (#:key inputs outputs #:allow-other-keys)
             (let* ((out (assoc-ref outputs "out"))
                    (bin (string-append out "/bin"))
                    (site (python:site-packages inputs outputs)))
               (with-directory-excursion bin
                 (for-each (lambda (file)
                             (let ((target (readlink file)))
                               (delete-file file)
                               (with-output-to-file file
                                 (lambda _
                                   (format #t
                                           "#!~a~@
      #:configure-flags
      #~(list "--disable-imageProcessor-build"
              "--disable-network-build"
              (string-append "--prefix=" #$output)
              (string-append "--sysconfdir=" #$output "/etc")
              (string-append "LDFLAGS=-Wl,-rpath=" #$output "/lib")
              ;; Disable until mime.types merging works (FIXME).
              "--disable-fax-build"
              "--enable-new-hpcups"
              ;; TODO add foomatic drv install eventually.
              ;; TODO --enable-policykit eventually.
              (string-append "--with-cupsfilterdir=" #$output
                             "/lib/cups/filter")
              (string-append "--with-cupsbackenddir=" #$output
                             "/lib/cups/backend")
              (string-append "--with-hpppddir=" #$output:ppd "/share/ppd/HP")
              (string-append "--with-icondir=" #$output "/share/applications")
              (string-append "--with-systraydir=" #$output "/etc/xdg")
              "--enable-qt5"
              "--disable-qt4")
      #:phases
      #~(modify-phases %standard-phases
          (add-after 'unpack 'fix-hard-coded-file-names
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let ((out #$output)
                    ;; FIXME: use merged ppds (I think actually only
                    ;; drvs need to be merged).
                    (cupsdir #$(this-package-input "cups-minimal")))
                (substitute* (find-files "." "\\.py$")
                  ;; Refer to the correct default configuration file name.
                  (("/etc/hp/hplip.conf")
                   (string-append out "/etc/hp/hplip.conf")))
                (substitute* "base/g.py"
                  (("'/usr/share;[^']*'")
                   (string-append "'" cupsdir "/share'"))
                  (("'/etc/hp/hplip.conf'")
                   (string-append "'" out "/etc/hp/hplip.conf" "'")))

                (substitute* "Makefile.in"
                  (("[[:blank:]]check-plugin\\.py[[:blank:]]") " ")
                  ;; FIXME Use beginning-of-word in regexp.
                  (("[[:blank:]]plugin\\.py[[:blank:]]") " ")
                  (("/usr/include/libusb-1.0")
                   (search-input-directory inputs "/include/libusb-1.0"))
                  (("hplip_statedir =.*$")
                   ;; Don't bail out while trying to create
                   ;; /var/lib/hplip.  We can safely change its value
                   ;; here because it's hard-coded in the code anyway.
                   "hplip_statedir = $(prefix)\n")
                  (("hplip_confdir = /etc/hp")
                   ;; This is only used for installing the default config.
                   (string-append "hplip_confdir = " out "/etc/hp"))
                  (("halpredir = /usr/share/hal/fdi/preprobe/10osvendor")
                   ;; We don't use hal.
                   (string-append "halpredir = " out
                                  "/share/hal/fdi/preprobe/10osvendor"))
                  (("rulesdir = /etc/udev/rules.d")
                   ;; udev rules will be merged by base service.
                   (string-append "rulesdir = " out "/lib/udev/rules.d"))
                  (("rulessystemdir = /usr/lib/systemd/system")
                   ;; We don't use systemd.
                   (string-append "rulessystemdir = " out "/lib/systemd/system"))
                  (("/etc/sane.d")
                   (string-append out "/etc/sane.d"))))))
          (add-before 'configure 'fix-build-with-python-3.8
            (lambda* (#:key inputs #:allow-other-keys)
              (let ((python (assoc-ref inputs "python")))
                ;; XXX: The configure script looks for Python headers in the
                ;; wrong places as of version 3.20.3.  Help it by adding the
                ;; include directory on C_INCLUDE_PATH.
                (when python
                  (setenv "C_INCLUDE_PATH"
                          (string-append python "/include/python"
                                         (python:python-version python)
                                         ":" (getenv "C_INCLUDE_PATH")))))))
          (add-after 'install 'install-models-dat
            (lambda* (#:key outputs #:allow-other-keys)
              (install-file "data/models/models.dat"
                            (string-append #$output "/share/hplip/data/models"))))
          (add-after 'install 'wrap-binaries
            ;; Scripts in /bin are all symlinks to .py files in /share/hplip.
            ;; Symlinks are immune to the Python build system's 'WRAP phase,
            ;; and the .py files can't be wrapped because they are reused as
            ;; modules.  Replacing the symlinks in /bin with copies and
            ;; wrapping them also doesn't work (“ModuleNotFoundError:
            ;; No module named 'base'”).  Behold: a custom WRAP-PROGRAM.
            (lambda* (#:key inputs outputs #:allow-other-keys)
              (let* ((out (assoc-ref outputs "out"))
                     (bin (string-append out "/bin"))
                     (site (python:site-packages inputs outputs)))
                (with-directory-excursion bin
                  (for-each (lambda (file)
                              (let ((target (readlink file)))
                                (delete-file file)
                                (with-output-to-file file
                                  (lambda _
                                    (format #t
                                            "#!~a~@
                                           export GUIX_PYTHONPATH=\"~a:~a\"~@
                                           exec -a \"$0\" \"~a/~a\" \"$@\"~%"
                                           (which "bash")
                                           site
                                           (getenv "GUIX_PYTHONPATH")
                                           bin target)))
                               (chmod file #o755)))
                           (find-files "." (lambda (file stat)
                                             (eq? 'symlink (stat:type stat))))))))))))
                                            (which "bash")
                                            site
                                            (getenv "GUIX_PYTHONPATH")
                                            bin target)))
                                (chmod file #o755)))
                            (find-files "." (lambda (file stat)
                                              (eq? 'symlink (stat:type stat))))))))))))
    ;; Note that the error messages printed by the tools in the case of
    ;; missing dependencies are often downright misleading.
    ;; TODO: hp-toolbox still fails to start with:


@@ 694,17 686,17 @@ should only be used as part of the Guix cups-pk-helper service.")
  (package/inherit hplip
    (name "hplip-minimal")
    (arguments
      (substitute-keyword-arguments (package-arguments hplip)
        ((#:configure-flags cf)
         ;; Produce a "light build", meaning that only the printer (CUPS) and
         ;; scanner (SANE) support gets built, without all the 'hp-*'
         ;; command-line tools.
         `(cons "--enable-lite-build"
                (delete "--enable-qt5" ,cf)))
        ((#:phases phases)
         ;; The 'wrap-binaries' is not needed here since the 'hp-*' programs
         ;; are not installed.
         `(alist-delete 'wrap-binaries ,phases))))
     (substitute-keyword-arguments (package-arguments hplip)
       ((#:configure-flags cf)
        ;; Produce a "light build", meaning that only the printer (CUPS) and
        ;; scanner (SANE) support gets built, without all the 'hp-*'
        ;; command-line tools.
        #~(cons "--enable-lite-build"
                (delete "--enable-qt5" #$cf)))
       ((#:phases phases)
        ;; The 'wrap-binaries' is not needed here since the 'hp-*' programs
        ;; are not installed.
        #~(alist-delete 'wrap-binaries #$phases))))
    (inputs (remove (match-lambda
                      ((label . _)
                       (string-prefix? "python" label)))