gnu: hplip: Use gexps.

* gnu/packages/cups.scm (hplip) [arguments]: Use gexps.
* gnu/packages/cups.scm (hplip-minimal): Likewise.
This commit is contained in:
Maxim Cournoyer 2023-02-17 22:54:55 -05:00
parent da923bc122
commit 298d0d381e
No known key found for this signature in database
GPG key ID: 1260E46482E63562

View file

@ -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)))