HOW TO COMPILE JACK ON WINDOWS/MINGW ==================================== Rev. 1 - 2019-09-01 - First version Rev. 2 - 2019-09-18 - Include contributions from @Schroedingers-Cat Rev. 3 - 2019-12-14 - Include contributions from @Schroedingers-Cat Rev. 4 - 2020-11-27 - Rename, update intro and JackRouter build instructions Introduction ------------ This guide was originally called "How to compile JACK using WAF and MinGW" and later renamed to "How to compile JACK on Windows/MinGW" to avoid confusion with the official way of building JACK for Windows, which is cross-compiling on Linux. That should be considered the only officially supported method now. Latest binary releases can be found here: https://jackaudio.org/downloads/ JackRouter here: https://github.com/jackaudio/jack-router/tree/main/binaries JACK is primarily targeted at Unix systems and thus the required toolchain is Unix-centric. So the majority of the guide is actually about setting up the required build tools. Once done, the build process itself does not differ much from that found on other platforms. The information here can be of interest to anyone wishing to contribute to the development of Windows specific code in JACK, and wants to avoid double booting, VMs, etc. That can be particularly helpful when it comes to debug or testing. Creating the development environment ------------------------------------ This guide uses MSYS2 as the toolchain, it can be found at https://www.msys2.org/ It comes as a handy installer called msys2-x86_64-{version}.exe. Once installed: - Open "MSYS2 MinGW 64-bit terminal" from the MSYS2 start menu shortcuts - Upgrade base MSYS2 packages pacman -Suy It is possible pacman ends with the following banner: warning: terminate MSYS2 without returning to shell and check for updates again warning: for example close your terminal window instead of calling exit In such case close the MSYS2 window, re-open, and run pacman -Suy again. - Install required packages pacman -S mingw-w64-x86_64-toolchain patch autoconf make \ gettext-devel automake libtool pkgconfig p7zip unzip git python - Replace the GCC compiler with a version configured for SJLJ exceptions, as instructed by the original Windows build instructions (windows/README) Prebuilt binaries can be found at https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/ Look for "x86_64-posix-sjlj" under "MinGW-W64 GCC-{version}", the file should be called x86_64-{version}-release-posix-sjlj-rt_v6-rev0.7z Or just download from a direct link (GCC 8.1.0): wget https://downloads.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/sjlj/x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z Once downloaded: p7zip -d x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z That will decompress to a folder called mingw64 in the working directory. Now replace the files from the previous mingw-w64-x86_64-toolchain package installation: mv /mingw64 /mingw64.bak -> backup original rm /mingw64 -> see explanation below mv mingw64 / -> sjlj toolchain The first step results in a new file called mingw64 file being created in /. The file is not visible to the Windows File Explorer when inspecting C:\msys64, so it is probably an artifact and safe to delete it in the second step. Otherwise the last mv step will fail with: mv: cannot overwrite non-directory '/mingw64' with directory 'mingw64' An alternate solution consists in closing the MSYS2 window and replicating the above procedure using the File Explorer. The following assumes the toolchain 7z file was decompressed to the home directory: Rename C:\msys64\mingw64 to C:\msys64\mingw64.bak Move C:\msys64\home\{username}\mingw64 to C:\msys64 Make sure gcc runs and it is the expected version: $ gcc --version gcc.exe (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) {version} Preparing JACK dependencies --------------------------- There are prebuilt MinGW binaries for all the libraries that can be installed using the pacman package manager, but since we are using a compiler that is not the default version shipped by MinGW, it seems better idea to build from source to avoid any linker and runtime issues. A good technical explanation and/or evidence for this statement is currently missing from this guide. Fortunately there are PKGBUILD files for doing so together with a nice guide at https://github.com/msys2/MINGW-packages git clone https://github.com/msys2/MINGW-packages.git Before building libraries, adjust the includes path: export C_INCLUDE_PATH=/mingw64/include The basic procedure for building and installing libraries is: cd MINGW-packages/mingw-w64-{libname} MINGW_INSTALLS=mingw64 makepkg-mingw -sLf pacman -U mingw-w64-{libname}-{suffix}.pkg.tar.xz Repeat the procedure for each library listed below replacing {libname} with the appropriate name and {suffix} with whatever the above process creates. Keep the recommended build order, for example libsamplerate depends on libsndfile, and libsystre depends on libtre-git. libsystre is a wrapper around libtre that allows including later. Some libraries like libsndfile and libsamplerate will ask for installing extra dependencies, it is ok to do so. For low latency audio it is recommended to build portaudio with ASIO support, so the Steinberg ASIO SDK should be manually downloaded beforehand. It can be found at https://www.steinberg.net/en/company/developers.html. The waf script will later check if the SDK is present at /opt/asiosdk wget https://www.steinberg.net/asiosdk -O /tmp/asiosdk.zip unzip /tmp/asiosdk.zip -d /tmp mkdir /opt <- MinGW does not create /opt during installation mv /tmp/asiosdk_{version}_{date} /opt/asiosdk The description file in portaudio (MINGW-packages/mingw-w64-portaudio/PKGBUILD) needs to be patched so configure is called with the necessary flags for ASIO: --with-asiodir=/opt/asiosdk <- new option --with-winapi=wmme,directx,wasapi,vdmks,asio <- append 'asio' to existing Both static and shared library versions of portaudio are built. To prevent errors while building the shared version or recompiling static, also insert the following lines in PKGBUILD after the first make call (around line 60) and after second make (around line 70): find /opt/asiosdk -name "*.lo" -type f -delete find /opt/asiosdk -name "*.o" -type f -delete Finally here is the list of libraries to build: db libsndfile libsamplerate libtre-git libsystre portaudio Compiling JACK -------------- - Clone repo git clone https://github.com/jackaudio/jack2 - Build and install cd jack2 ./waf configure --prefix=/opt/jack && ./waf -p install The resulting files can be found at /c/opt/jack/bin, or C:\msys64\opt\jack\bin Compiling JackRouter -------------------- Source code for JackRouter is not considered part of JACK anymore so you need to clone an additional repository: git clone https://github.com/jackaudio/jack-router Visual Studio with MFC support is needed to build the included JackRouter VS project. The project was tested to successfully generate a 64bit version of JackRouter.dll using Visual Studio 2017 and 2019. MFC support can be added from the VS installer, by selecting Workloads/Visual C++ build tools/Visual C++ MFC for x86 and x64 (valid for VS 2017). Once ready, just open and build the project win/JackRouter.sln Notes: - The project assumes the needed ASIO SDK is located in C:\Program Files\asiosdk you can simply copy the SDK from the MinGW JACK installation, i.e. from C:\msys64\opt to C:\Program Files - Links against C:\Program Files\JACK2\lib\libjack64.dll.a which is the libjack version installed by the official installer. You will have to update that path so it points to the jack.dll.a created by the MinGW build instead. Running and distributing ------------------------ !! This section is kept for historical reasons. The official JACK for Windows build method includes the necessary steps to create a installer. !! An automated installation process should copy files to two destinations. One for the JACK server binary and standalone tools, and another for the client library. The latter is needed by JACK enabled applications in order to be able to connect to the server. - Create a directory named C:\Program Files\Jack (can be anything else) - Copy all files in C:\msys64\opt\jack\bin to C:\Program Files\Jack - Copy the following DLLs from C:\msys64\mingw64\bin to C:\Program Files\Jack, these are dependencies for the JACK server and tools: libstdc++-6.dll libdb-6.0.dll libsndfile-1.dll libsamplerate-0.dll libportaudio-2.dll libgcc_s_sjlj-1.dll libwinpthread-1.dll libtre-5.dll libsystre-0.dll - Copy and rename the following files from C:\msys64\opt\jack\bin to C:\Windows to make libjack available to clients: libjackserver-0.dll -> libjackserver64.dll libjack-0.dll -> libjack64.dll - Copy the following files from C:\msys64\mingw64\bin to C:\Windows, these are dependencies for libjack. C:\Windows is the directory the current official JACK 1.9.11 binary installer targets, a better solution should be devised to avoid cluttering the Windows directory: libgcc_s_sjlj-1.dll libwinpthread-1.dll libtre-5.dll libsystre-0.dll - Copy JackRouter.dll from windows\JackRouter\Release64 to C:\Program Files\Jack This allows non-JACK applications to connect to the server through a special ASIO driver that routes audio to JACK instead of a physical audio device. Also copy libjack-0.dll from C:\msys64\mingw64\bin to C:\Program Files\Jack because JackRouter depends on libjack but will check for libjack-0.dll instead of the system-wide libjack64.dll previously copied to C:\Windows. Once done, JackRouter needs to be registered: regsvr32 JackRouter.dll Tested working clients: Ardour Bitwig Studio QJackCtl JackRouter Example of starting the JACK server including MIDI support for a Focusrite USB audio device using ASIO: jackd -R -S -X winmme -d portaudio -p 32 -r 48000 -d "ASIO::Focusrite USB ASIO" Development tools and links --------------------------- http://www.dependencywalker.com/ https://docs.microsoft.com/en-us/sysinternals/downloads/procmon https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/gflags https://blogs.msdn.microsoft.com/junfeng/2006/11/20/debugging-loadlibrary-failures/ https://stackoverflow.com/questions/15852677/static-and-dynamic-shared-linking-with-mingw https://github.com/EddieRingle/portaudio/blob/master/src/hostapi/asio/ASIO-README.txt