Subject: [bug#57984] [PATCH] gnu: Update zynaddsubfx to 3.0.6

From: Maxime Devos <[email-masked]>
Date: Wed, 26 Oct 2022 14:04:18 +0200

> Regarding recursive clone, I packages the runtime dependencies
 > seperately but I left the mruby gems, since they seem to be needed
 > just as source (without needing to be compiled) as they are to be
 > configured by mruby for mruby-zest. [...]

Bundling things that aren't compiled is still bundling.  Also, now both 
mruby-zest and zynaddsubfx bundle rtosc, which is worse than a package 
bundling a dependent that isn't used anywhere else.

I've looked at the latest patches and did some changes (see attached 
patches), though the bundling still remains.

In nanovg, I changed the 'revision' to 0 -- its just a monotonically 
increasing number for each package update, it's not a 'how many commits 
have there been', see (guix)Version Numbers.

I also changed "ar" to #$(ar-for-target) -- using the 'wrong' ar 
sometimes works, but not always, e.g. IIRC it failed when 
cross-compiling from some 64-bit arch to a 32-bit ach?

Upstream appears to use 'premake4' as a build system, so I adjusted the 
package definition accordingly.

I set the 'file-name' field for to be more informative.

---

I corrected the revision in font-entypo as with nanovg.

I expanded the description a little, and added a TODO
on building the font from source (it seems to have been
neglected for font packages because of node dependencies).

The license combination seemed a bit odd to me so I added
some more text there.

---

mruby-zest:

I changed 'TODO: package mruby gems separately' to 'TODO: unbundle mruby 
gems' as that seems easier to search for.  Some things were actually 
packaged, so I removed those from 'deps' in a snippet.  It turned out 
that the Makefile tried to build mruby, so I patched that out.

As mruby isn't included anymore, you could give removing some of the
bundled mruby gems a try, especially given that they aren't actually
installed.

I removed '#:tests? #false' because a test suite exists -- the makefile 
has a 'test' and 'rtest' target.  I choose the 'rtest' target (because 
'test' is for testing mruby, not mruby-zest).  It turned out the test 
suite requires 'ruby-ruby-prof' so I added that as a native-input.

You have done #$some-input in the 'install' phase -- package 
transformation don't know to adjust those, so I replaced it with a 
search-input-file equivalent.

Putting the fonts in the output of mruby-zest doesn't lookk quite right 
to me, so I instead moved things to a post-unpack phase and used 
'substitute*' instead of 'symlink'.

I noticed that pcre was bundled (deps/mruby-regexp-pcre/pcre'), so I 
removed that.

By looking at
<https://github.com/archlinux/svntogit-community/tree/packages/zynaddsubfx/trunk>,
I noticed it looks for libzest.so in /opt/zyn-fusion/libzest.so, which 
is incorrect in Guix (and other distros too).

I removed the wrapping because:

   * no reason was listed for wrapping
   * presumably the incorrect reference was the thing that
     LD_LIBRARY_PATH was a work-around for, but that reference has now
     been corrected.
   * LD_LIBRARY_PATH is leaky and hence to be avoided
     (if zest spawns a subprocess, then that subprocess would get
     LD_LIBRARY_PATH too)

As a bonus, this allowed removing 'bash-minimal' from the inputs.

 From 
<https://github.com/archlinux/svntogit-community/blob/packages/zynaddsubfx/trunk/zynaddsubfx-mruby-zest-build-3.0.6-system_wide_location.patch>,
I noticed that apparently some references to schema/test.json and 
MainWindow.qml were incorrect.  These are now patched.

I simplified the unbundling substitutions a little.
For example, it turned out that build_config.rb did not need any 
substitutions somehow.

The makefile uses pkg-config instead of TARGET-pkg-config, which is 
incorrect when cross-compiling, so I patched that.

On the fonts: I noticed that the fonts don't become part of the closure
(with "guix gc --references").  As such, maybe the source files that
use the fonts are actually unused.  I propose to give installing the
examples that use the fonts a try, or alternatively explicitly choose
to not install the (font-using) examples.

---

I changed the version of zynaddsubfx from (package-version mruby-zest)
to "3.0.6", otherwise the package would break after a mruby-zest update.

I re-added the comment of 'remove-sse-flags-from-generic-target' that 
was removed.

I changed #$mruby-zest to a search-input-file equivalent, for the same
reason as with previous patches.

You forgot to mention the home page, so I adjusted the commit message.

You are fixing a file name, not a path, so I adjusted the new phase name.

By removing the 'ntk' input, zynaddsubfx now has one less interface,
so I re-added it, with a comment.

It appeared that doxygen documentation wasn't actually build
(there is no .html in the output, and the configuraiton script
complained about some missing component), so I removed the new doxygen
(native-)input.

bash completions weren't installed in the new version even though they
were in the previous version, so I made some changes to support that.

I adjusted the substitution of libzest.so to substitute all cases,
in case somehow the first dlopen fails.

I compared the diff between old and new source code, there doesn't
appear to be anything 'suspicious' though its just a cursory look
and it would be easy to hide things:

guix shell diffoscope -- diffoscope 
/gnu/store/9j09zj472211nrrs5jmyxdsq2lpfd36q-zynaddsubfx-3.0.5.tar.bz2 
/gnu/store/xyjiq3nmk372ap4vq7sl7n7f9rc5xshs-zynaddsubfx-3.0.6.tar.bz2
From 4e64b03242b1f83319abd1d91125644846f6e628 Mon Sep 17 00:00:00 2001
From: Sughosha <[email-masked]>
Date: Sat, 15 Oct 2022 15:52:19 +0200
Subject: [PATCH 1/4] gnu: Add nanovg

* gnu/packages/music.scm (nanovg): New variable.

Modified-by: Maxime Devos <[email-masked]>
---
 gnu/packages/music.scm | 55 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 66b4beae0c..31e2bd651d 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -2989,6 +2989,61 @@ (define-public vmpk
 instrument or MIDI file player.")
     (license license:gpl3+)))
 
+(define-public nanovg
+  (let ((commit "b83cf926525e7cea8d2483da2a75852b8c7b6d28")
+        (revision "0"))
+    (package
+      (name "nanovg")
+      (version (git-version "0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/memononen/nanovg")
+                      (commit commit)))
+                (sha256
+                 (base32
+                  "1zp355pw6xnb5mjarz67cxkglv7j1s0qzv705fz1wf0gl0sjhy8f"))
+                (file-name (git-file-name name version))
+                (modules '((guix build utils)))
+                (snippet
+                 ;; Remove bundling and images for which no permission appears
+                 ;; to have been obtained.
+                 '(for-each delete-file-recursively
+                            '("example/entypo.ttf"
+                              "example/Roboto-Bold.ttf"
+                              "example/Roboto-Light.ttf"
+                              "example/Roboto-Regular.ttf"
+                              "example/images")))))
+      (build-system gnu-build-system)
+      (arguments
+       (list #:tests? #f ;no test suite
+             ;; For cross-compilation.
+             #:make-flags #~(list (string-append "CC=" #$(cc-for-target))
+                                  (string-append "AR=" #$(ar-for-target))
+                                  ;; compile with optimisations
+                                  (string-append "config=release")
+                                  ;; allow linking into shared libraries
+                                  (string-append "CFLAGS=-fPIC")
+                                  "-C" "build"
+                                  ;; Examples can't find nanovg.h, so only
+                                  ;; build the library.
+                                  "-f" "nanovg.make")
+             #:phases #~(modify-phases %standard-phases
+                          (replace 'configure
+                            (lambda _
+                              (invoke "premake4" "gmake")))
+                          (replace 'install
+                            (lambda _
+                              (let ((lib (string-append #$output "/lib")))
+                                (install-file "build/libnanovg.a" lib)))))))
+      (native-inputs (list premake4))
+      (home-page "https://github.com/memononen/nanovg")
+      (synopsis "Antialiased 2D vector drawing library")
+      (description
+       "NanoVG is small antialiased vector graphics rendering library for
+OpenGL.  It has lean API modeled after HTML5 canvas API.")
+      (license license:zlib))))
+
 (define-public zynaddsubfx
   (package
     (name "zynaddsubfx")

base-commit: 31a56967e2869c916b7a5e8ee570e8e10f0210a5
prerequisite-patch-id: 2712efb97bf33985fd0658e4dd8e936dc08be5fe
prerequisite-patch-id: 9d2409b480a8bff0fef029b4b095922d4957e06f
prerequisite-patch-id: 51a32abca3efec1ba67ead59b8694c5ea3129ad3
prerequisite-patch-id: 9092927761a340c07a99f5f3ed314a6add04cdee
prerequisite-patch-id: d0af09fbd5ee0ef60bdee53b87d729e46c1db2ca
prerequisite-patch-id: 4fee177b2d8c9478c6a7b8ce1ca9072942f39863
prerequisite-patch-id: c2b101598fa5b6f93470ae41d51a983dcb931b04
prerequisite-patch-id: 8fe65a852a4463203ea6b92abb3968bd819475b1
prerequisite-patch-id: 7585c78056095ec991615cbbe877e06f713aada9
prerequisite-patch-id: a9fb1bf1718ad8de6fc26d97a7dc5baf41dc38bd
prerequisite-patch-id: 1e5c9ef57d1df286042f4ae3eb420394c8b3b045
prerequisite-patch-id: 1913f770775c7b13549f6bbe5cb6f8e51990d1a0
prerequisite-patch-id: 75f1d34de3d9281f2645511396373778090c0bdc
prerequisite-patch-id: c8741c63c400a75edd2432c495ec85960e771474
prerequisite-patch-id: ce54131c43d3bf59273a65f226fcb4ab101e891d
prerequisite-patch-id: 841c8386c4ada8bfc4d062e11f04ebb5ec464e69
prerequisite-patch-id: fa36a5bd2e38c521341d2f95ff604605158e35c8
-- 
2.38.0

From 5935d9f1c2c2850dd27cd52a8da65838272938b7 Mon Sep 17 00:00:00 2001
From: Sughosha <[email-masked]>
Date: Sat, 15 Oct 2022 15:54:10 +0200
Subject: [PATCH 2/4] gnu: Add font-entypo

* gnu/packages/music.scm (font-entypo): New variable.

Modified-by: Maxime Devos <[email-masked]>
---
 gnu/packages/fonts.scm | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/gnu/packages/fonts.scm b/gnu/packages/fonts.scm
index 39242f0bec..f88f4cd511 100644
--- a/gnu/packages/fonts.scm
+++ b/gnu/packages/fonts.scm
@@ -2817,3 +2817,31 @@ (define-public font-chiron-hei-hk
 Kong variant of Adobe’s Source Han Sans.  The font aims at providing a modern,
 region-agnostic glyph set adopting the “modern” glyph style that is similar to
 prevalent typefaces in Traditional Chinese regions.")))
+
+;; TODO: once we <https://github.com/danielbruce/entypo>, build the font
+;; from source.
+(define-public font-entypo
+  (let ((commit "f94e077449daa87321aa0df5643889460ba8291b")
+        (revision "0"))
+    (package
+      (name "font-entypo")
+      (version (git-version "0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/danielbruce/entypo")
+               (commit commit)))
+         (sha256
+          (base32
+           "0kgy2ia15q93ksh6kbj8p5n44mmmax95w6a5byimbvcqajmvv7m6"))))
+      (build-system font-build-system)
+      (home-page "https://entypo.com")
+      (synopsis "Pictogram font")
+      (description
+       "Entypo is a special-purpose font, consisting solely of pictograms.")
+      ;; According to the README.md, icons are distributed under
+      ;; CC-BY-SA 3.0 and fonts are distributed under SIL OFL.
+      ;; As the icons are part of the font, the exact distinction it a bit
+      ;; unclear, but it appears to be free.
+      (license (list license:cc-by-sa3.0 license:silofl1.1)))))
-- 
2.38.0

From b090f29ba9452bdd9ed59b725a7f10f3d50d7c78 Mon Sep 17 00:00:00 2001
From: Sughosha <[email-masked]>
Date: Sat, 15 Oct 2022 15:56:23 +0200
Subject: [PATCH 3/4] gnu: Add mruby-zest

* gnu/packages/music.scm (mruby-zest): New variable.

Modified-by: Maxime Devos <[email-masked]>
---
 gnu/packages/music.scm | 120 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 31e2bd651d..63c66b17d5 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -167,6 +167,7 @@ (define-module (gnu packages music)
   #:use-module (gnu packages rdf)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages rsync)
+  #:use-module (gnu packages ruby)
   #:use-module (gnu packages sdl)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages sphinx)
@@ -3044,6 +3045,125 @@ (define-public nanovg
 OpenGL.  It has lean API modeled after HTML5 canvas API.")
       (license license:zlib))))
 
+;; TODO: https://github.com/archlinux/svntogit-community/tree/packages/zynaddsubfx/trunk
+(define-public mruby-zest
+  (package
+    (name "mruby-zest")
+    (version "3.0.6")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/mruby-zest/mruby-zest-build")
+                    (commit version)
+                    ;; TODO: package mruby gems seperately.
+                    (recursive? #t)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0dz4zv1km9805lji2q2qqdd8s8hgfd723dxdzcivbhm612szm1mc"))
+              (modules '((guix build utils)))
+              (snippet
+               '(begin
+                  (use-modules (ice-9 ftw))
+                  (delete-file-recursively "mruby")
+                  (delete-file-recursively "deps/mruby-regexp-pcre/pcre")
+                  (for-each
+                   (lambda (x)
+                     (unless (or (string-prefix? "mruby-" x)
+                                 (member x '("pugl" "rtosc" "." "..")))
+                       (delete-file-recursively (string-append "deps/" x))))
+                   (scandir "deps"))))))
+    (build-system gnu-build-system)
+    (arguments
+     (list #:make-flags #~(list (string-append "CC="
+                                               #$(cc-for-target))
+                                "CONFIG_SHELL=bash")
+           #:test-target "rtest" ; The 'test' tests mruby instead of mruby-zest
+           #:phases #~(modify-phases %standard-phases
+                        (delete 'configure) ;no configure script
+                        (add-after 'unpack 'unbundle
+                          (lambda* (#:key inputs #:allow-other-keys)
+                            (substitute* "Makefile"
+                              (("cd (deps/nanovg|mruby)") "#")
+                              (("\\$\\(AR\\) rc deps/libnanovg\\.a") "#")
+                              (("cd deps/mruby-file-stat") "#")
+                              (("\\./deps/libnanovg\\.a") "-lnanovg"))))
+                        (add-after 'unpack 'disable-unused-deps
+                          (lambda _
+                            (substitute* "build_config.rb"
+                              (("conf\\.gem 'deps/mruby-file-stat'")
+                               "#"))
+                            (substitute* "deps/mruby-dir-glob/mrbgem.rake"
+                              (("spec\\.add_dependency 'mruby-file-stat'")
+                               "#"))))
+                        ;; It is unknown if this is sufficient, because at
+                        ;; time of writing, the dependency mesa failed to
+                        ;; cross-compile.
+                        (add-after 'unpack 'fix-cross-compilation
+                          (lambda _
+                            (substitute* '("Makefile" "build_config.rb")
+                              (("pkg-config\\b") #$(pkg-config-for-target)))))
+                        (add-after 'unpack 'hardcode-file-names
+                          ;; TODO: fonts do not appear in the references,
+                          ;; why is the Ruby code not installed?
+                          (lambda* (#:key inputs #:allow-other-keys)
+                            (substitute* (find-files "." "\\.rb$")
+                              (("search \\+ \"font/([a-zA-Z-]+\\.ttf)\"(.*)$" _ font-basename)
+                               (string-append
+                                "\""
+                                (search-input-file
+                                 inputs
+                                 (string-append "share/fonts/truetype/"
+                                                font-basename))
+                                "\"]"))
+                              (("'([a-zA-Z-]+\\.ttf)'" _ font-basename)
+                               (string-append
+                                "'"
+                                (search-input-file
+                                 inputs
+                                 (string-append "share/fonts/truetype/"
+                                                font-basename))
+                                "'")))
+                            (substitute* "test-libversion.c"
+                              (("\"(.*libzest)\\.so\"")
+                               (format #f "\"~a/lib/libzest.so\"" #$output)))
+                            (substitute* "src/osc-bridge/src/bridge.c"
+                              (("./qml/MainWindow.qml")
+                               (string-append #$output "/lib/zyn-fusion/qml/MainWindow.qml")))
+                            (substitute* "src/mruby-widget-lib/mrblib/script.rb"
+                              (("schema/test.json")
+                               (string-append #$output "/lib/zyn-fusion/schema/test.json")))))
+                        (replace 'install
+                          (lambda* (#:key inputs #:allow-other-keys)
+                            (let* ((lib (string-append #$output
+                                                       "/lib/zyn-fusion"))
+                                   (qml (string-append lib "/qml"))
+                                   (bin (string-append #$output "/bin")))
+                              (copy-recursively "src/mruby-zest/qml" qml)
+                              (copy-recursively "src/mruby-zest/example" qml)
+                              (install-file "src/osc-bridge/schema/test.json"
+                                            (string-append lib "/schema"))
+                              (install-file "libzest.so" lib)
+                              ;; zynaddsubfx requires this name.
+                              (rename-file "zest" "zyn-fusion")
+                              (install-file "zyn-fusion" bin)
+                              (install-file "completions/zyn-fusion"
+                                            (string-append #$output
+                                             "/share/bash-completion/completions"))))))))
+    (native-inputs (list mruby pkg-config ruby ruby-ruby-prof))
+    (inputs (list font-entypo
+                  font-google-roboto
+                  libuv
+                  libx11
+                  mesa
+                  nanovg))
+    (home-page "https://github.com/mruby-zest/mruby-zest-build")
+    (synopsis "Widget classes for the mruby-zest framework")
+    (description
+     "This repository contains all of the widgets needed to create the
+@code{zyn-fusion} user interface for ZynAddSubFX.")
+    (license license:lgpl2.1)))
+
 (define-public zynaddsubfx
   (package
     (name "zynaddsubfx")
-- 
2.38.0

From 3feccc0f627a2bb44c5f03bd54fa9d08198c1702 Mon Sep 17 00:00:00 2001
From: Sughosha <[email-masked]>
Date: Sat, 15 Oct 2022 15:59:55 +0200
Subject: [PATCH 4/4] gnu: zynaddsubfx: Update to 3.0.6.

Upstream has switched from ntk to mruby-zest.

* gnu/packages/music.scm (zynaddsubfx): Update to 3.0.6.
Update package style.
[arguments]{#:phases}[fix-zyn-fusion-location]: New phase for new dependency.
[inputs]: Add mruby-zest.
[home-page]: Update home page.

Modified-by: Maxime Devos <[email-masked]>
---
 gnu/packages/music.scm | 74 +++++++++++++++++++++++++-----------------
 1 file changed, 45 insertions(+), 29 deletions(-)

diff --git a/gnu/packages/music.scm b/gnu/packages/music.scm
index 63c66b17d5..0f82c85bcb 100644
--- a/gnu/packages/music.scm
+++ b/gnu/packages/music.scm
@@ -3167,42 +3167,58 @@ (define-public mruby-zest
 (define-public zynaddsubfx
   (package
     (name "zynaddsubfx")
-    (version "3.0.5")
+    (version "3.0.6")
     (source (origin
               (method url-fetch)
               (uri (string-append
-                    "mirror://sourceforge/zynaddsubfx/zynaddsubfx/"
-                    version "/zynaddsubfx-" version ".tar.bz2"))
+                    "mirror://sourceforge/zynaddsubfx/zynaddsubfx/" version
+                    "/zynaddsubfx-" version ".tar.bz2"))
               (sha256
                (base32
-                "0qwzg14h043rmyf9jqdylxhyfy4sl0vsr0gjql51wjhid0i34ivl"))))
+                "1bkirvcg0lz1i7ypnz3dyh218yhrqpnijxs8n3wlgwbcixvn1lfb"))))
     (build-system cmake-build-system)
     (arguments
-     `(#:phases
-       (modify-phases %standard-phases
-         ;; Move SSE compiler optimization flags from generic target to
-         ;; athlon64 and core2 targets, because otherwise the build would fail
-         ;; on non-Intel machines.
-         (add-after 'unpack 'remove-sse-flags-from-generic-target
-          (lambda _
-            (substitute* "src/CMakeLists.txt"
-              (("-msse -msse2 -mfpmath=sse") "")
-              (("-march=(athlon64|core2)" flag)
-               (string-append flag " -msse -msse2 -mfpmath=sse")))
-            #t)))))
-    (inputs
-     (list liblo
-           ntk
-           mesa
-           alsa-lib
-           jack-1
-           fftw
-           minixml
-           libxpm
-           zlib))
-    (native-inputs
-     (list pkg-config))
-    (home-page "http://zynaddsubfx.sf.net/")
+     (list #:configure-flags #~(list "-DGuiModule=zest"
+                                     (string-append "-DZYN_DATADIR="
+                                                    #$output
+                                                    "/share/zynaddsubfx")
+                                     (string-append "-DBASHCOMP_PKG_PATH="
+                                                    #$output
+                                                    "/share/bash-completion/completions"))
+           #:phases #~(modify-phases %standard-phases
+                        ;; Move SSE compiler optimization flags from generic
+                        ;; target to athlon64 and core2 targets, because
+                        ;; otherwise the build would fail on non-Intel machines.
+                        (add-after 'unpack 'remove-sse-flags-from-generic-target
+                          (lambda _
+                            (substitute* "src/CMakeLists.txt"
+                              (("-msse -msse2 -mfpmath=sse")
+                               "")
+                              (("-march=(athlon64|core2)" flag)
+                               (string-append flag
+                                              " -msse -msse2 -mfpmath=sse")))))
+                        (add-after 'unpack 'fix-zyn-fusion-location
+                          (lambda* (#:key inputs #:allow-other-keys)
+                            (substitute* "src/main.cpp"
+                              (("\\./zyn-fusion")
+                               (search-input-file inputs "bin/zyn-fusion")))
+                            (substitute*
+                             "src/Plugin/ZynAddSubFX/ZynAddSubFX-UI-Zest.cpp"
+                              (("(\\./|/opt/zyn-fusion/|)libzest.so")
+                               (search-input-file inputs
+                                                  "lib/zyn-fusion/libzest.so"))))))))
+    (inputs (list alsa-lib
+                  fftwf
+                  jack-1
+                  liblo
+                  libxpm
+                  mesa
+                  minixml
+                  mruby-zest
+                  ntk ; optional, alternative interface
+                  zlib))
+    (native-inputs (list pkg-config ruby))
+    (home-page "https://zynaddsubfx.sourceforge.io/")
     (synopsis "Software synthesizer")
     (description
      "ZynAddSubFX is a feature heavy realtime software synthesizer.  It offers
-- 
2.38.0