Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Upgrade to JUCE 6.1.5 + fluidsynth 2.2.5 + make Docker cross-compile parallel & ARM-native #35

Merged
merged 11 commits into from
Feb 13, 2022
Merged
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,6 @@
/build/
.DS_Store
/VST2_SDK/*
!/VST2_SDK/README.md
!/VST2_SDK/README.md
/llvm-mingw-*/
/llvm-mingw-*.tar.xz
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -187,8 +187,9 @@ target_link_libraries(JuicySFPlugin
juce::juce_recommended_lto_flags
juce::juce_recommended_warning_flags)

if (NOT BUILD_SHARED_LIBS)
# Apple clang doesn't support -static-libgcc flag, but seems to make a portable binary regardless
if (NOT BUILD_SHARED_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ ${CMAKE_EXE_LINKER_FLAGS}")
# the VST2 and VST3 distributions are "modules", so they don't listen to the EXE_LINKER flags
set(CMAKE_MODULE_LINKER_FLAGS "-static-libgcc -static-libstdc++ ${CMAKE_MODULE_LINKER_FLAGS}")
endif (NOT BUILD_SHARED_LIBS)
endif (NOT BUILD_SHARED_LIBS AND CMAKE_SYSTEM_NAME STREQUAL "Windows")
8 changes: 0 additions & 8 deletions Source/PluginProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,6 @@
#if JUCE_MAC || JUCE_IOS
#include <Foundation/NSString.h>
#include <Foundation/NSArray.h>
class X {
public:
void y() {
char z;
NSString s;
NSArray a;
}
}
#endif
#include "../JuceLibraryCode/JuceHeader.h"
#include "FluidSynthModel.h"
Expand Down
File renamed without changes.
6 changes: 6 additions & 0 deletions building.win32.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
```bash
DOCKER_BUILDKIT=0 docker build . -f win32.Dockerfile --tag=llvm-mingw
# ues this if you need to investigate any problems:
# docker run -it --rm --name llvm-mingw llvm-mingw
./distribute/bundle_win32.sh 3.0.1
```
2 changes: 1 addition & 1 deletion cmake/Modules/FindPkgConfig.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ function(_pkg_find_libs _prefix _no_cmake_path _no_cmake_environment_path _stati
${_find_opts})

mark_as_advanced(${lib_var_name})
if(lib_var_name)
if(${lib_var_name})
list(APPEND _libs "${${lib_var_name}}")
else()
list(APPEND _libs ${_pkg_search})
Expand Down
2 changes: 1 addition & 1 deletion distribute/README.x64.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ VST2\libjuicysfplugin.dll -> "C:\Program Files\Common Files\VST2\libjuicysfplugi
VST3\juicysfplugin.vst3 -> "C:\Program Files\Common Files\VST3\juicysfplugin.vst3"
Standalone\juicysfplugin.exe -> "C:\Program Files\Birchlabs\juicysfplugin.exe"

### Upgrading from a previous version of juicysfplugin
### Upgrading from juicysfplugin 2.x or older

Run the uninstaller that came with juicysfplugin, or delete the files that are described in these release notes:
https://github.com/Birch-san/juicysfplugin/releases/tag/2.3.3
Expand Down
2 changes: 1 addition & 1 deletion distribute/README.x86.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ VST2\libjuicysfplugin.dll -> "C:\Program Files (x86)\Common Files\VST2\libjuicys
VST3\juicysfplugin.vst3 -> "C:\Program Files (x86)\Common Files\VST3\juicysfplugin.vst3"
Standalone\juicysfplugin.exe -> "C:\Program Files (x86)\Birchlabs\juicysfplugin.exe"

### Upgrading from a previous version of juicysfplugin
### Upgrading from juicysfplugin 2.x or older

Run the uninstaller that came with juicysfplugin, or delete the files that are described in these release notes:
https://github.com/Birch-san/juicysfplugin/releases/tag/2.3.3
Expand Down
13 changes: 8 additions & 5 deletions distribute/bundle_win32.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# ./bundle_win32.sh 3.0.0
# ./bundle_win32.sh 3.1.0

set -eo pipefail
DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
Expand All @@ -9,7 +9,10 @@ mkdir -p "$OUT"

VERSION="$1"

declare -a ARCHS=("x64" "x86")
# x86 build fails in JUCE 6.1.5; problem compiling UUIDGetter
# https://gist.github.com/Birch-san/a36b10155e51bd814ecc7109501e1e64
# declare -a ARCHS=("x64" "x86")
declare -a ARCHS=("x64")

# macOS bundled GNU bash doesn't support associative arrays
arch_long_ix() {
Expand Down Expand Up @@ -50,9 +53,9 @@ for ARCH in ${ARCHS[@]}; do
VST3="$ARCH_OUT/VST3"
mkdir -p "$VST3"

docker cp "$CONTAINER_NAME":"/build/juicysfplugin/build_$ARCH/JuicySFPlugin_artefacts/$FLAVOUR/Standalone/juicysfplugin.exe" "$STANDALONE/juicysfplugin.exe"
docker cp "$CONTAINER_NAME":"/build/juicysfplugin/build_$ARCH/JuicySFPlugin_artefacts/$FLAVOUR/VST/libjuicysfplugin.dll" "$VST2/libjuicysfplugin.dll"
docker cp "$CONTAINER_NAME":"/build/juicysfplugin/build_$ARCH/JuicySFPlugin_artefacts/$FLAVOUR/VST3/juicysfplugin.vst3/Contents/$ARCH_LONG/juicysfplugin.vst3" "$VST3/juicysfplugin.vst3"
docker cp "$CONTAINER_NAME":"$ARCH/$FLAVOUR/Standalone/juicysfplugin.exe" "$STANDALONE/juicysfplugin.exe"
docker cp "$CONTAINER_NAME":"$ARCH/$FLAVOUR/VST/libjuicysfplugin.dll" "$VST2/libjuicysfplugin.dll"
docker cp "$CONTAINER_NAME":"$ARCH/$FLAVOUR/VST3/juicysfplugin.vst3/Contents/$ARCH_LONG/juicysfplugin.vst3" "$VST3/juicysfplugin.vst3"

cp -r "$DIR/../licenses_of_dependencies" "$ARCH_OUT"
cp "$DIR/../LICENSE.txt" "$ARCH_OUT"
Expand Down
130 changes: 109 additions & 21 deletions win32.Dockerfile
Original file line number Diff line number Diff line change
@@ -1,28 +1,104 @@
# DOCKER_BUILDKIT=0 docker build . -f win32.Dockerfile --tag=llvm-mingw
# docker build . -f win32.Dockerfile --tag=llvm-mingw
# docker run -it --rm --name llvm-mingw llvm-mingw
# docker cp get_fluidsynth_deps.sh llvm-mingw:/build/get_fluidsynth_deps.sh && docker exec llvm-mingw /build/get_fluidsynth_deps.sh
ARG UBUNTU_VER=22.04

FROM mstorsjo/llvm-mingw
RUN dpkg --add-architecture i386 && \
apt-get update -qq && \
FROM ubuntu:$UBUNTU_VER AS wgetter
RUN apt-get update -qq && \
apt-get install -qqy --no-install-recommends \
zstd libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libfreetype6-dev wine-stable wine32 && \
wget ca-certificates && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*
COPY win32_cross_compile/clone_fluidsynth.sh clone_fluidsynth.sh
RUN /build/clone_fluidsynth.sh
COPY win32_cross_compile/install.sh install.sh
COPY win32_cross_compile/get_fluidsynth_deps.sh get_fluidsynth_deps.sh
RUN /build/get_fluidsynth_deps.sh
COPY win32_cross_compile/x86_64_toolchain.cmake x86_64_toolchain.cmake
COPY win32_cross_compile/i686_toolchain.cmake i686_toolchain.cmake
COPY win32_cross_compile/aarch64_toolchain.cmake aarch64_toolchain.cmake
COPY win32_cross_compile/make_minimal_fluidsynth.sh make_minimal_fluidsynth.sh
RUN /build/make_minimal_fluidsynth.sh

FROM wgetter AS get_llvm_mingw
COPY win32_cross_compile/download_llvm_mingw.sh download_llvm_mingw.sh
ARG LLVM_MINGW_VER=20220209
RUN LLVM_MINGW_VER=$LLVM_MINGW_VER ./download_llvm_mingw.sh download_llvm_mingw.sh

FROM ubuntu:$UBUNTU_VER AS gitter
RUN apt-get update -qq && \
apt-get install -qqy --no-install-recommends \
git ca-certificates && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*

FROM gitter AS get_juce
COPY win32_cross_compile/clone_juce.sh clone_juce.sh
RUN /build/clone_juce.sh
RUN ./clone_juce.sh

FROM gitter AS get_fluidsynth
COPY win32_cross_compile/clone_fluidsynth.sh clone_fluidsynth.sh
RUN ./clone_fluidsynth.sh

FROM ubuntu:$UBUNTU_VER AS toolchain
RUN apt-get update -qq && \
apt-get install -qqy --no-install-recommends \
xz-utils cmake build-essential pkg-config && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*
COPY --from=get_llvm_mingw llvm-mingw.tar.xz llvm-mingw.tar.xz
# here's how to merge it into existing /bin, but that could have unintended clashes
# RUN tar -xvf llvm-mingw.tar.xz --strip-components=1 -k && rm llvm-mingw.tar.xz
RUN mkdir -p /opt/llvm-mingw && tar -xvf llvm-mingw.tar.xz --strip-components=1 -C /opt/llvm-mingw && rm llvm-mingw.tar.xz
ENV PATH="/opt/llvm-mingw/bin:$PATH"
COPY win32_cross_compile/x86_64_toolchain.cmake /x86_64_toolchain.cmake
COPY win32_cross_compile/i686_toolchain.cmake /i686_toolchain.cmake
COPY win32_cross_compile/aarch64_toolchain.cmake /aarch64_toolchain.cmake

FROM ubuntu:$UBUNTU_VER AS make_juce
RUN apt-get update -qq && \
apt-get install -qqy --no-install-recommends \
cmake build-essential pkg-config libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libfreetype6-dev && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*
COPY --from=get_juce JUCE JUCE
COPY win32_cross_compile/make_juce.sh make_juce.sh
RUN /build/make_juce.sh
RUN ./make_juce.sh

FROM wgetter AS msys2_deps
RUN apt-get update -qq && \
apt-get install -qqy --no-install-recommends \
zstd && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*
COPY win32_cross_compile/get_fluidsynth_deps.sh get_fluidsynth_deps.sh
RUN ./get_fluidsynth_deps.sh

FROM toolchain AS make_fluidsynth_x86
COPY --from=msys2_deps clang32 clang32
COPY --from=get_fluidsynth fluidsynth fluidsynth
COPY win32_cross_compile/configure_fluidsynth.sh configure_fluidsynth.sh
RUN ./configure_fluidsynth.sh x86
COPY win32_cross_compile/build_fluidsynth.sh build_fluidsynth.sh
RUN ./build_fluidsynth.sh x86

FROM toolchain AS make_fluidsynth_x64
COPY --from=msys2_deps clang64 clang64
COPY --from=get_fluidsynth fluidsynth fluidsynth
COPY win32_cross_compile/configure_fluidsynth.sh configure_fluidsynth.sh
RUN ./configure_fluidsynth.sh x64
COPY win32_cross_compile/build_fluidsynth.sh build_fluidsynth.sh
RUN ./build_fluidsynth.sh x64

FROM toolchain AS juicysfplugin_common
RUN apt-get update -qq && \
apt-get install -qqy --no-install-recommends \
libfreetype6-dev && \
apt-get clean -y && \
rm -rf /var/lib/apt/lists/*
COPY --from=make_juce /linux_native/ /linux_native/
COPY --from=msys2_deps /clang32/ /clang32/
COPY --from=msys2_deps /clang64/ /clang64/
COPY --from=make_fluidsynth_x64 /clang64/include/fluidsynth.h /clang64/include/fluidsynth.h
COPY --from=make_fluidsynth_x64 /clang64/include/fluidsynth/ /clang64/include/fluidsynth/
COPY --from=make_fluidsynth_x64 /clang64/lib/pkgconfig/fluidsynth.pc /clang64/lib/pkgconfig/fluidsynth.pc
COPY --from=make_fluidsynth_x64 /clang64/lib/libfluidsynth.a /clang64/lib/libfluidsynth.a
COPY --from=make_fluidsynth_x86 /clang32/include/fluidsynth.h /clang32/include/fluidsynth.h
COPY --from=make_fluidsynth_x86 /clang32/include/fluidsynth/ /clang32/include/fluidsynth/
COPY --from=make_fluidsynth_x86 /clang32/lib/pkgconfig/fluidsynth.pc /clang32/lib/pkgconfig/fluidsynth.pc
COPY --from=make_fluidsynth_x86 /clang32/lib/libfluidsynth.a /clang32/lib/libfluidsynth.a
COPY win32_cross_compile/fix_mingw_headers.sh fix_mingw_headers.sh
RUN ./fix_mingw_headers.sh
COPY win32_cross_compile/attrib_noop.sh /usr/local/bin/attrib
WORKDIR juicysfplugin
COPY VST2_SDK/ /VST2_SDK/
COPY resources/Logo512.png resources/Logo512.png
Expand All @@ -31,7 +107,19 @@ COPY Source/ Source/
COPY JuceLibraryCode/JuceHeader.h JuceLibraryCode/JuceHeader.h
COPY CMakeLists.txt CMakeLists.txt
COPY win32_cross_compile/configure_juicysfplugin.sh configure_juicysfplugin.sh
RUN /build/juicysfplugin/configure_juicysfplugin.sh
COPY win32_cross_compile/attrib.sh /usr/local/bin/attrib

FROM juicysfplugin_common AS juicysfplugin_x86
RUN /juicysfplugin/configure_juicysfplugin.sh x86
COPY win32_cross_compile/make_juicysfplugin.sh make_juicysfplugin.sh
RUN /juicysfplugin/make_juicysfplugin.sh x86

FROM juicysfplugin_common AS juicysfplugin_x64
RUN /juicysfplugin/configure_juicysfplugin.sh x64
COPY win32_cross_compile/make_juicysfplugin.sh make_juicysfplugin.sh
RUN /build/juicysfplugin/make_juicysfplugin.sh
RUN /juicysfplugin/make_juicysfplugin.sh x64

FROM ubuntu:$UBUNTU_VER AS distribute
# x86 build fails in JUCE 6.1.5; problem compiling UUIDGetter
# https://gist.github.com/Birch-san/a36b10155e51bd814ecc7109501e1e64
# COPY --from=juicysfplugin_x86 /juicysfplugin/build_x86/JuicySFPlugin_artefacts/ /x86/
COPY --from=juicysfplugin_x64 /juicysfplugin/build_x64/JuicySFPlugin_artefacts/ /x64/
2 changes: 0 additions & 2 deletions win32_cross_compile/attrib.sh

This file was deleted.

9 changes: 9 additions & 0 deletions win32_cross_compile/attrib_noop.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env bash
# attrib is a win32 executable used for modifying file attributes.
# the JUCE build uses it to apply a folder icon to the VST3 folder.
# we can run attrib.exe in Wine, but for aarch64 Ubuntu that entails
# building Wine from source.
# alternatively we could use the Unix utility fattr.
# but we would need to do this on a FAT or NTFS filesystem.
# this is quite high-effort just for the sake of putting an icon on a folder.
>&2 echo "Skipping execution of attrib, with args $@"
33 changes: 33 additions & 0 deletions win32_cross_compile/build_fluidsynth.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#!/usr/bin/env bash
set -eo pipefail
shopt -s nullglob

cd fluidsynth

if test -n "$1"; then
declare -a ARCHS=("$1")
else
# declare -a ARCHS=("x64" "x86" "arm64")
declare -a ARCHS=("x64" "x86")
fi

declare -A TOOLCHAINS=( [x64]=x86_64 [x86]=i686 [arm64]=aarch64 )
declare -A REPOS=( [x64]=clang64 [x86]=clang32 [arm64]=clangarm64 )

for ARCH in ${ARCHS[@]}; do
echo "arch: $ARCH"

REPO="${REPOS[$ARCH]}"
echo "repo: $REPO"

BUILD="build_$ARCH"

cmake --build "$BUILD" --target libfluidsynth
# manual installation; not sure how to ask it to "only install libfluidsynth".
cp "$BUILD"/fluidsynth.pc "/$REPO/lib/pkgconfig/"
cp "$BUILD"/src/libfluidsynth*.a "/$REPO/lib/libfluidsynth.a"
mkdir -p /$REPO/include/fluidsynth
cp include/fluidsynth/*.h "/$REPO/include/fluidsynth/"
cp "$BUILD"/include/fluidsynth.h "/$REPO/include/fluidsynth.h"
cp "$BUILD"/include/fluidsynth/*.h "/$REPO/include/fluidsynth/"
done
2 changes: 1 addition & 1 deletion win32_cross_compile/clone_fluidsynth.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
exec git clone --branch v2.2.4 --depth 1 https://github.com/FluidSynth/fluidsynth.git
exec git clone --branch v2.2.5 --depth 1 https://github.com/FluidSynth/fluidsynth.git
2 changes: 1 addition & 1 deletion win32_cross_compile/clone_juce.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/usr/bin/env bash
exec git clone --branch 6.1.2-build-VST3-on-mingw --depth 1 https://github.com/Birch-san/JUCE.git
exec git clone --branch 6.1.5 --depth 1 https://github.com/juce-framework/JUCE.git
2 changes: 0 additions & 2 deletions win32_cross_compile/clone_juicysfplugin.sh

This file was deleted.

67 changes: 67 additions & 0 deletions win32_cross_compile/configure_fluidsynth.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#!/usr/bin/env bash
set -eo pipefail
shopt -s nullglob

cd fluidsynth

if test -n "$1"; then
declare -a ARCHS=("$1")
else
# declare -a ARCHS=("x64" "x86" "arm64")
declare -a ARCHS=("x64" "x86")
fi

declare -A TOOLCHAINS=( [x64]=x86_64 [x86]=i686 [arm64]=aarch64 )
declare -A REPOS=( [x64]=clang64 [x86]=clang32 [arm64]=clangarm64 )

for ARCH in ${ARCHS[@]}; do
echo "arch: $ARCH"

REPO="${REPOS[$ARCH]}"
echo "repo: $REPO"

TOOLCHAIN="${TOOLCHAINS[$ARCH]}"
echo "toolchain: $TOOLCHAIN"
TOOLCHAIN_FILE="/${TOOLCHAIN}_toolchain.cmake"
echo "toolchain file: $TOOLCHAIN_FILE"

BUILD="build_$ARCH"

# OpenMP doesn't support static libraries on Windows:
# https://github.com/llvm/llvm-project/blob/main/openmp/README.rst#options-for-libomp
# Yet, our priority is "statically-link everything" (in order to build a single-file binary,
# which can be installed by drag-and-drop).
PKG_CONFIG_PATH="/$REPO/lib/pkgconfig" cmake -B"$BUILD" -DCMAKE_INSTALL_PREFIX="/$REPO" \
-DBUILD_SHARED_LIBS=off \
-Denable-portaudio=off \
-Denable-dbus=off \
-Denable-aufile=off \
-Denable-ipv6=off \
-Denable-jack=off \
-Denable-ladspa=off \
-Denable-libinstpatch=off \
-Denable-libsndfile=on \
-Denable-midishare=off \
-Denable-opensles=off \
-Denable-oboe=off \
-Denable-network=off \
-Denable-oss=off \
-Denable-dsound=off \
-Denable-wasapi=off \
-Denable-waveout=off \
-Denable-winmidi=off \
-Denable-sdl2=off \
-Denable-pkgconfig=on \
-Denable-pulseaudio=off \
-Denable-readline=off \
-Denable-threads=on \
-Denable-openmp=off \
-Denable-coreaudio=off \
-Denable-coremidi=off \
-Denable-framework=off \
-Denable-lash=off \
-Denable-alsa=off \
-Denable-systemd=off \
-DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" \
-DCMAKE_BUILD_TYPE=Release
done
Loading