A lot of thrashing was involved. So first I'll list the steps that I _know_ are necessary. Then after that I'll list the steps which were probably unnecessary. # Definitely necessary ## Install Visual Studio Community: https://www.visualstudio.com/ ## Install [VST3 Audio Plug-Ins SDK](https://www.steinberg.net/en/company/developers.html) Such that this folder exists: ``` C:\SDKs\VST_SDK\VST3_SDK ``` ## Install JUCE framework https://shop.juce.com/get-juce JUCE should be installed to `C:\Juce` _Note: the only thing we actually need from here is `C:\Juce\modules`. I've copied that into the repository now, so soon I'll be able to make that step skippable._ ## That's all. Probably. Well, unless you're also interested in the Setup project: ## Configure "Setup" project This is project constructs a .exe and .msi installer (i.e. for distributing the synth). ### Install support for Visual Studio Setup projects https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.MicrosoftVisualStudio2017InstallerProjects ### Fix unrecoverable build error Register MergeMod.dll https://stackoverflow.com/questions/42624572/unrecoverable-build-error-whilst-trying-to-build-setup-on-vs2015 If you encounter "Unrecoverable build error" when building juicysfplugin's setup.exe installer, you need to open an administrator prompt and register MergeMod.dll: ```bash regsvr32 "C:\Program Files (x86)\Common Files\microsoft shared\MSI Tools\MergeMod.dll" ``` You may also need to run Visual Studio as Adminstrator. You should also consider closing the solution, deleting Visual Studio's temp files (e.g. any file touched today) inside: ``` %LocalAppData%\Temp ``` ...then re-openng the solution, and attempting build again. # Necessary for changing the dependencies If you want to build against a newer version of fluidsynth, you'll need libfluidsynth.dll and friends. The way I originally got these was from MSYS2's MinGW repository. ## Install msys2 toolchain (x86_64): http://www.msys2.org/ > MSYS2 is a software distro and building platform for Windows > an independent rewrite of MSYS, based on modern Cygwin (POSIX compatibility layer) and MinGW-w64 > provides a bash shell, Autotools, revision control systems and the like for building native Windows applications using MinGW-w64 toolchains > features a package management system to provide easy installation of packages, Pacman ## Grab latest package definitions: Press the Start key to search for and launch an MSYS2 command prompt. Named `MSYS2 MinGW 64-bit`. ``` pacman -Syu ``` It may ask you to close the terminal and run update one more time: ``` pacman -Su ``` ## Install libfluidsynth.dll: https://github.com/Alexpux/MINGW-packages/blob/master/mingw-w64-fluidsynth/PKGBUILD ``` pacman -S --needed mingw64/mingw-w64-x86_64-fluidsynth ``` ## Learn about how to make changes to PKGBUILD If you want to change compile flags on the [fluidsynth package](https://github.com/Alexpux/MINGW-packages/blob/master/mingw-w64-fluidsynth/PKGBUILD), you'll need to clone the MINGW-packages repository, edit `mingw-w64-fluidsynth/PKGBUILD`, and build with `makepkg-mingw -sCLf`. https://github.com/msys2/msys2/wiki/Creating-Packages#re-building-a-package ```bash git clone "https://github.com/Alexpux/MINGW-packages" cd MINGW-packages/mingw-w64-fluidsynth makepkg-mingw -sCLf pacman -U mingw-w64-*-fluidsynth-*-any.pkg.tar.xz ``` ## Learn about dynamic linking You can use `ldd` to check where a dll looks for its dependencies: ``` $ ldd /mingw64/bin/libfluidsynth-1.dll libsndfile-1.dll => /mingw64/bin/libsndfile-1.dll (0x70440000) … ``` Side-note: [fuslogvw](https://docs.microsoft.com/en-us/dotnet/framework/tools/fuslogvw-exe-assembly-binding-log-viewer) helps you debug .NET's run-time linker. Not relevant to juicysfplugin (because it's not managed code), but it's a useful tool for Windows developers to know about. # Prefer CLion? We don't have Windows support in our CMake project (I could add it by using Projucer to generate a CODE::Blocks exporter, but I don't want to maintain that). Anyway, here's my notes. ## Install CLion https://www.jetbrains.com/clion/nextversion/ ## Install MinGW toolchain Required for CLion integration. https://stackoverflow.com/questions/36375081/how-to-run-clion-with-msys2-on-windows You don't need all the packages here (like Ada, Fortran, Objective-C...), but space is cheap so just install all. ```bash pacman -S --needed mingw-w64-x86_64-toolchain ``` ## Configure CLion Add MinGW Toolchain: ``` C:\msys64\mingw64 ``` # Want to use Visual Studio upon a CMake project? We don't have Windows support in our CMake project (see "Prefer CLion?" section for brief explanation), but I wrote some notes on this whilst I was thrashing around. ## Configure Visual Studio build environment https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC#Settingtheenvironment Sets source and target architecture to x64: ```cmd "C:\Program Files (x86)\Microsoft Visual Studio\Preview\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 ``` ## Configure MSYS2 environment Press the Start key to search for and launch an MSYS2 command prompt. Named `MSYS2 MinGW 64-bit`. Ensure that on MSYS2's path, Visual Studio's cl and link programs have the highest precedence: ```bash echo 'export PATH="/c/Program Files (x86)/Microsoft Visual Studio/Preview/Community/VC/Tools/MSVC/14.14.26428/bin/Hostx64/x64/:$PATH"' >> ~/.bashrc ``` Ensure that any libs or headers you wish to include are added to the path: ```bash echo 'export LIB="EXAMPLE:$LIB"' >> ~/.bashrc echo 'export INCLUDE="EXAMPLE:$INCLUDE"' >> ~/.bashrc ``` ## Install LLVM I can't remember why, since this seems to be switching to a different toolchain or compiler altogether. Maybe it was an alternative approach. https://releases.llvm.org/download.html # Glossary https://github.com/msys2/msys2/wiki/How-does-MSYS2-differ-from-Cygwin ``` Cygwin: Gives you application support for POSIX compatible API, build and run environment. Useful when you have a native POSIX application you want to compile and run on a windows box. MSYS2: API's and build environment. This is useful when you have something like a library you want to use that requires autotools or has a complicated build system. MinGW: POSIX API. Useful if you want to compile, or especially cross compile using gcc, use POSIX api's and have access to unix command line tools. ```