probonopd / MultiDexed

MultiDexed
10 stars 1 forks source link

Cannot build on FreeBSD #2

Open probonopd opened 1 year ago

probonopd commented 1 year ago
% sed -i '' -e 's|stat64|stat|g'  make_helpers/juce_SimpleBinaryBuilder.cpp
% gmake                                                                    
Compiling make_helpers/juce_SimpleBinaryBuilder.cpp
Linking build/juce_simple_binary_builder
Compiling include_juce_gui_extra.cpp
Compiling juce_LinuxSubprocessHelperBinaryData.cpp
Linking NewProject - Shared Code
Linking NewProject - Standalone Plugin
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: build/MultiDexed.a(PluginProcessor_a059e380.o): in function `PluginAudioProcessor':
MultiDexed/Builds/LinuxMakefile/../../Source/PluginProcessor.cpp:20: undefined reference to `juce::VST3PluginFormat::VST3PluginFormat()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: MultiDexed/Builds/LinuxMakefile/../../Source/PluginProcessor.cpp:28: undefined reference to `juce::VST3PluginFormat::~VST3PluginFormat()'
/usr/local/bin/x86_64-unknown-freebsd13.1-ld: MultiDexed/Builds/LinuxMakefile/../../Source/PluginProcessor.cpp:28: undefined reference to `juce::VST3PluginFormat::~VST3PluginFormat()'
c++: error: linker command failed with exit code 1 (use -v to see invocation)
gmake: *** [Makefile:121: build/MultiDexed] Error 1
probonopd commented 1 year ago

This symbol is defined in JUCE/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp. So why doesn't the linker find it?

probonopd commented 1 year ago

As a workaround, disable JUCE_PLUGINHOST_VST3 in Projucer under juce_audio_processors, and enable JUCE_PLUGINHOST_VST. Also see #3.

probonopd commented 1 year ago

I built Projucer from the develop branch https://github.com/juce-framework/JUCE/tree/develop. It seems to run well on FreeBSD, and it seems to be able to produce "Linux" (read: GNU Makefile) targets.

However, it seems like for FreeBSD one has to use a special VST3 SDK that is compatible with FreeBSD.

But when setting "JUCE_CUSTOM_VST3_SDK" to "Enabled" in Projucer and entering /usr/local/include/vst3sdk under "Header Search Paths", then I get:

% gmake
Compiling include_juce_audio_plugin_client_VST3.cpp
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from JUCE/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
JUCE/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:11: error: 'base/source/fstring.h' file not found with <angled> include; use "quotes" instead
 #include <base/source/fstring.h>
          ^~~~~~~~~~~~~~~~~~~~~~~
          "base/source/fstring.h"
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from JUCE/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
In file included from JUCE/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:
JUCE/modules/juce_audio_processors/format_types/base/source/fstring.h:40:10: fatal error: 'pluginterfaces/base/ftypes.h' file not found
#include "pluginterfaces/base/ftypes.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.

If I git clone https://github.com/steinbergmedia/vst3sdk/ --recursive and set its path under "Header Search Paths", then I get:

% gmake clean
Cleaning MultiDexed
% gmake      
Compiling include_juce_audio_plugin_client_VST3.cpp
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from JUCE/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
JUCE/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:11: error: 'base/source/fstring.h' file not found with <angled> include; use "quotes" instead
 #include <base/source/fstring.h>
          ^~~~~~~~~~~~~~~~~~~~~~~
          "base/source/fstring.h"
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from JUCE/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
In file included from JUCE/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:
JUCE/modules/juce_audio_processors/format_types/base/source/fstring.h:40:10: fatal error: 'pluginterfaces/base/ftypes.h' file not found
#include "pluginterfaces/base/ftypes.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.
gmake: *** [Makefile:170: build/intermediate/Debug/include_juce_audio_plugin_client_VST3_dd633589.o] Fehler 1
% readlink -f ../../vst3sdk
vst3sdk
% gmake clean
Cleaning MultiDexed
% gmake                    
Compiling include_juce_audio_plugin_client_VST3.cpp
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from JUCE/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
In file included from JUCE/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:
In file included from vst3sdk/base/source/fstring.h:42:
In file included from vst3sdk/pluginterfaces/base/istringresult.h:19:
vst3sdk/pluginterfaces/base/funknown.h:230:17: error: expected ';' after top level declarator
int32 PLUGIN_API atomicAdd (int32& value, int32 amount);
                ^
                ;
vst3sdk/pluginterfaces/base/funknown.h:384:2: error: 'virtual' can only appear on non-static member functions
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
        ^
vst3sdk/pluginterfaces/base/funknown.h:384:28: error: expected ';' at end of declaration list
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
                                  ^
                                  ;
vst3sdk/pluginterfaces/base/funknown.h:389:2: error: 'virtual' can only appear on non-static member functions
        virtual uint32 PLUGIN_API addRef () = 0;
        ^
vst3sdk/pluginterfaces/base/funknown.h:389:17: error: duplicate member 'PLUGIN_API'
        virtual uint32 PLUGIN_API addRef () = 0;
                       ^
vst3sdk/pluginterfaces/base/funknown.h:384:18: note: previous declaration is here
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
                        ^
vst3sdk/pluginterfaces/base/funknown.h:389:27: error: expected ';' at end of declaration list
        virtual uint32 PLUGIN_API addRef () = 0;
                                 ^
                                 ;
vst3sdk/pluginterfaces/base/funknown.h:393:2: error: 'virtual' can only appear on non-static member functions
        virtual uint32 PLUGIN_API release () = 0;
        ^
vst3sdk/pluginterfaces/base/funknown.h:393:17: error: duplicate member 'PLUGIN_API'
        virtual uint32 PLUGIN_API release () = 0;
                       ^
vst3sdk/pluginterfaces/base/funknown.h:384:18: note: previous declaration is here
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
                        ^
vst3sdk/pluginterfaces/base/funknown.h:393:27: error: expected ';' at end of declaration list
        virtual uint32 PLUGIN_API release () = 0;
                                 ^
                                 ;
vst3sdk/pluginterfaces/base/funknown.h:507:26: error: no member named 'queryInterface' in 'Steinberg::FUnknown'
        if (unknown && unknown->queryInterface (getTUID<I> (), (void**)&this->ptr) != kResultOk)
                       ~~~~~~~  ^
vst3sdk/pluginterfaces/base/funknown.h:516:26: error: no member named 'queryInterface' in 'Steinberg::FUnknown'
        if (unknown && unknown->queryInterface (getTUID<I> (), (void**)&newPtr) == kResultOk)
                       ~~~~~~~  ^
vst3sdk/pluginterfaces/base/funknown.h:558:7: error: no member named 'release' in 'Steinberg::FUnknown'
                        u->release ();
                        ~  ^
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from JUCE/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from JUCE/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
In file included from JUCE/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:
In file included from vst3sdk/base/source/fstring.h:42:
vst3sdk/pluginterfaces/base/istringresult.h:35:2: error: 'virtual' can only appear on non-static member functions
        virtual void PLUGIN_API setText (const char8* text) = 0;    
        ^
vst3sdk/pluginterfaces/base/istringresult.h:35:15: error: field has incomplete type 'void'
        virtual void PLUGIN_API setText (const char8* text) = 0;    
                     ^
vst3sdk/pluginterfaces/base/istringresult.h:35:25: error: expected ';' at end of declaration list
        virtual void PLUGIN_API setText (const char8* text) = 0;    
                               ^
                               ;
vst3sdk/pluginterfaces/base/istringresult.h:54:2: error: 'virtual' can only appear on non-static member functions
        virtual void PLUGIN_API setText8 (const char8* text) = 0;    
        ^
vst3sdk/pluginterfaces/base/istringresult.h:54:15: error: field has incomplete type 'void'
        virtual void PLUGIN_API setText8 (const char8* text) = 0;    
                     ^
vst3sdk/pluginterfaces/base/istringresult.h:54:25: error: expected ';' at end of declaration list
        virtual void PLUGIN_API setText8 (const char8* text) = 0;    
                               ^
                               ;
vst3sdk/pluginterfaces/base/istringresult.h:56:2: error: 'virtual' can only appear on non-static member functions
        virtual void PLUGIN_API setText16 (const char16* text) = 0;
        ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
gmake: *** [Makefile:170: build/intermediate/Debug/include_juce_audio_plugin_client_VST3_dd633589.o] Fehler 1

What gives?

probonopd commented 1 year ago

When I change the JUCE path and JUCE modules path in Projucer to the FreeBSD-provided /usr/local/include/JUCE-7.0.3, then I get:

% gmake
Compiling include_juce_audio_plugin_client_VST3.cpp
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from /usr/local/include/JUCE-7.0.3/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from /usr/local/include/JUCE-7.0.3/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
/usr/local/include/JUCE-7.0.3/modules/juce_audio_processors/format_types/juce_VST3Headers.h:29:3: error: To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1
 #error To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1
  ^
1 error generated.
gmake: *** [Makefile:170: build/intermediate/Debug/include_juce_audio_plugin_client_VST3_dd633589.o] Fehler 1
probonopd commented 1 year ago

Maybe @yurivict knows?

yurivict commented 1 year ago

I just updated the devel/juce port to 7.0.5 - please try to build with it.

probonopd commented 1 year ago

Thanks @yurivict. Does building the 7.0.5 port with the examples (make config, check the checkbox) work for you?

probonopd commented 1 year ago

With the JUCE 7.0.5 port, when setting "JUCE_CUSTOM_VST3_SDK" to "Enabled" in Projucer and entering /usr/local/include/vst3sdk under "Header Search Paths", then I get:

% gmake -j8  
Compiling PluginEditor.cpp
Compiling include_juce_audio_plugin_client_ARA.cpp
Compiling include_juce_audio_formats.cpp
Compiling include_juce_audio_devices.cpp
Compiling include_juce_audio_plugin_client_VST3.cpp
Compiling include_juce_audio_plugin_client_utils.cpp
Compiling PluginProcessor.cpp
Compiling include_juce_audio_basics.cpp
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:11: fatal error: 'base/source/fstring.h' file not found
 #include <base/source/fstring.h>
          ^~~~~~~~~~~~~~~~~~~~~~~
Compiling include_juce_audio_processors.cpp                                                    
1 error generated.
gmake: *** [Makefile:169: build/intermediate/Debug/include_juce_audio_plugin_client_VST3_dd633589.o] Error 1
gmake: *** Waiting for unfinished jobs....

And without setting that I get:

% gmake -j8  
Compiling PluginProcessor.cpp
Compiling include_juce_audio_plugin_client_utils.cpp
Compiling include_juce_audio_formats.cpp
Compiling include_juce_audio_devices.cpp
Compiling include_juce_audio_plugin_client_ARA.cpp
Compiling include_juce_audio_basics.cpp
Compiling include_juce_audio_plugin_client_VST3.cpp
Compiling PluginEditor.cpp
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/juce_VST3Headers.h:29:3: error: To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1
 #error To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1
  ^
Compiling include_juce_audio_processors.cpp                                                    
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h:42:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:19:
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:222:17: error: expected ';' after top level declarator
int32 PLUGIN_API atomicAdd (int32& value, int32 amount);
                ^
                ;                                                                              
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:370:2: error: 'virtual' can only appear on non-static member functions
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:370:28: error: expected ';' at end of declaration list
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
                                  ^
                                  ;                                                            
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:375:2: error: 'virtual' can only appear on non-static member functions
        virtual uint32 PLUGIN_API addRef () = 0;
        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:375:17: error: duplicate member 'PLUGIN_API'
        virtual uint32 PLUGIN_API addRef () = 0;
                       ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:370:18: note: previous declaration is here
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
                        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:375:27: error: expected ';' at end of declaration list
        virtual uint32 PLUGIN_API addRef () = 0;
                                 ^
                                 ;                                                             
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:379:2: error: 'virtual' can only appear on non-static member functions
        virtual uint32 PLUGIN_API release () = 0;
        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:379:17: error: duplicate member 'PLUGIN_API'
        virtual uint32 PLUGIN_API release () = 0;
                       ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:370:18: note: previous declaration is here
        virtual tresult PLUGIN_API queryInterface (const TUID _iid, void** obj) = 0;
                        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:379:27: error: expected ';' at end of declaration list
        virtual uint32 PLUGIN_API release () = 0;
                                 ^
                                 ;                                                             
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:493:26: error: no member named 'queryInterface' in 'Steinberg::FUnknown'
        if (unknown && unknown->queryInterface (getTUID<I> (), (void**)&this->ptr) != kResultOk)
                       ~~~~~~~  ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:502:26: error: no member named 'queryInterface' in 'Steinberg::FUnknown'
        if (unknown && unknown->queryInterface (getTUID<I> (), (void**)&newPtr) == kResultOk)
                       ~~~~~~~  ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h:544:7: error: no member named 'release' in 'Steinberg::FUnknown'
                        u->release ();
                        ~  ^
In file included from ../../JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp:8:       
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/juce_audio_plugin_client_VST3.cpp:26:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:42:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/juce_VST3Headers.h:86:
In file included from /usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h:42:
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:35:2: error: 'virtual' can only appear on non-static member functions
        virtual void PLUGIN_API setText (const char8* text) = 0;    
        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:35:15: error: field has incomplete type 'void'
        virtual void PLUGIN_API setText (const char8* text) = 0;    
                     ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:35:25: error: expected ';' at end of declaration list
        virtual void PLUGIN_API setText (const char8* text) = 0;    
                               ^
                               ;                                                               
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:54:2: error: 'virtual' can only appear on non-static member functions
        virtual void PLUGIN_API setText8 (const char8* text) = 0;    
        ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:54:15: error: field has incomplete type 'void'
        virtual void PLUGIN_API setText8 (const char8* text) = 0;    
                     ^
/usr/local/include/JUCE-7.0.5/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/istringresult.h:54:25: error: expected ';' at end of declaration list
        virtual void PLUGIN_API setText8 (const char8* text) = 0;    
                               ^
                               ;                                                               
fatal error: too many errors emitted, stopping now [-ferror-limit=]                            
20 errors generated.
gmake: *** [Makefile:169: build/intermediate/Debug/include_juce_audio_plugin_client_VST3_dd633589.o] Error 1
gmake: *** Waiting for unfinished jobs....

Similar when I git clone https://github.com/steinbergmedia/vst3sdk/ --recursive and use that path.

@yurivict had you succeeded in building this repo, or just generally asked me to try 7.0.5? In any case, thanks for your help. I really appreciate it.

yurivict commented 1 year ago

The relevant patches were in this PR created by me: https://github.com/juce-framework/JUCE/pull/881

They closed it because they merged some other BSD patches, but the ones relevant for demos were left out, particularly in modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h.

I just don't have time to resubmit patches over and over again.

yurivict commented 1 year ago

I asked JUCE maintainers to merge remaining patches.

yurivict commented 1 year ago

vst3sdk has no install target (https://github.com/steinbergmedia/vst3sdk/issues/77), so users are reluctant to integrate it properly, or just copy it in, instead of doing something like find_package(vst3sdk). JUCE has some portions of vst3sdk copied in but it appears to be broken, or incomplete or outdated.