288 lines
10 KiB
Plaintext
288 lines
10 KiB
Plaintext
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 <regex.h> 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
|