Subject: [PATCH] gnu: nerd-dictation: Factor out wrapper. Add package variants.

From: Nicolas Graves <[email-masked]>
Date: Sat, 1 Apr 2023 19:32:39 +0200

* gnu/packages/machine-learning.scm (nerd-dictation):
Avoid inputs pulseaudio and ydotool when not necessary.
Factor out wrapper make-nerd-dictation-package.
Add package variants :
- nerd-dictation/xdotool
- nerd-dictation/sox-xdotool
- nerd-dictation/sox-ydotool
- nerd-dictation/sox-wtype
---
 gnu/packages/machine-learning.scm | 97 ++++++++++++++++++++++---------
 1 file changed, 69 insertions(+), 28 deletions(-)

diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 6c78b14fc6..4383f3fef3 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -17,6 +17,7 @@
 ;;; Copyright © 2020 Edouard Klein <[email-masked]>
 ;;; Copyright © 2020, 2021, 2022, 2023 Vinicius Monego <[email-masked]>
 ;;; Copyright © 2020, 2021, 2022, 2023 Maxim Cournoyer <[email-masked]>
+;;; Copyright © 2022, 2023 Nicolas Graves <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -63,6 +64,7 @@ (define-module (gnu packages machine-learning)
   #:use-module (gnu packages cran)
   #:use-module (gnu packages databases)
   #:use-module (gnu packages dejagnu)
+  #:use-module (gnu packages freedesktop)
   #:use-module (gnu packages gcc)
   #:use-module (gnu packages gettext)
   #:use-module (gnu packages gl)
@@ -3864,7 +3866,6 @@ (define-public nerd-dictation
            (add-after 'unpack 'chdir
              (lambda _ (chdir "package/python"))))))
       (propagated-inputs (list python-vosk))
-      (inputs (list pulseaudio xdotool))
       (home-page "https://github.com/ideasman42/nerd-dictation")
       (synopsis "Offline speech-to-text for desktop Linux")
       (description "\
@@ -3876,38 +3877,78 @@ (define-public nerd-dictation
 @code{nerd-dictation begin} and @code{nerd-dictation end} commands.")
       (license license:gpl3+))))
 
-(define-public nerd-dictation/wayland
-  (package
-    (inherit nerd-dictation)
-    (name "nerd-dictation-wayland")
-    (inputs (list bash-minimal nerd-dictation))
-    (propagated-inputs (list ydotool sox))
-    (build-system trivial-build-system)
-    (arguments
-     (list
-      #:modules '((guix build utils))
-      #:builder
-      #~(begin
-          (use-modules (guix build utils))
-          (let* ((exe (string-append #$output "/bin/nerd-dictation"))
-                 (original-exe #$(file-append nerd-dictation
-                                              "/bin/nerd-dictation"))
-                 (bash #$(this-package-input "bash-minimal"))
-                 (bash-exe (string-append bash "/bin/bash")))
-            (mkdir-p (dirname exe))
-            (call-with-output-file exe
-              (lambda (port)
-                (format port "#!~a
+(define (nerd-dictation-gexp input-name output-name bash nerd-dictation)
+  #~(begin
+      (use-modules (guix build utils))
+      (let* ((exe (string-append %output "/bin/nerd-dictation"))
+             (nerd-dictation-exe
+              #$(file-append nerd-dictation "/bin/nerd-dictation")))
+        (mkdir-p (dirname exe))
+        (call-with-output-file exe
+          (lambda (port)
+            (format port "#!~a
 if [ \"$1\" = begin ]
   then
-    exec ~a $@ --input=SOX --simulate-input-tool=YDOTOOL
+    exec ~a $@ --input=~a --simulate-input-tool=~a
   else
     exec ~a $@
 fi"
-                        bash-exe
-                        original-exe
-                        original-exe)))
-            (chmod exe #o555)))))))
+                    #$(file-append bash "/bin/bash")
+                    nerd-dictation-exe
+                    #$input-name
+                    #$output-name
+                    nerd-dictation-exe)))
+        (chmod exe #o555))))
+
+(define-public nerd-dictation/xdotool
+  (package
+    (inherit nerd-dictation)
+    (name "nerd-dictation-xdotool")
+    (build-system trivial-build-system)
+    (arguments (list
+                #:modules '((guix build utils))
+                #:builder
+                (nerd-dictation-gexp "PAREC" "XDOTOOL"
+                                     (this-package-input "bash-minimal")
+                                     (this-package-input "nerd-dictation"))))
+    (inputs (list bash-minimal nerd-dictation))
+    (propagated-inputs (list pulseaudio xdotool))))
+
+(define-public nerd-dictation/sox-xdotool
+  (package
+    (inherit nerd-dictation/xdotool)
+    (name "nerd-dictation-sox-xdotool")
+    (arguments (list
+                #:modules '((guix build utils))
+                #:builder
+                (nerd-dictation-gexp "SOX" "XDOTOOL"
+                                     (this-package-input "bash-minimal")
+                                     (this-package-input "nerd-dictation"))))
+    (propagated-inputs (list sox xdotool))))
+
+(define-public nerd-dictation/sox-ydotool
+  (package
+    (inherit nerd-dictation/xdotool)
+    (name "nerd-dictation-sox-ydotool")
+    (arguments (list
+                #:modules '((guix build utils))
+                #:builder
+                (nerd-dictation-gexp "SOX" "YDOTOOL"
+                                     (this-package-input "bash-minimal")
+                                     (this-package-input "nerd-dictation"))))
+    (propagated-inputs (list sox ydotool))))
+
+(define-public nerd-dictation/sox-wtype
+  (package
+    (inherit nerd-dictation/xdotool)
+    (name "nerd-dictation-sox-wtype")
+    (arguments (list
+                #:modules '((guix build utils))
+                #:builder
+                (nerd-dictation-gexp "SOX" "WTYPE"
+                                     (this-package-input "bash-minimal")
+                                     (this-package-input "nerd-dictation"))))
+    (propagated-inputs (list sox wtype))))
 
 (define-public python-brian2
   (package
-- 
2.39.2