summary refs log tree commit diff
diff options
context:
space:
mode:
authorTobias Geerinckx-Rice <me@tobias.gr>2019-11-07 14:27:23 +0100
committerTobias Geerinckx-Rice <me@tobias.gr>2019-11-08 00:23:34 +0100
commitfbaa66ac2d7c246121ffa29c4292ac225f50decb (patch)
tree6b0bf13f0c3d70c976e37a750439e314815fb07b
parent119d6ff6a907d30f7b2848a9a0bea150772faf5a (diff)
downloadguix-fbaa66ac2d7c246121ffa29c4292ac225f50decb.tar.gz
gnu: hplip: Actually wrap binaries.
* gnu/packages/cups.scm (hplip)[arguments]: Reduce indentation.
Replace ‘wrap-binaries’ phase with a custom implementation.
-rw-r--r--gnu/packages/cups.scm125
1 files changed, 77 insertions, 48 deletions
diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm
index f2e4e8ac2e..e54f5f03b0 100644
--- a/gnu/packages/cups.scm
+++ b/gnu/packages/cups.scm
@@ -491,54 +491,83 @@ should only be used as part of the Guix cups-pk-helper service.")
                   (guix build utils)
                   ((guix build python-build-system) #:prefix python:))
 
-       #: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* "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")
-                           (string-append (assoc-ref inputs "libusb")
-                                          "/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"))))))
-
-                  ;; Wrap bin/* so that the Python libraries are found.
-                  (add-after 'install 'wrap-binaries
-                    (assoc-ref python:%standard-phases 'wrap)))))
+       #: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* "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")
+                  (string-append (assoc-ref inputs "libusb")
+                                 "/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-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"))
+                    (python (assoc-ref inputs "python")))
+               (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 PYTHONPATH=\"~a:~a\"~@
+                                           exec -a \"$0\" \"~a/~a\" \"$@\"~%"
+                                           (which "bash")
+                                           (string-append
+                                            out "/lib/python"
+                                            (python:python-version python)
+                                            "/site-packages")
+                                           (getenv "PYTHONPATH")
+                                           bin target)))
+                               (chmod file #o755)))
+                  (find-files "." (lambda (file stat)
+                                    (eq? 'symlink (stat:type stat)))))
+                 #t)))))))
 
     ;; Note that the error messages printed by the tools in the case of
     ;; missing dependencies are often downright misleading.