I am dipping my toe once again into the waters of LV2 development.
My machine is a MacBook M1.
I am able to run the MOD Desktop App successfully on it and have built an existing LV2 plugin (To make sure my toolchain works) with the view of then starting in on the midi drum machine LV2 I want to build.
I have created a virtual machine on my system (Using UTM), it is running Debian Bullseye ARM64 (I’ve had a play with Bookworm, but found various problems getting things to work … I think the new python on it is the cause).
I’ve downloaded the mod-plugin-builder and it nicely churned through the ./bootstrap.sh moddwarf-new and ./build x42-midifilter, depositing the plugin files in ~/mod-workdir/moddwarf-new/plugins
Initially, I want to use the MOD Desktop App for an easier development cycle …
Which platform do I need to build for to target the Mac version of the MOD Desktop App?. @falkTX?
you want to have plugins built natively, not for Linux and not for MOD units.
the actual binaries are native system binaries, so macOS ARM/Apple-Silicon in your case.
So I’ve done the following on my Mac (Not in a VM) I already had xcode command line tools installed.
cd ~/git
git clone git@github.com:DISTRHO/PawPaw.git
I then tried
cd PawPaw
./bootstrap-plugins.sh native
and after several iterations, from the error messages, I concluded I needed some more dependencies installed, so brew install cmake gawk coreutils libtool make
at this point, running ./bootstrap-plugins.sh native
produces copious output, culminating in
I have a mac mini M1, can have a look at this soon. but seems it is failing to set the correct flags for the “native” build.
Try like this:
# skip LTO, can be slow to build and we are just testing thing here anyhow
export PAWPAW_SKIP_LTO=1
# also skip tests, we dont care just yet
export PAWPAW_SKIP_TESTS=1
# try building common deps, specifying the target manually
./bootstrap-common.sh macos-universal-10.15
Thanks @falkTX ,
I removed ~/PawPawBuilds and then executed
# skip LTO, can be slow to build and we are just testing thing here anyhow
export PAWPAW_SKIP_LTO=1
# also skip tests, we dont care just yet
export PAWPAW_SKIP_TESTS=1
# try building common deps, specifying the target manually
./bootstrap-common.sh macos-universal-10.15 2>&1 | tee outputA.log
the output ended with
CC sharedbook.lo
CC lookup.lo
CC bitrate.lo
1 warning generated.
CC vorbisfile.lo
CC vorbisenc.lo
CCLD test_sharedbook
CCLD libvorbis.la
ld: unknown options: -force_cpusubtype_ALL
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [test_sharedbook] Error 1
make[3]: *** Waiting for unfinished jobs....
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: for architecture: x86_64 file: .libs/libvorbis.a(lookup.o) has no symbols
vorbisfile.c:1992:24: warning: unused variable 'fpu' [-Wunused-variable]
vorbis_fpu_control fpu;
^
1 warning generated.
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
Apple really loves to break things in non-backwards-compatible ways.
They introduced a new linker that takes different flags, breaking a bunch of stuff in the process.
For now we still have the chance to use the older linker through a special flag, which unblocks this
You are a superstar@falkTX … thank you!
After a git pull
running ./bootstrap-plugins.sh native
started reporting a few more missings from my system brew install autoconf meson
I addressed these and now it runs to successful completion for me
Next step is to build some plugins!
Apple eh!?
My very first exposure to Apple was back in the the early 80s with the Apple IIe, then the Lisa (Predecessor to the original Mac) and so on.
They have always had to do things … differently!.
My 30 odd years of professional IT work was never Apple based, but when I retrained as a nurse in 2015 I dove back into the Apple ecosystem and I love it (I’m really blessed to own a Mac Mini Intel, Mac Mini M1, MacBook M1, iPad, iPhone), this video always makes me smile!
“Using a Mac’s a little different then using a PC, it’s not so much operating a computer as it is sort of tricking it, fooling it into doing what you really want it to do! Ah … you kind of have to sneak up on a Mac”
How can I build a MPB plugin for the MOD Desktop app on my M1 system using PawPaw now that I can run ./bootstrap-plugins.sh native successfully?
Can I copy over a directory from the MBP repo, or do I need to generate my own make files or …
you clone GitHub - moddevices/mod-app: MOD Audio for the desktop and just run “make” on that.
the bootstrap was partially done already, but it will still build Qt and lv2 plugins before the macOS app so it will take a little bit.
Thank you @falkTX !
So I cloned mod-app (I also did a submodule update to pull in the PawPaw changes)
On my system, gmake pulls in the later version of GNU Make installed by brew
❯ make -v
GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for i386-apple-darwin11.3.0
❯ gmake -v
GNU Make 4.4.1
Built for aarch64-apple-darwin23.0.0
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
So I did
cd ~/mod-app
gmake
it seemed to run well (For quite a few minutes) but then reported
Using /Users/smanth/PawPawBuilds/targets/macos-universal-10.15/lib/python3.9/site-packages/importlib_metadata-4.10.1-py3.9.egg
Searching for zipp==3.4.0
Best match: zipp 3.4.0
Processing zipp-3.4.0-py3.9.egg
zipp 3.4.0 is already the active version in easy-install.pth
Using /Users/smanth/PawPawBuilds/targets/macos-universal-10.15/lib/python3.9/site-packages/zipp-3.4.0-py3.9.egg
Finished processing dependencies for cx-Freeze==6.8.4
~/git/mod-app/src/PawPaw
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 46.3M 100 46.3M 0 0 3112k 0 0:00:15 0:00:15 --:--:-- 3763k
patching file 'src/gui/painting/qdrawhelper.cpp'
patching file 'src/gui/painting/qdrawhelper_sse2.cpp'
patching file 'src/plugins/platforms/cocoa/qiosurfacegraphicsbuffer.h'
~/PawPawBuilds/builds/macos-universal-10.15/qtbase-everywhere-src-5.12.12 ~/git/mod-app/src/PawPaw
Creating qmake...
..Done.
Info: creating cache file /Users/smanth/PawPawBuilds/builds/macos-universal-10.15/qtbase-everywhere-src-5.12.12/.qmake.cache
Info: creating stash file /Users/smanth/PawPawBuilds/builds/macos-universal-10.15/qtbase-everywhere-src-5.12.12/.qmake.stash
Project ERROR: failed to parse default search paths from compiler output
gmake: *** [Makefile:626: /Users/smanth/PawPawBuilds/targets/macos-universal-10.15/bin/cxfreeze] Error 3
subsequent invocations of gmake --debug produces
❯ gmake --debug
GNU Make 4.4.1
Built for aarch64-apple-darwin23.0.0
Copyright (C) 1988-2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Reading makefiles...
Updating makefiles....
Updating goal targets....
File 'all' does not exist.
File 'build-ui/lib/libmod_utils.so' does not exist.
File 'src/mod-ui/utils/libmod_utils.so' does not exist.
File '/Users/smanth/PawPawBuilds/targets/macos-universal-10.15/bin/jackd' does not exist.
Must remake target '/Users/smanth/PawPawBuilds/targets/macos-universal-10.15/bin/jackd'.
./src/PawPaw/bootstrap-mod.sh macos-universal-10.15
~/PawPawBuilds/builds/macos-universal-10.15/qtbase-everywhere-src-5.12.12 ~/git/mod-app/src/PawPaw
Creating qmake...
...............Done.
Project ERROR: failed to parse default search paths from compiler output
gmake: *** [Makefile:626: /Users/smanth/PawPawBuilds/targets/macos-universal-10.15/bin/jackd] Error 3
Feels SO close, but I can’t figure the issue.
Sam x
which stops the previous ERROR, but a new one has emerged
❯ gmake
./src/PawPaw/bootstrap-mod.sh macos-universal-10.15
~/PawPawBuilds/builds/macos-universal-10.15/qtbase-everywhere-src-5.12.12 ~/git/mod-app/src/PawPaw
Creating qmake...
...Done.
This is the Qt Open Source Edition.
You have already accepted the terms of the Open Source license.
Running configuration tests...
Done running configuration tests.
Configure summary:
Build type: macx-clang (arm64, CPU features: neon crc32)
Compiler: clang (Apple) 15.0.0
Configuration: largefile neon optimize_size silent shared qt_framework rpath release c++11 c++14 concurrent reduce_exports stl
Build options:
Mode ................................... release
Optimize release build for size ........ yes
Building shared libraries .............. yes
Using C standard ....................... C11
Using C++ standard ..................... C++14
Using ccache ........................... no
Using gold linker ...................... no
Using precompiled headers .............. no
Using LTCG ............................. no
Target compiler supports:
NEON ................................. yes
Build parts ............................ libs tools
App store compliance ................... no
Qt modules and options:
Qt Concurrent .......................... yes
Qt D-Bus ............................... no
Qt D-Bus directly linked to libdbus .... no
Qt Gui ................................. yes
Qt Network ............................. yes
Qt Sql ................................. yes
Qt Testlib ............................. yes
Qt Widgets ............................. yes
Qt Xml ................................. yes
Support enabled for:
Using pkg-config ....................... yes
udev ................................... no
Using system zlib ...................... no
Qt Core:
DoubleConversion ....................... yes
Using system DoubleConversion ........ no
GLib ................................... no
iconv .................................. no
ICU .................................... no
Tracing backend ........................ <none>
Logging backends:
journald ............................. no
syslog ............................... no
slog2 ................................ no
Using system PCRE2 ..................... no
Qt Network:
CoreWLan ............................... yes
getifaddrs() ........................... yes
IPv6 ifname ............................ yes
libproxy ............................... no
SecureTransport ........................ no
OpenSSL ................................ no
Qt directly linked to OpenSSL ........ no
OpenSSL 1.1 ............................ no
DTLS ................................... no
SCTP ................................... no
Use system proxies ..................... yes
Qt Gui:
Accessibility .......................... yes
FreeType ............................... yes
Using system FreeType ................ no
HarfBuzz ............................... yes
Using system HarfBuzz ................ no
Fontconfig ............................. no
Image formats:
GIF .................................. no
ICO .................................. no
JPEG ................................. yes
Using system libjpeg ............... no
PNG .................................. yes
Using system libpng ................ no
EGL .................................... no
OpenVG ................................. no
OpenGL:
Desktop OpenGL ....................... yes
OpenGL ES 2.0 ........................ no
OpenGL ES 3.0 ........................ no
OpenGL ES 3.1 ........................ no
OpenGL ES 3.2 ........................ no
Vulkan ................................. no
Session Management ..................... yes
Features used by QPA backends:
evdev .................................. no
libinput ............................... no
INTEGRITY HID .......................... no
mtdev .................................. no
tslib .................................. no
xkbcommon .............................. no
X11 specific:
XLib ................................. no
XCB Xlib ............................. no
EGL on X11 ........................... no
QPA backends:
DirectFB ............................... no
EGLFS .................................. no
LinuxFB ................................ no
VNC .................................... no
Mir client ............................. no
Qt Sql:
SQL item models ........................ yes
Qt Widgets:
GTK+ ................................... no
Styles ................................. Fusion macOS Windows
Qt PrintSupport:
CUPS ................................... no
Qt Sql Drivers:
DB2 (IBM) .............................. no
InterBase .............................. no
MySql .................................. no
OCI (Oracle) ........................... no
ODBC ................................... no
PostgreSQL ............................. no
SQLite2 ................................ no
SQLite ................................. yes
Using system provided SQLite ......... no
TDS (Sybase) ........................... no
Qt Testlib:
Tester for item models ................. yes
ERROR: Feature 'system-zlib' was enabled, but the pre-condition 'libs.zlib' failed.
Check config.log for details.
gmake: *** [Makefile:626: /Users/smanth/PawPawBuilds/targets/macos-universal-10.15/bin/jackd] Error 3
And config.log has what seems a load of nasty warnings/errors in it!
My issues seem to be due to me using an M1 … the online github builds for MacOS seem to run fine.
Giveen the huge number of warnings/errors I’m seeing with the QT stuff, I’m thinking that it might be better to extract just the plugin build code, I don’t really need to build the whole MOD Desktop App, I just want to do an LV2 development and then deploy it to use with the App on my Mac (And also to my Dwarf once it is working) … but I’m struggling to figure out how to do it! (My makefile skills are low).
I wonder if @falktx might be able to suggest how to do so?
After scouring the makefile and build scripts I tried the following
make PAWPAW_SKIP_QT=1 plugins
and after some time, I now have a directory full of LV2 plugins. I’ve checked them with lipo -archs and they report x86_64 arm64.
So, the steps overall (MacBook M1 running Sonoma 14.2.1)
# Grab the mod-app repo
cd ~/git
git clone --recurse-submodules git@github.com:moddevices/mod-app.git
There are a number of prequisites, including xcode command tools. I use brew to install such things on my Mac.
Installing brew will itself cause xcode command tools to be installed (If not already on the system) and then brew can be used to install the other stuff needed
For some reason, not all of the plugins I expect are there, for instance “aidadsp-lv2” is not; it appears to be listed in the makefile to be built and I can see workproducts being created in ~/PawPawBuilds/builds/macos-universal-10.15/aidadsp-lv2-bb2751b52d50c9b926780dc4063be2ca79dc775b but I cannot see the LV2 plugin folder/files for it.
But my next step is to try to add a simple LV2 of my own and build/deploy it.
I’ve managed to build my VERY FIRST LV2 plugin, the eg-amp-labs.lv2 sample in mod-plugin-builder.
I could not get it to work using the mod-app make process detailed above, despite adding it to the plugin build targets … the makefiles are totally messing with my head!
Instead, I succeeded using PawPaw.
I got the source from
I dropped this into a folder called eg-amp.lv2 in my own source tree, giving me this.
I could not figure out a better way of ensuring it was targetting MacOS then adding a line to Makefile.mk
# Install dependencies
brew install autoconf automake cmake coreutils gawk git gnu-sed jq make meson p7zip wget
cd ~/git
# Grab the PawPaw repo
git clone git@github.com:DISTRHO/PawPaw.git
# change dir to PawPaw root folder
cd ~/git/PawPaw
# build plugin dependencies for target (only needed once)
./bootstrap-plugins.sh macos-universal-10.15
# set up environment variables for macos-universal-10.15 builds with PawPaw static libs
source local.env macos-universal-10.15
# change dir to your own project and build
cd ~/git/eg-amp.lv2
gmake
and it built!
I created an LV2 directory in the right place, which on a Mac is
inside ~/Library/Audio/Plug-Ins and then I copied the eg-amp.lv2 folder into it.
@SamIAm Congratulations on your perseverance and success! I really appreciate you taking the time to document your steps and will keep this bookmarked in hopes of making use. I’d like to be able to build some of the familiar Calf / Gx* plugins for MOD App and be available to help make Mac-targeted builds for the plugin suite. Thanks for working through the tedious steps for the rest of us.