add sane custom driver

This commit is contained in:
neox 2024-11-19 20:03:53 +01:00
parent 43ead00fa2
commit d63380fc21
No known key found for this signature in database
GPG Key ID: 57BC26A3687116F6
1 changed files with 312 additions and 12 deletions

View File

@ -28,9 +28,35 @@
(gnu packages gnupg) (gnu packages gnupg)
(gnu packages freedesktop) (gnu packages freedesktop)
(gnu packages cups) (gnu packages cups)
(gnu packages scanner)
(gnu packages autotools)
(gnu packages avahi)
(gnu packages boost)
(gnu packages compression)
(gnu packages freedesktop)
(gnu packages gettext)
(gnu packages ghostscript)
(gnu packages gnome)
(gnu packages glib)
(gnu packages gtk)
(gnu packages image)
(gnu packages imagemagick)
(gnu packages libusb)
(gnu packages linux)
(gnu packages pkg-config)
(gnu packages python)
(gnu packages textutils)
(gnu packages tls)
(gnu packages xml)
(gnu services) (gnu services)
(srfi srfi-1) (srfi srfi-1)
(guix gexp)) (guix gexp)
(guix packages)
(guix git-download)
(guix build-system gnu)
(guix utils)
((guix licenses)
#:prefix license:))
(use-service-modules (use-service-modules
cups cups
@ -43,6 +69,198 @@
vpn vpn
security-token) security-token)
;; Service SANE personnalisé
(define sane-custom-minimal
(package
(name "sane-custom-minimal")
(version "1.3.1")
(source (origin
(method git-fetch)
(uri (git-reference
(url "https://gitlab.com/sane-project/backends")
(commit version)))
(file-name (git-file-name name version))
(sha256
(base32 "1fb6shx9bz0svcyasmyqs93rbbwq7kzg6l0h1zh3kjvcwhchyv72"))
(modules '((guix build utils)))
(snippet
;; Generated HTML files and udev rules normally embed a
;; timestamp. Work around that to build things reproducibly.
'(begin
(substitute* "tools/sane-desc.c"
(("asctime \\(localtime \\(&current_time\\)\\)")
"\"1970-01-01\""))))))
(build-system gnu-build-system)
(native-inputs
`(("autoconf" ,autoconf)
("autoconf-archive" ,autoconf-archive)
("automake" ,automake)
("gettext" ,gettext-minimal)
("libtool" ,libtool)
("pkg-config" ,pkg-config)
;; For scripts/pixma_gen_options.py.
("python" ,python-wrapper)))
(inputs
(list libusb))
(arguments
`(#:configure-flags '("--with-lockdir=/var/lock/sane") ;; Avoid errors with plustek
#:phases
(modify-phases %standard-phases
(add-before 'bootstrap 'zap-unnecessary-git-dependency
(lambda _
;; This runs before default patch-shebangs phase.
(substitute* "tools/git-version-gen"
(("/bin/sh") (which "sh")))
(with-output-to-file ".tarball-version"
(lambda _ (format #t ,version)))))
(add-before 'configure 'disable-lockdir-creation
(lambda _
;; Modify the Makefile.am to prevent the creation of the lock dir
(substitute* "backend/Makefile.am"
(("^install-lockpath:.*$")
"install-lockpath: # pass"))))
(add-before 'configure 'disable-backends
(lambda _
(setenv "BACKENDS" " ")
;; Disable tests that may require back ends to be built.
(substitute* "testsuite/Makefile.in"
((" backend ") " "))))
(add-before 'configure 'disable-failing-tests
(lambda _
;; Disable unmaintained tests that that fail with errors resembling:
;;
;; < # by sane-desc 3.5 from sane-backends 1.0.24git on Jul 31 2013
;; ---
;; > # by sane-desc 3.5 from sane-backends 1.0.27 on 1970-01-01#
;; FAIL: sane-desc -m usermap -s ./data
(for-each
(lambda (pattern)
(substitute* "testsuite/tools/Makefile.in"
(((string-append " " pattern " ")) " ")))
(list "usermap" "db" "udev" "udev\\+acl" "udev\\+hwdb" "hwdb"))
;; Disable tests that try to connect to actual USB hardware & fail
;; with the following error when no USB access is allowed at all:
;;
;; sanei_usb_test: sanei_usb_test.c:849: main: Assertion
;; `test_init (1)' failed.
(substitute* "testsuite/sanei/Makefile.in"
(("sanei_usb_test\\$\\(EXEEXT\\) ") ""))))
(add-before 'build 'build-pixma_sane_options.c
;; "No rule to make target '../backend/pixma/pixma_sane_options.c',
;; needed by 'sane-backends.pot-update'."
(lambda _
(invoke "make" "-C" "backend" "pixma/pixma_sane_options.c")))
(add-after 'install 'install-udev-rules
(lambda* (#:key outputs #:allow-other-keys)
(let ((out (assoc-ref outputs "out")))
(mkdir-p (string-append out "/lib/udev/rules.d"))
(copy-file "tools/udev/libsane.rules"
(string-append out
"/lib/udev/rules.d/"
"60-libsane.rules")))))
(add-after 'install 'make-reproducible
;; XXX Work around an old bug <https://issues.guix.gnu.org/26247>.
;; Then work around "Throw to key `decoding-error' ..." by using sed.
(lambda* (#:key outputs #:allow-other-keys)
(let* ((out (assoc-ref outputs "out"))
(locale (string-append out "/share/locale")))
(with-directory-excursion locale
(for-each (lambda (file)
(invoke "sed" "-i" "/^PO-Revision-Date:/d" file))
(list "en@boldquot/LC_MESSAGES/sane-backends.mo"
"en@quot/LC_MESSAGES/sane-backends.mo")))))))))
(home-page "http://www.sane-project.org")
(synopsis
"Raster image scanner library and drivers, without scanner support")
(description "SANE stands for \"Scanner Access Now Easy\" and is an API
proving access to any raster image scanner hardware (flatbed scanner,
hand-held scanner, video- and still-cameras, frame-grabbers, etc.). The
package contains the library, but no drivers.")
(license license:gpl2+))) ; plus linking exception
(define sane-custom-backends
(package/inherit sane-custom-minimal
(name "sane-custom-backends")
(inputs
`(("hplip" ,(@ (gnu packages cups) hplip-minimal))
("libjpeg" ,libjpeg-turbo) ; for pixma/epsonds/other back ends
("libpng" ,libpng) ; support scanimage --format=png
("libxml2" ,libxml2) ; for pixma back end
,@(package-inputs sane-backends-minimal)))
(arguments
(substitute-keyword-arguments (package-arguments sane-custom-minimal)
((#:phases phases)
`(modify-phases ,phases
(delete 'disable-backends)
(add-after 'disable-failing-tests 'disable-failing-backend-tests
(lambda _
;; Disable test that fails on i686:
;; <https://bugs.gnu.org/39449>
(substitute* "testsuite/backend/genesys/Makefile.in"
((" genesys_unit_tests\\$\\(EXEEXT\\)") ""))
#t))
(add-after 'unpack 'add-backends
(lambda _
(substitute* "backend/dll.conf.in"
(("hp5590" all) (format #f "~a~%~a" all "hpaio")))
#t))
(add-after 'install 'install-hpaio
(lambda* (#:key inputs outputs #:allow-other-keys)
(define hplip (string-append (assoc-ref inputs "hplip")
"/lib/sane"))
(define out (string-append (assoc-ref outputs "out")
"/lib/sane"))
(for-each
(lambda (file)
(symlink file (string-append out "/" (basename file))))
(find-files hplip))
#t))))))
(synopsis
"Raster image scanner library and drivers, with scanner support")
(description "SANE stands for \"Scanner Access Now Easy\" and is an API
proving access to any raster image scanner hardware (flatbed scanner,
hand-held scanner, video- and still-cameras, frame-grabbers, etc.). The
package contains the library and drivers.")))
(define %sane-custom-accounts
;; The '60-libsane.rules' udev rules refers to the "scanner" group.
(list (user-group (name "scanner") (system? #t))))
(define %sane-custom-activation
#~(begin
(use-modules (guix build utils))
(let ((lockpath "/var/lock/sane")
(gid (vector-ref (getgrnam "scanner") 2)))
;; Create the lock directory at runtime and give right perms
(mkdir-p lockpath)
(chown lockpath -1 gid)
(chmod lockpath #o770))
#t))
(define sane-custom-service-type
(service-type
(name 'sane)
(description
"Custom SANE service")
(default-value sane-custom-minimal)
(extensions
(list (service-extension udev-service-type list)
(service-extension activation-service-type
(const %sane-custom-activation))
(service-extension account-service-type
(const %sane-custom-accounts))))))
(define simple-scan-custom
(package
(inherit simple-scan) ; Inherit from the original 'simple-scan'
(name "simple-scan-custom") ; Override the package name
(inputs
(modify-inputs (package-inputs simple-scan)
(replace "sane-backends" sane-custom-backends))))) ; Replace the input
;; Configuration sudoer personnalisée ;; Configuration sudoer personnalisée
(define %sudoers-specification (define %sudoers-specification
(plain-file "sudoers" "\ (plain-file "sudoers" "\
@ -54,10 +272,16 @@ root ALL=(ALL) ALL
;; Permet le partage de périphériques USB via virt-manager ;; Permet le partage de périphériques USB via virt-manager
(define %spice-rules (define %spice-rules
(udev-rule (udev-rule
"41-spice-and-nitrokey.rules" "41-spice.rules"
(string-append "\ (string-append "\
SUBSYSTEM==\"usb\", GROUP=\"spice\", MODE=\"0660\" SUBSYSTEM==\"usb\", GROUP=\"spice\", MODE=\"0660\"
SUBSYSTEM==\"usb_device\", GROUP=\"spice\", MODE=\"0660\" SUBSYSTEM==\"usb_device\", GROUP=\"spice\", MODE=\"0660\"
")))
(define %ch341a-nk3-rules
(udev-rule
"42-ch341a-and-nk3.rules"
(string-append "\
ACTION!=\"add|change\", GOTO=\"u2f_end\" ACTION!=\"add|change\", GOTO=\"u2f_end\"
KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"2581\", ATTRS{idProduct}==\"f1d0\", TAG+=\"uaccess\" KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"2581\", ATTRS{idProduct}==\"f1d0\", TAG+=\"uaccess\"
KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"4287\", TAG+=\"uaccess\" KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"4287\", TAG+=\"uaccess\"
@ -66,6 +290,7 @@ KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"20a0\", ATTRS{idP
KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"42dd\", TAG+=\"uaccess\" KERNEL==\"hidraw*\", SUBSYSTEM==\"hidraw\", ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"42dd\", TAG+=\"uaccess\"
ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"42e8\", TAG+=\"uaccess\" ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"42e8\", TAG+=\"uaccess\"
LABEL=\"u2f_end\" LABEL=\"u2f_end\"
SUBSYSTEM!=\"usb\", GOTO=\"gnupg_rules_end\" SUBSYSTEM!=\"usb\", GOTO=\"gnupg_rules_end\"
ACTION!=\"add\", GOTO=\"gnupg_rules_end\" ACTION!=\"add\", GOTO=\"gnupg_rules_end\"
ATTR{idVendor}==\"20a0\", ATTR{idProduct}==\"4107\", ENV{ID_SMARTCARD_READER}=\"1\", ENV{ID_SMARTCARD_READER_DRIVER}=\"gnupg\", TAG+=\"uaccess\" ATTR{idVendor}==\"20a0\", ATTR{idProduct}==\"4107\", ENV{ID_SMARTCARD_READER}=\"1\", ENV{ID_SMARTCARD_READER_DRIVER}=\"gnupg\", TAG+=\"uaccess\"
@ -76,6 +301,10 @@ ATTR{idVendor}==\"03eb\", ATTR{idProduct}==\"2ff1\", TAG+=\"uaccess\"
ATTR{idVendor}==\"20a0\", ATTR{idProduct}==\"4211\", ENV{ID_SMARTCARD_READER}=\"1\", ENV{ID_SMARTCARD_READER_DRIVER}=\"gnupg\", TAG+=\"uaccess\" ATTR{idVendor}==\"20a0\", ATTR{idProduct}==\"4211\", ENV{ID_SMARTCARD_READER}=\"1\", ENV{ID_SMARTCARD_READER_DRIVER}=\"gnupg\", TAG+=\"uaccess\"
ATTR{idVendor}==\"20a0\", ATTR{idProduct}==\"4230\", ENV{ID_SMARTCARD_READER}=\"1\", ENV{ID_SMARTCARD_READER_DRIVER}=\"gnupg\", TAG+=\"uaccess\" ATTR{idVendor}==\"20a0\", ATTR{idProduct}==\"4230\", ENV{ID_SMARTCARD_READER}=\"1\", ENV{ID_SMARTCARD_READER_DRIVER}=\"gnupg\", TAG+=\"uaccess\"
LABEL=\"gnupg_rules_end\" LABEL=\"gnupg_rules_end\"
# Winchiphead (WCH) CH341a based programmer
ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"5512\", MODE=\"664\", GROUP=\"plugdev\"
KERNEL==\"sd?1\", ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"4109\", SYMLINK+=\"nitrospace\" KERNEL==\"sd?1\", ATTRS{idVendor}==\"20a0\", ATTRS{idProduct}==\"4109\", SYMLINK+=\"nitrospace\"
"))) ")))
@ -88,6 +317,18 @@ else
PS1='\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ ' PS1='\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\\$ '
fi fi
PATH=\"$PATH:~/.local/bin\"
guix() {
if [[ \"$1\" == \"install\" ]]; then
echo \"Tu es débile, ou bien ?\"
elif [[ \"$1\" == \"remove\" ]]; then
echo \"Tu es débile, ou bien ?\"
else
command guix \"$@\"
fi
}
if [[ ! -n \"$SSH_CLIENT\" ]]; then if [[ ! -n \"$SSH_CLIENT\" ]]; then
unset SSH_AGENT_PID unset SSH_AGENT_PID
if [ \"${gnupg_SSH_AUTH_SOCK_by:-0}\" -ne $$ ]; then if [ \"${gnupg_SSH_AUTH_SOCK_by:-0}\" -ne $$ ]; then
@ -116,7 +357,7 @@ fi"))
("GCC_COLORS" . "'error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'") ("GCC_COLORS" . "'error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'")
("GUIX_PACKAGE_PATH" . "$HOME/.config/guix/packages/defs") ("GUIX_PACKAGE_PATH" . "$HOME/.config/guix/packages/defs")
("XDG_DATA_DIRS" . "$XDG_DATA_DIRS:$HOME/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share") ("XDG_DATA_DIRS" . "$XDG_DATA_DIRS:$HOME/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share")
("LV2_PATH" . "$HOME/.guix-profile/lib/lv2"))) ("LV2_PATH" . "/run/current-system/profile/lib/lv2")))
(aliases (aliases
'( '(
("clear" . "printf '\\033c'") ("clear" . "printf '\\033c'")
@ -170,6 +411,7 @@ fi"))
"audio" "audio"
"video" "video"
"libvirt" "libvirt"
"plugdev"
"kvm" "kvm"
"scanner" "scanner"
"spice" "spice"
@ -188,11 +430,13 @@ fi"))
"alsa-utils" "alsa-utils"
"ardour" "ardour"
"audacity" "audacity"
"beep"
"bind:utils" "bind:utils"
"binutils" "binutils"
"blueman" "blueman"
"bmaptools" ;"bmaptools"
"cabextract" "cabextract"
"calf"
"claws-mail" "claws-mail"
"cmatrix" "cmatrix"
"cpupower" "cpupower"
@ -201,18 +445,26 @@ fi"))
"cvs" "cvs"
"dconf-editor" "dconf-editor"
"dino" "dino"
"dosbox"
"gocryptfs"
"emacs" "emacs"
"endeavour" "endeavour"
"python-esptool"
"evolution" "evolution"
"exfatprogs" "exfatprogs"
"fastboot" "fastboot"
"ffmpeg" ;"ffmpeg"
"file" "file"
"flashrom" "flashrom"
"flatpak" "flatpak"
"font-awesome" "font-awesome"
"font-ipa-ex"
"font-ipa"
"font-ipa-mj-mincho"
"font-liberation" "font-liberation"
"font-mplus-testflight"
"font-openmoji" "font-openmoji"
"font-wqy-zenhei"
"gallery-dl" "gallery-dl"
"gdb" "gdb"
"ghostscript" "ghostscript"
@ -241,6 +493,7 @@ fi"))
"gpgme" "gpgme"
"graphviz" "graphviz"
"grub" "grub"
"hedgewars"
"hexchat" "hexchat"
"hplip" "hplip"
"htop" "htop"
@ -248,11 +501,18 @@ fi"))
"icecat" "icecat"
"inetutils" "inetutils"
"inkscape" "inkscape"
"ipp-usb"
"iptables"
"jack" "jack"
"jp2a" "jp2a"
"kajongg" "kajongg"
"kcachegrind" "kcachegrind"
"kgraphviewer" "kgraphviewer"
"kicad"
"kicad-templates"
"kicad-footprints"
"kicad-symbols"
"kicad-doc"
"ldns" "ldns"
"libreoffice" "libreoffice"
"libtree" "libtree"
@ -278,9 +538,11 @@ fi"))
"ncftp" "ncftp"
"ndisc6" "ndisc6"
"neofetch" "neofetch"
"netcat"
"network-manager" "network-manager"
"network-manager-openvpn" "network-manager-openvpn"
"nextcloud-client" "nextcloud-client"
"ngspice"
"nitrocli" "nitrocli"
"nmap" "nmap"
"ntfs-3g" "ntfs-3g"
@ -289,9 +551,11 @@ fi"))
"openvpn" "openvpn"
"pam-u2f" "pam-u2f"
"pandoc" "pandoc"
"paprefs"
"parted" "parted"
"patchelf" "patchelf"
"pavucontrol" "pavucontrol"
"pipe-viewer"
"pkg-config" "pkg-config"
"poppler" "poppler"
"powertop" "powertop"
@ -301,6 +565,8 @@ fi"))
"python-logutils" "python-logutils"
"python-markdown" "python-markdown"
"python-paramiko" "python-paramiko"
"python-prettytable"
"python-virtualenv"
"qbittorrent" "qbittorrent"
"qemu" "qemu"
"qjackctl" "qjackctl"
@ -308,7 +574,11 @@ fi"))
"recutils" "recutils"
"rsync" "rsync"
"rubber" "rubber"
"ruby-pygmentize"
"screen" "screen"
"perl-digest-sha"
"strace"
"xsane"
"seahorse" "seahorse"
"setxkbmap" "setxkbmap"
"simplescreenrecorder" "simplescreenrecorder"
@ -325,13 +595,16 @@ fi"))
"tilix" "tilix"
"transmission" "transmission"
"tree" "tree"
"tor"
"torbrowser"
"uefitool" "uefitool"
"ungoogled-chromium" "ungoogled-chromium"
"unzip"
"virt-manager" "virt-manager"
"vlc" "vlc"
"wine64" "wine64"
"xauth" "xauth"
"xdg-desktop-portal" ;"xdg-desktop-portal"
"xdg-desktop-portal-gnome" "xdg-desktop-portal-gnome"
"xdg-desktop-portal-gtk" "xdg-desktop-portal-gtk"
"xdg-utils" "xdg-utils"
@ -341,8 +614,17 @@ fi"))
"xournalpp" "xournalpp"
"xrdp" "xrdp"
"yt-dlp" "yt-dlp"
"zip"
"zstd")) "zstd"))
%base-packages))
(list
sane-custom-backends
simple-scan-custom)
(remove
(lambda (pkg)
(string=? (package-name pkg) "simple-scan"))
%base-packages)))
;; Services du système. ;; Services du système.
;; On en profite pour modifier le comportement par défaut de quelques services. ;; On en profite pour modifier le comportement par défaut de quelques services.
@ -380,6 +662,7 @@ fi"))
;; Application de la configuration spice personnalisée (définie plus haut) ;; Application de la configuration spice personnalisée (définie plus haut)
(udev-rules-service 'spice %spice-rules #:groups '("spice")) (udev-rules-service 'spice %spice-rules #:groups '("spice"))
(udev-rules-service 'plugdev %ch341a-nk3-rules #:groups '("plugdev"))
;; Modification des limites mémoires pour les accès audio temps réel ;; Modification des limites mémoires pour les accès audio temps réel
;; (utile notamment pour Ardour) ;; (utile notamment pour Ardour)
@ -391,10 +674,16 @@ fi"))
;; Service Gnome/GDM ;; Service Gnome/GDM
(service gnome-desktop-service-type) (service gnome-desktop-service-type)
;; Service Tor
(service tor-service-type)
;; Service de scanners
(service sane-custom-service-type)
;; Configuration de l'environnement graphique (notamment clavier) ;; Configuration de l'environnement graphique (notamment clavier)
(set-xorg-configuration (set-xorg-configuration
(xorg-configuration (keyboard-layout keyboard-layout)))) (xorg-configuration (keyboard-layout keyboard-layout))))
;; Services par défaut du système ;; Services par défaut du système
%desktop-services) %desktop-services)
@ -412,6 +701,17 @@ fi"))
(handle-lid-switch 'ignore) (handle-lid-switch 'ignore)
(handle-lid-switch-external-power 'ignore))) (handle-lid-switch-external-power 'ignore)))
;; Configuration des scanners
;(sane-service-type _ => sane-backends)
(delete sane-service-type)
(sane-custom-service-type _ => sane-custom-backends)
;; Configuration du garbage collector
(guix-service-type config => (guix-configuration
(inherit config)
(extra-options '("--gc-keep-derivations=yes" "--gc-keep-output=yes"))))
;; Configuration du service network-manager pour prendre en charge ;; Configuration du service network-manager pour prendre en charge
;; OpenVPN ;; OpenVPN
(network-manager-service-type config => (network-manager-configuration (network-manager-service-type config => (network-manager-configuration
@ -439,10 +739,10 @@ fi"))
;; Specify a swap file for the system, which resides on the ;; Specify a swap file for the system, which resides on the
;; root file system. ;; root file system.
(swap-devices ;(swap-devices
(list ; (list
(swap-space ; (swap-space
(target "/swapfile")))) ; (target "/swapfile"))))
;; La liste des systèmes de fichiers montés au démarrage ;; La liste des systèmes de fichiers montés au démarrage
;; On configure ici le montage des partitions chiffrées et non chiffrées ;; On configure ici le montage des partitions chiffrées et non chiffrées