Subject: [bug#37329] [PATCH] gnu: Add audacious.

From: Kei Kebreau <[email-masked]>
Date: Sat, 07 Sep 2019 20:18:28 -0400

Ricardo Wurmus <[email-masked]> writes:

> Kei Kebreau <[email-masked]> writes:
>
>>>> +    (arguments
>>>> +     `(#:configure-flags
>>>> +       (list "--disable-gtk" "--enable-qt"
>>
>> In reply to your later email: I used Qt instead of the default GTK+ 2
>> because of a personal preference, but apparently it's possible to enable
>> both to let users choose what they prefer.
>
> Would this retain references to *both* toolkits?  Wouldn’t this make the
> package much bigger than it otherwise would be?
>
> What’s the smaller variant…?
>

Enabling both toolkits would retain references to both, but it isn't
much larger than enabling only Qt.  That said, a GTK+ 2
exclusive build is smaller than a Qt exclusive one by a large margin:

Excluding plugins:
* Both toolkits: 1495.1 MiB
* Qt only:       1344.2 MiB
* GTK+ 2 only:    538.0 MiB

Including plugins:
* Both toolkits: 1736.2 MiB
* Qt only:       1734.9 MiB
* GTK+ 2 only:   1126.6 MiB

>>>> +       #:phases
>>>> +       (modify-phases %standard-phases
>>>> +         (add-after 'install 'unpack-plugins
>>>> +           (lambda* (#:key inputs #:allow-other-keys)
>>>> +             (let ((plugins (assoc-ref inputs
>>>> "audacious-plugins")))
>>>> +               (invoke "tar" "xvf" plugins)
>>>> +               (chdir (string-append "audacious-plugins-" 
>>>> ,version))
>>>
>>> It's not wrong, and I know this saves (with-directory-excursion)s down
>>> the road, but brr.  :-)
>>>
>>
>> Is it the lack of clarity in later phases that's undesirable?
>
> It’s a littly icky to have phases modify global state (other than the
> files they operate on), because it is no longer enough to look at just 
> the phase of interest.  If it can be avoided without making things too
> ugly I’d prefer to avoid “chdir” here.

Understood.  Adding a few "with-directory-excursion" calls isn't a bad
addition here.  I've attached a new patch with all three toolkit options
(Qt only, GTK+ 2 only, both) included for testing purposes.

From 7b2b638fc518d9362f1715144d4f50fa5761dcb0 Mon Sep 17 00:00:00 2001
From: Kei Kebreau <[email-masked]>
Date: Sat, 7 Sep 2019 00:48:16 -0400
Subject: [PATCH] gnu: Add audacious.

* gnu/packages/music.scm (audacious): New variable.
---
 gnu/packages/music.scm | 147 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 146 insertions(+), 1 deletion(-)

diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index a43bccf4f8..0037566519 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -141,7 +141,7 @@
   #:use-module (gnu packages xiph)
   #:use-module (gnu packages golang)
   #:use-module (gnu packages lua)
-  #:use-module ((srfi srfi-1) #:select (last)))
+  #:use-module ((srfi srfi-1) #:select (alist-delete last)))
 
 (define-public aria-maestosa
   (package
@@ -203,6 +203,151 @@ and play MIDI files with a few clicks in a user-friendly interface offering
 score, keyboard, guitar, drum and controller views.")
     (license license:gpl3+)))
 
+(define-public audacious
+  (package
+    (name "audacious")
+    (version "3.10.1")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "https://distfiles.audacious-media-player.org/"
+                                  "audacious-" version ".tar.bz2"))
+              (sha256
+               (base32
+                "14vbkhld5hwh96j8p8hjq9ybvc2m060a1y8crz14i51wpd0fhrl3"))))
+    (build-system gnu-build-system)
+    (arguments
+     `(#:configure-flags
+       (list (string-append "LDFLAGS=-Wl,-rpath=" %output "/lib"))
+       #:tests? #f                      ; no check target
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'install 'unpack-plugins
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((plugins (assoc-ref inputs "audacious-plugins")))
+               (invoke "tar" "xvf" plugins)
+               #t)))
+         (add-after 'unpack-plugins 'configure-plugins
+           (lambda* (#:key configure-flags outputs #:allow-other-keys)
+             (let ((out (assoc-ref outputs "out")))
+               (with-directory-excursion
+                   (string-append "audacious-plugins-" ,version)
+                 (substitute* "configure"
+                   (("/bin/sh") (which "sh")))
+                 (apply invoke "./configure"
+                        (append configure-flags
+                                ;; audacious-plugins requires audacious to build.
+                                (list (string-append "PKG_CONFIG_PATH="
+                                                     out "/lib/pkgconfig:"
+                                                     (getenv "PKG_CONFIG_PATH"))
+                                      (string-append "--prefix=" out))))))))
+         (add-after 'configure-plugins 'build-plugins
+           (lambda _
+             (with-directory-excursion
+                 (string-append "audacious-plugins-" ,version)
+               (invoke "make" "-j" (number->string (parallel-job-count))))))
+         (add-after 'build-plugins 'install-plugins
+           (lambda _
+             (with-directory-excursion
+                 (string-append "audacious-plugins-" ,version)
+               (invoke "make" "install")))))))
+    (native-inputs
+     `(("audacious-plugins"
+        ,(origin
+           (method url-fetch)
+           (uri (string-append "https://distfiles.audacious-media-player.org/"
+                               "audacious-plugins-" version ".tar.bz2"))
+           (sha256
+            (base32
+             "0hi61825ayrwc4snwr76f2669k06fii3n8ll1szjk5zr65v1ghzf"))))
+       ("gettext" ,gettext-minimal)
+       ("glib:bin" ,glib "bin")         ; for gdbus-codegen
+       ("pkg-config" ,pkg-config)))
+    (inputs
+     `(("dbus" ,dbus)
+       ("glib" ,glib)
+       ("gtk+" ,gtk+-2)
+       ;; Plugin dependencies
+       ("alsa-lib" ,alsa-lib)
+       ("curl" ,curl)
+       ("faad2" ,faad2)
+       ("ffmpeg" ,ffmpeg)
+       ("flac" ,flac)
+       ("fluidsynth" ,fluidsynth)
+       ("gdk-pixbuf" ,gdk-pixbuf)
+       ("lame" ,lame)
+       ("libbs2b" ,libbs2b)
+       ("libcddb" ,libcddb)
+       ("libcdio-paranoia" ,libcdio-paranoia)
+       ("libcue" ,libcue)
+       ("libmodplug" ,libmodplug)
+       ("libnotify" ,libnotify)
+       ("libogg" ,libogg)
+       ("libsamplerate" ,libsamplerate)
+       ("libsndfile" ,libsndfile)
+       ("libvorbis" ,libvorbis)
+       ("libxcomposite" ,libxcomposite)
+       ("libxml2" ,libxml2)
+       ("libxrender" ,libxrender)
+       ("lirc" ,lirc)
+       ("jack" ,jack-1)
+       ("mesa" ,mesa)
+       ("mpg123" ,mpg123)
+       ("neon" ,neon)
+       ("pulseaudio" ,pulseaudio)
+       ("sdl2" ,sdl2)
+       ("soxr" ,soxr)
+       ("wavpack" ,wavpack)))
+    (home-page "https://audacious-media-player.org")
+    (synopsis "Modular and skinnable audio player")
+    (description
+     "Audacious is an audio player descended from XMMS.  Drag and drop folders
+and individual song files, search for artists and albums in your entire music
+library, or create and edit your own custom playlists.  Listen to CD’s or stream
+music from the Internet.  Tweak the sound with the graphical equalizer or
+experiment with LADSPA effects.  Enjoy the modern GTK-themed interface or change
+things up with Winamp Classic skins.  Use the plugins included with Audacious to
+fetch lyrics for your music, to set an alarm in the morning, and more.")
+    ;; According to COPYING, Audacious and its plugins are licensed under the
+    ;; BSD 2-clause license and libguess is licensed under the BSD 3-clause
+    ;; license.
+    (license (list license:bsd-2
+                   license:bsd-3
+                   ;; Plugin licenses that aren't BSD 2- or 3-clause.
+                   license:lgpl2.1+
+                   license:gpl2
+                   license:gpl2+
+                   license:gpl3
+                   license:gpl3+
+                   license:expat
+                   license:isc
+                   license:lgpl2.0))))
+
+(define-public audacious-qt
+  (package
+    (inherit audacious)
+    (name "audacious-qt")
+    (arguments
+     (substitute-keyword-arguments (package-arguments audacious)
+       ((#:configure-flags flags)
+        `(cons* "--disable-gtk" "--enable-qt" ,flags))))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtmultimedia" ,qtmultimedia)
+       ,@(alist-delete "gtk+" (package-inputs audacious))))))
+
+(define-public audacious-both
+  (package
+    (inherit audacious)
+    (name "audacious-both")
+    (arguments
+     (substitute-keyword-arguments (package-arguments audacious)
+       ((#:configure-flags flags)
+        `(cons* "--enable-qt" ,flags))))
+    (inputs
+     `(("qtbase" ,qtbase)
+       ("qtmultimedia" ,qtmultimedia)
+       ,@(package-inputs audacious)))))
+
 ;; We don't use the latest release because it depends on Qt4.  Instead we
 ;; download the sources from the tip of the "qt5" branch.
 (define-public clementine
-- 
2.23.0