diff --git a/gnu/packages/cups.scm b/gnu/packages/cups.scm index f08c7c8584..2bee800041 100644 --- a/gnu/packages/cups.scm +++ b/gnu/packages/cups.scm @@ -542,127 +542,119 @@ (define-public hplip (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" "'"))) + #: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) - (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~@ + (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 @@ (define-public hplip-minimal (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)))