diff mbox series

[bug#63065,v2,06/16] gnu: Add yabridge.

Message ID -4-Qw03sW-iEY2AKTjeoPxFRmvMcn9wIBks9zO73havgvPA6UAihkK59CqWd_tjIBvZYlgjGqmIoAACNdCuutbvWZpA5mbzPS-0GjcY8PG0=@proton.me
State New
Headers show
Series None | expand

Commit Message

Sughosha June 29, 2023, 10:20 a.m. UTC
* gnu/packages/audio.scm (yabridge): New variable.
* gnu/packages/patches/yabridge-5.0.4-fix-dependency-search.patch:
New file.
* gnu/packages/patches/vst3sdk-3.7.7-allow-winelib-compilation.patch:
New file.
* gnu/local.mk: Register the patch files.
---
 gnu/local.mk                                  |   2 +
 gnu/packages/audio.scm                        | 127 ++++++++++++
 ...3sdk-3.7.7-allow-winelib-compilation.patch | 191 ++++++++++++++++++
 .../patches/yabridge-5.0.4-dependencies.patch |  36 ++++
 4 files changed, 356 insertions(+)
 create mode 100644 gnu/packages/patches/vst3sdk-3.7.7-allow-winelib-compilation.patch
 create mode 100644 gnu/packages/patches/yabridge-5.0.4-dependencies.patch
diff mbox series

Patch

diff --git a/gnu/local.mk b/gnu/local.mk
index e65888a044..e05602c4e5 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -2054,6 +2054,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/vinagre-newer-rdp-parameters.patch      \
   %D%/packages/patches/virtuoso-ose-remove-pre-built-jar-files.patch	\
   %D%/packages/patches/vsearch-unbundle-cityhash.patch		\
+  %D%/packages/patches/vst3sdk-3.7.7-allow-winelib-compilation.patch	\
   %D%/packages/patches/vte-CVE-2012-2738-pt1.patch			\
   %D%/packages/patches/vte-CVE-2012-2738-pt2.patch			\
   %D%/packages/patches/vtk-7-gcc-10-compat.patch		\
@@ -2096,6 +2097,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/xterm-370-explicit-xcursor.patch		\
   %D%/packages/patches/xygrib-fix-finding-data.patch		\
   %D%/packages/patches/xygrib-newer-proj.patch			\
+  %D%/packages/patches/yabridge-5.0.4-fix-dependency-search.patch	\
   %D%/packages/patches/yggdrasil-extra-config.patch	\
   %D%/packages/patches/zig-do-not-link-against-librt.patch	\
   %D%/packages/patches/zig-use-system-paths.patch		\
diff --git a/gnu/packages/audio.scm b/gnu/packages/audio.scm
index 0e7a3fa8a5..02d2a68396 100644
--- a/gnu/packages/audio.scm
+++ b/gnu/packages/audio.scm
@@ -71,7 +71,9 @@  (define-module (gnu packages audio)
   #:use-module (gnu packages boost)
   #:use-module (gnu packages build-tools)
   #:use-module (gnu packages check)
+  #:use-module (gnu packages cmake)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages cpp)
   #:use-module (gnu packages curl)
   #:use-module (gnu packages dbm)
   #:use-module (gnu packages documentation)
@@ -132,6 +134,7 @@  (define-module (gnu packages audio)
   #:use-module (gnu packages vim) ;xxd
   #:use-module (gnu packages web)
   #:use-module (gnu packages webkit)
+  #:use-module (gnu packages wine)
   #:use-module (gnu packages wxwidgets)
   #:use-module (gnu packages xdisorg)
   #:use-module (gnu packages xiph)
@@ -5841,6 +5844,130 @@  (define-public mbelib
       (license (list license:bsd-3      ; test/ framework
                      license:isc)))))   ; the rest
 
+(define-public yabridge
+  (package
+    (name "yabridge")
+    (version "5.0.5")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/robbert-vdh/yabridge")
+                    (commit version)))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "0ayl706nv67jkixbrh9z7225gdwg2s4rzndx77761x33mk6by7a8"))
+              (patches
+               (search-patches
+                "yabridge-5.0.4-dependencies.patch"))
+              (modules '((guix build utils)))))
+    (build-system meson-build-system)
+    (arguments
+     (list #:configure-flags
+           #~(list (string-append "--cross-file=" #$source "/cross-wine.conf"))
+           #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'add-vst3-subproject
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (symlink (assoc-ref inputs "vst3sdk") "subprojects/vst3")))
+               (add-after 'unpack 'patch-paths
+                 (lambda* (#:key inputs #:allow-other-keys)
+                   (substitute* "src/chainloader/utils.cpp"
+                     (("\"/usr/local/lib64\",")
+                      (string-append "\"/usr/local/lib64\",\n\""
+                                     #$output "/lib\",")))
+                   (let ((wine
+                          #$(match (%current-system)
+                              ((or "x86_64-linux" "aarch64-linux") "wine64")
+                              (_ "wine32")))
+                         (arch
+                          #$(match (%current-system)
+                              ((or "x86_64-linux" "aarch64-linux")
+                               "x86_64-unix")
+                              (_ "i386-unix"))))
+                     (substitute* "meson.build"
+                       (("-lole32")
+                        (search-input-file inputs
+                         (string-append "/lib/" wine "/wine/"
+                                        arch "/libole32.a")))
+                       (("-lshell32")
+                        (search-input-file inputs
+                         (string-append "/lib/" wine "/wine/"
+                                        arch "/libshell32.a")))
+                       (("-luuid")
+                        (search-input-file inputs
+                         (string-append "/lib/" wine "/wine/"
+                                        arch "/libuuid.a")))))))
+               (replace 'install
+                 (lambda _
+                   (for-each
+                     (lambda (file)
+                       (install-file file (string-append #$output "/bin")))
+                       (find-files "." "-host\\.exe(|\\.so)$"))
+                   (for-each
+                     (lambda (file)
+                       (install-file file (string-append #$output "/lib")))
+                       (find-files "." "libyabridge")))))))
+    (native-inputs
+     `(("clap"
+        ,(let ((version "1.1.7"))
+           (package/inherit clap
+             (version version)
+             (source
+              (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/free-audio/clap")
+                      (commit version)))
+                (file-name (git-file-name "clap" version))
+                (sha256
+                 (base32
+                  "1afjvllmzf2xmrpy8mcxk7zhii93b447ciaqw9lkj2wh9z217hsr")))))))
+       ("cmake-minimal" ,cmake-minimal)
+       ("function2" ,function2)
+       ("gulrak-filesystem" ,gulrak-filesystem)
+       ("pkg-config" ,pkg-config)
+       ("tomlplusplus" ,tomlplusplus)
+       ;; This is VST3 SDK v3.7.7_build_19 with the documentation and VSTGUI
+       ;; submodules removed and a dummy `meson.build` file that just lists all
+       ;; source files.
+       ("vst3sdk"
+        ,(origin
+           (method git-fetch)
+           (uri (git-reference
+                 (url "https://github.com/robbert-vdh/vst3sdk")
+                 (commit (string-append "v3.7.7_build_19-patched"))
+                 ;; Required for vst3_base, vst3_pluginterfaces,
+                 ;; and vst3_public_sdk.
+                 (recursive? #t)))
+           (file-name (git-file-name name version))
+           (sha256
+            (base32
+             "09axvpshwbf5061kcbl26v74dcmwxmgmlxb15b75bnqbh0zcghrf"))
+           (patches
+            (search-patches
+             "vst3sdk-3.7.7-allow-winelib-compilation.patch"))))))
+    (inputs
+     (list asio
+           bitsery
+           dbus
+           libxcb
+           (match (%current-system)
+             ((or "x86_64-linux" "aarch64") wine64)
+             (_ wine))))
+    ;; Support the platforms that are supported by wine and wine64.
+    (supported-systems
+     (package-supported-systems wine64))
+    (home-page "https://github.com/robbert-vdh/yabridge")
+    (synopsis "Implementation of Windows VST2, VST3 and CLAP plugin APIs")
+    (description
+     "@code{yabridge} is Yet Another way to use Windows audio plugins.  It
+supports using both 32-bit and 64-bit Windows VST2, VST3, and CLAP plugins in
+64-bit Linux plugin hosts as if they were native plugins, with optional support
+for plugin groups to enable inter-plugin communication for VST2 plugins and
+quick startup times.")
+    (license license:gpl3+)))
+
 (define-public ableton-link
   (package
     (name "ableton-link")
diff --git a/gnu/packages/patches/vst3sdk-3.7.7-allow-winelib-compilation.patch b/gnu/packages/patches/vst3sdk-3.7.7-allow-winelib-compilation.patch
new file mode 100644
index 0000000000..43639f978f
--- /dev/null
+++ b/gnu/packages/patches/vst3sdk-3.7.7-allow-winelib-compilation.patch
@@ -0,0 +1,191 @@ 
+This patch is taken from yabridge project:
+https://github.com/robbert-vdh/yabridge.
+
+Submodule base contains modified content
+diff --git a/base/source/fdebug.cpp b/base/source/fdebug.cpp
+index b1d1dcc..9093022 100644
+--- a/base/source/fdebug.cpp
++++ b/base/source/fdebug.cpp
+@@ -117,8 +117,6 @@ bool AmIBeingDebugged ()
+ #if _MSC_VER
+ #include <intrin.h>
+ #endif
+-#define vsnprintf _vsnprintf
+-#define snprintf _snprintf
+ 
+ #elif SMTG_OS_MACOS
+ #include <errno.h>
+Submodule pluginterfaces contains modified content
+diff --git a/pluginterfaces/base/fstrdefs.h b/pluginterfaces/base/fstrdefs.h
+index 848e8ee..8846d31 100644
+--- a/pluginterfaces/base/fstrdefs.h
++++ b/pluginterfaces/base/fstrdefs.h
+@@ -22,6 +22,16 @@
+ /** string methods defines unicode / ASCII */
+ //----------------------------------------------------------------------------
+ 
++// We can use most of the VST3 SDK's Windows UTF-16 functionality by just
++// creating aliases for equivalent Linux functions
++#if __WINE__
++#define wcsicmp wcscasecmp
++#define wcsnicmp wcsncasecmp
++#define _vsnwprintf vswprintf
++#define stricmp strcasecmp
++#define strnicmp strncasecmp
++#endif
++
+ // 16 bit string operations
+ #if SMTG_CPP11	// if c++11 unicode string literals
+ 	#define SMTG_CPP11_CAT_PRIVATE_DONT_USE(a,b)			a ## b
+diff --git a/pluginterfaces/base/ftypes.h b/pluginterfaces/base/ftypes.h
+index 133dbba..33ecae3 100644
+--- a/pluginterfaces/base/ftypes.h
++++ b/pluginterfaces/base/ftypes.h
+@@ -154,7 +154,7 @@ namespace Steinberg
+ // always inline macros (only when RELEASE is 1)
+ //----------------------------------------------------------------------------
+ #if RELEASE
+-    #if SMTG_OS_MACOS || SMTG_OS_LINUX || defined(__MINGW32__)
++    #if SMTG_OS_MACOS || SMTG_OS_LINUX || defined(__WINE__)
+ 		#define SMTG_ALWAYS_INLINE	__inline__ __attribute__((__always_inline__))
+ 		#define SMTG_NEVER_INLINE __attribute__((noinline))
+ 	#elif SMTG_OS_WINDOWS
+diff --git a/pluginterfaces/base/ustring.cpp b/pluginterfaces/base/ustring.cpp
+index 24a412f..8e631c9 100644
+--- a/pluginterfaces/base/ustring.cpp
++++ b/pluginterfaces/base/ustring.cpp
+@@ -38,6 +38,10 @@
+ 
+ #endif
+ 
++#ifdef __WINE__
++#include <wchar.h>
++#endif
++
+ //------------------------------------------------------------------------
+ namespace Steinberg {
+ 
+@@ -173,7 +177,7 @@ bool UString::scanFloat (double& value) const
+ bool UString::printFloat (double value, int32 precision)
+ {
+ #if SMTG_OS_WINDOWS
+-	return swprintf ((wchar_t*)thisBuffer, L"%.*lf", precision, value) != -1;
++	return swprintf ((wchar_t*)thisBuffer, thisSize, L"%.*lf", precision, value) != -1;
+ #elif SMTG_OS_MACOS
+ 	bool result = false;
+ 	CFStringRef cfStr = CFStringCreateWithFormat (0, 0, CFSTR("%.*lf"), precision, value);
+@@ -238,7 +242,7 @@ bool UString::scanInt (int64& value) const
+ bool UString::printInt (int64 value)
+ {
+ #if SMTG_OS_WINDOWS
+-	return swprintf ((wchar_t*)thisBuffer, L"%I64d", value) != -1;
++	return swprintf ((wchar_t*)thisBuffer, thisSize, L"%I64d", value) != -1;
+ 
+ #elif SMTG_OS_MACOS
+ 	CFStringRef cfStr = CFStringCreateWithFormat (0, 0, CFSTR("%lld"), value);
+Submodule public.sdk contains modified content
+diff --git a/public.sdk/source/common/systemclipboard_win32.cpp b/public.sdk/source/common/systemclipboard_win32.cpp
+index c5cb2b8..2ee3d65 100644
+--- a/public.sdk/source/common/systemclipboard_win32.cpp
++++ b/public.sdk/source/common/systemclipboard_win32.cpp
+@@ -111,7 +111,7 @@ bool copyTextToClipboard (const std::string& text)
+ 	{
+ 		if (auto* data = static_cast<WCHAR*> (GlobalLock (memory)))
+ 		{
+-#if defined(__MINGW32__)
++#if defined(__WINE__)
+ 			memcpy (data, wideStr.data (), byteSize);
+ #else
+ 			memcpy_s (data, byteSize, wideStr.data (), byteSize);
+diff --git a/public.sdk/source/vst/hosting/module_win32.cpp b/public.sdk/source/vst/hosting/module_win32.cpp
+index 2ba9319..ab6d72a 100644
+--- a/public.sdk/source/vst/hosting/module_win32.cpp
++++ b/public.sdk/source/vst/hosting/module_win32.cpp
+@@ -44,35 +44,10 @@
+ #include <algorithm>
+ #include <iostream>
+ 
+-#if SMTG_CPP17
+-
+-#if __has_include(<filesystem>)
+-#define USE_FILESYSTEM 1
+-#elif __has_include(<experimental/filesystem>)
+-#define USE_FILESYSTEM 0
+-#endif
+-
+-#else // !SMTG_CPP17
+-
+-#define USE_FILESYSTEM 0
+-
+-#endif // SMTG_CPP17
+-
+-#if USE_FILESYSTEM == 1
+-
+-#include <filesystem>
+-namespace filesystem = std::filesystem;
+-
+-#else // USE_FILESYSTEM == 0
+-
+-// The <experimental/filesystem> header is deprecated. It is superseded by the C++17 <filesystem>
+-// header. You can define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING to silence the
+-// warning, otherwise the build will fail in VS2019 16.3.0
+-#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING
+-#include <experimental/filesystem>
+-namespace filesystem = std::experimental::filesystem;
+-
+-#endif // USE_FILESYSTEM
++// `std::filesystem` doesn't work correctly with wineg++, resulting in weird
++// memory errors. This library is a drop-in replacement.
++#include <ghc/filesystem.hpp>
++namespace filesystem = ghc::filesystem;
+ 
+ #pragma comment(lib, "Shell32")
+ 
+@@ -320,7 +295,7 @@ VST3::Optional<filesystem::path> resolveShellLink (const filesystem::path& p)
+ #elif USE_OLE
+ 	Ole::instance ();
+ 
+-	IShellLink* shellLink = nullptr;
++	IShellLinkW* shellLink = nullptr;
+ 	if (!SUCCEEDED (CoCreateInstance (CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER,
+ 	                                  IID_IShellLink, reinterpret_cast<LPVOID*> (&shellLink))))
+ 		return {};
+@@ -405,13 +380,13 @@ void findFilesWithExt (const filesystem::path& path, const std::string& ext,
+ 				filesystem::path result;
+ 				if (checkVST3Package (p, &result))
+ 				{
+-					pathList.push_back (result.generic_u8string ());
++					pathList.push_back (result.generic_string ());
+ 					continue;
+ 				}
+ 				findFilesWithExt (cp, ext, pathList, recursive);
+ 			}
+ 			else
+-				pathList.push_back (cp.generic_u8string ());
++				pathList.push_back (cp.generic_string ());
+ 		}
+ 		else if (recursive)
+ 		{
+@@ -431,18 +406,18 @@ void findFilesWithExt (const filesystem::path& path, const std::string& ext,
+ 							filesystem::path result;
+ 							if (checkVST3Package (*resolvedLink, &result))
+ 							{
+-								pathList.push_back (result.generic_u8string ());
++								pathList.push_back (result.generic_string ());
+ 								continue;
+ 							}
+ 							findFilesWithExt (*resolvedLink, ext, pathList, recursive);
+ 						}
+ 						else
+-							pathList.push_back (resolvedLink->generic_u8string ());
++							pathList.push_back (resolvedLink->generic_string ());
+ 					}
+ 					else if (filesystem::is_directory (*resolvedLink))
+ 					{
+-						const auto& str = resolvedLink->generic_u8string ();
+-						if (cp.generic_u8string ().compare (0, str.size (), str.data (),
++						const auto& str = resolvedLink->generic_string ();
++						if (cp.generic_string ().compare (0, str.size (), str.data (),
+ 						                                    str.size ()) != 0)
+ 							findFilesWithExt (*resolvedLink, ext, pathList, recursive);
+ 					}
diff --git a/gnu/packages/patches/yabridge-5.0.4-dependencies.patch b/gnu/packages/patches/yabridge-5.0.4-dependencies.patch
new file mode 100644
index 0000000000..77db050e91
--- /dev/null
+++ b/gnu/packages/patches/yabridge-5.0.4-dependencies.patch
@@ -0,0 +1,36 @@ 
+Meson fails to detect bitsery, function2 and gulrak-filesystem.
+https://github.com/robbert-vdh/yabridge/issues/18
+
+This patch removes these dependencies in "meson.build".
+
+
+diff --git a/meson.build b/meson.build
+index d8d9135b..b35ebfcd 100644
+--- a/meson.build
++++ b/meson.build
+@@ -248,22 +248,13 @@ else
+   asio_dep = dependency('asio', version : '>=1.22.0')
+ endif
+ 
+-if meson.version().version_compare('>=0.60')
+-  # Bitsery's CMake build definition is capitalized for some reason
+-  bitsery_dep = dependency('bitsery', 'Bitsery', version : '>=5.2.0')
+-else
+-  # Mmeson <=0.6.0 didn't support multiple names for a dependency, and since at
+-  # the moment this is only relevant for packing on Arch btw, it's probably
+-  # better to remove this conditional later than it is to bump the minimum Meson
+-  # version now.
+-  bitsery_dep = dependency('bitsery', version : '>=5.2.0')
+-endif
++bitsery_dep = declare_dependency()
+ 
+ # The D-Bus headers are also only accessed through the include path. We don't
+ # link to libdbus-1 to make soname changes don't completely break yabridge.
+ dbus_dep = dependency('dbus-1').partial_dependency(compile_args : true, includes : true)
+-function2_dep = dependency('function2', version : '>=4.0.0')
+-ghc_filesystem_dep = dependency('ghc_filesystem', modules : 'ghcFilesystem::ghc_filesystem', version : '>=1.5.0')
++function2_dep = declare_dependency()
++ghc_filesystem_dep = declare_dependency()
+ threads_dep = dependency('threads')
+ # Tomlplusplus recently added a shraed library version. We don't want to link to that.
+ tomlplusplus_dep = dependency('tomlplusplus', version : '>=3.3.0', default_options : ['compile_library=false']).partial_dependency(compile_args : true, includes : true)