jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
10KB

  1. HOW TO COMPILE JACK ON WINDOWS/MINGW
  2. ====================================
  3. Rev. 1 - 2019-09-01 - First version
  4. Rev. 2 - 2019-09-18 - Include contributions from @Schroedingers-Cat
  5. Rev. 3 - 2019-12-14 - Include contributions from @Schroedingers-Cat
  6. Rev. 4 - 2020-11-27 - Rename, update intro and JackRouter build instructions
  7. Introduction
  8. ------------
  9. This guide was originally called "How to compile JACK using WAF and MinGW"
  10. and later renamed to "How to compile JACK on Windows/MinGW" to avoid confusion
  11. with the official way of building JACK for Windows, which is cross-compiling
  12. on Linux. That should be considered the only officially supported method now.
  13. Latest binary releases can be found here: https://jackaudio.org/downloads/
  14. JackRouter here: https://github.com/jackaudio/jack-router/tree/main/binaries
  15. JACK is primarily targeted at Unix systems and thus the required toolchain is
  16. Unix-centric. So the majority of the guide is actually about setting up the
  17. required build tools. Once done, the build process itself does not differ much
  18. from that found on other platforms.
  19. The information here can be of interest to anyone wishing to contribute to the
  20. development of Windows specific code in JACK, and wants to avoid double booting,
  21. VMs, etc. That can be particularly helpful when it comes to debug or testing.
  22. Creating the development environment
  23. ------------------------------------
  24. This guide uses MSYS2 as the toolchain, it can be found at https://www.msys2.org/
  25. It comes as a handy installer called msys2-x86_64-{version}.exe. Once installed:
  26. - Open "MSYS2 MinGW 64-bit terminal" from the MSYS2 start menu shortcuts
  27. - Upgrade base MSYS2 packages
  28. pacman -Suy
  29. It is possible pacman ends with the following banner:
  30. warning: terminate MSYS2 without returning to shell and check for updates again
  31. warning: for example close your terminal window instead of calling exit
  32. In such case close the MSYS2 window, re-open, and run pacman -Suy again.
  33. - Install required packages
  34. pacman -S mingw-w64-x86_64-toolchain patch autoconf make \
  35. gettext-devel automake libtool pkgconfig p7zip unzip git python
  36. - Replace the GCC compiler with a version configured for SJLJ exceptions, as
  37. instructed by the original Windows build instructions (windows/README)
  38. Prebuilt binaries can be found at
  39. https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/
  40. Look for "x86_64-posix-sjlj" under "MinGW-W64 GCC-{version}", the file should be
  41. called x86_64-{version}-release-posix-sjlj-rt_v6-rev0.7z
  42. Or just download from a direct link (GCC 8.1.0):
  43. 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
  44. Once downloaded:
  45. p7zip -d x86_64-8.1.0-release-posix-sjlj-rt_v6-rev0.7z
  46. That will decompress to a folder called mingw64 in the working directory.
  47. Now replace the files from the previous mingw-w64-x86_64-toolchain package
  48. installation:
  49. mv /mingw64 /mingw64.bak -> backup original
  50. rm /mingw64 -> see explanation below
  51. mv mingw64 / -> sjlj toolchain
  52. The first step results in a new file called mingw64 file being created in /. The
  53. file is not visible to the Windows File Explorer when inspecting C:\msys64, so
  54. it is probably an artifact and safe to delete it in the second step. Otherwise
  55. the last mv step will fail with:
  56. mv: cannot overwrite non-directory '/mingw64' with directory 'mingw64'
  57. An alternate solution consists in closing the MSYS2 window and replicating the
  58. above procedure using the File Explorer. The following assumes the toolchain 7z
  59. file was decompressed to the home directory:
  60. Rename C:\msys64\mingw64 to C:\msys64\mingw64.bak
  61. Move C:\msys64\home\{username}\mingw64 to C:\msys64
  62. Make sure gcc runs and it is the expected version:
  63. $ gcc --version
  64. gcc.exe (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) {version}
  65. Preparing JACK dependencies
  66. ---------------------------
  67. There are prebuilt MinGW binaries for all the libraries that can be installed
  68. using the pacman package manager, but since we are using a compiler that is not
  69. the default version shipped by MinGW, it seems better idea to build from source
  70. to avoid any linker and runtime issues. A good technical explanation and/or
  71. evidence for this statement is currently missing from this guide.
  72. Fortunately there are PKGBUILD files for doing so together with a nice guide at
  73. https://github.com/msys2/MINGW-packages
  74. git clone https://github.com/msys2/MINGW-packages.git
  75. Before building libraries, adjust the includes path:
  76. export C_INCLUDE_PATH=/mingw64/include
  77. The basic procedure for building and installing libraries is:
  78. cd MINGW-packages/mingw-w64-{libname}
  79. MINGW_INSTALLS=mingw64 makepkg-mingw -sLf
  80. pacman -U mingw-w64-{libname}-{suffix}.pkg.tar.xz
  81. Repeat the procedure for each library listed below replacing {libname} with the
  82. appropriate name and {suffix} with whatever the above process creates. Keep the
  83. recommended build order, for example libsamplerate depends on libsndfile, and
  84. libsystre depends on libtre-git. libsystre is a wrapper around libtre that
  85. allows including <regex.h> later.
  86. Some libraries like libsndfile and libsamplerate will ask for installing extra
  87. dependencies, it is ok to do so.
  88. For low latency audio it is recommended to build portaudio with ASIO support, so
  89. the Steinberg ASIO SDK should be manually downloaded beforehand. It can be found
  90. at https://www.steinberg.net/en/company/developers.html. The waf script will
  91. later check if the SDK is present at /opt/asiosdk
  92. wget https://www.steinberg.net/asiosdk -O /tmp/asiosdk.zip
  93. unzip /tmp/asiosdk.zip -d /tmp
  94. mkdir /opt <- MinGW does not create /opt during installation
  95. mv /tmp/asiosdk_{version}_{date} /opt/asiosdk
  96. The description file in portaudio (MINGW-packages/mingw-w64-portaudio/PKGBUILD)
  97. needs to be patched so configure is called with the necessary flags for ASIO:
  98. --with-asiodir=/opt/asiosdk <- new option
  99. --with-winapi=wmme,directx,wasapi,vdmks,asio <- append 'asio' to existing
  100. Both static and shared library versions of portaudio are built. To prevent
  101. errors while building the shared version or recompiling static, also insert the
  102. following lines in PKGBUILD after the first make call (around line 60) and after
  103. second make (around line 70):
  104. find /opt/asiosdk -name "*.lo" -type f -delete
  105. find /opt/asiosdk -name "*.o" -type f -delete
  106. Finally here is the list of libraries to build:
  107. db
  108. libsndfile
  109. libsamplerate
  110. libtre-git
  111. libsystre
  112. portaudio
  113. Compiling JACK
  114. --------------
  115. - Clone repo
  116. git clone https://github.com/jackaudio/jack2
  117. - Build and install
  118. cd jack2
  119. ./waf configure --prefix=/opt/jack && ./waf -p install
  120. The resulting files can be found at /c/opt/jack/bin, or C:\msys64\opt\jack\bin
  121. Compiling JackRouter
  122. --------------------
  123. Source code for JackRouter is not considered part of JACK anymore so you need to
  124. clone an additional repository:
  125. git clone https://github.com/jackaudio/jack-router
  126. Visual Studio with MFC support is needed to build the included JackRouter VS
  127. project. The project was tested to successfully generate a 64bit version of
  128. JackRouter.dll using Visual Studio 2017 and 2019. MFC support can be added from
  129. the VS installer, by selecting Workloads/Visual C++ build tools/Visual C++ MFC
  130. for x86 and x64 (valid for VS 2017).
  131. Once ready, just open and build the project
  132. win/JackRouter.sln
  133. Notes:
  134. - The project assumes the needed ASIO SDK is located in C:\Program Files\asiosdk
  135. you can simply copy the SDK from the MinGW JACK installation, i.e. from
  136. C:\msys64\opt to C:\Program Files
  137. - Links against C:\Program Files\JACK2\lib\libjack64.dll.a which is the libjack
  138. version installed by the official installer. You will have to update that path
  139. so it points to the jack.dll.a created by the MinGW build instead.
  140. Running and distributing
  141. ------------------------
  142. !! This section is kept for historical reasons. The official JACK for Windows
  143. build method includes the necessary steps to create a installer. !!
  144. An automated installation process should copy files to two destinations. One for
  145. the JACK server binary and standalone tools, and another for the client library.
  146. The latter is needed by JACK enabled applications in order to be able to connect
  147. to the server.
  148. - Create a directory named C:\Program Files\Jack (can be anything else)
  149. - Copy all files in C:\msys64\opt\jack\bin to C:\Program Files\Jack
  150. - Copy the following DLLs from C:\msys64\mingw64\bin to C:\Program Files\Jack,
  151. these are dependencies for the JACK server and tools:
  152. libstdc++-6.dll
  153. libdb-6.0.dll
  154. libsndfile-1.dll
  155. libsamplerate-0.dll
  156. libportaudio-2.dll
  157. libgcc_s_sjlj-1.dll
  158. libwinpthread-1.dll
  159. libtre-5.dll
  160. libsystre-0.dll
  161. - Copy and rename the following files from C:\msys64\opt\jack\bin to C:\Windows
  162. to make libjack available to clients:
  163. libjackserver-0.dll -> libjackserver64.dll
  164. libjack-0.dll -> libjack64.dll
  165. - Copy the following files from C:\msys64\mingw64\bin to C:\Windows, these are
  166. dependencies for libjack. C:\Windows is the directory the current official JACK
  167. 1.9.11 binary installer targets, a better solution should be devised to avoid
  168. cluttering the Windows directory:
  169. libgcc_s_sjlj-1.dll
  170. libwinpthread-1.dll
  171. libtre-5.dll
  172. libsystre-0.dll
  173. - Copy JackRouter.dll from windows\JackRouter\Release64 to C:\Program Files\Jack
  174. This allows non-JACK applications to connect to the server through a special
  175. ASIO driver that routes audio to JACK instead of a physical audio device.
  176. Also copy libjack-0.dll from C:\msys64\mingw64\bin to C:\Program Files\Jack
  177. because JackRouter depends on libjack but will check for libjack-0.dll instead
  178. of the system-wide libjack64.dll previously copied to C:\Windows. Once done,
  179. JackRouter needs to be registered:
  180. regsvr32 JackRouter.dll
  181. Tested working clients:
  182. Ardour
  183. Bitwig Studio
  184. QJackCtl
  185. JackRouter
  186. Example of starting the JACK server including MIDI support for a Focusrite USB
  187. audio device using ASIO:
  188. jackd -R -S -X winmme -d portaudio -p 32 -r 48000 -d "ASIO::Focusrite USB ASIO"
  189. Development tools and links
  190. ---------------------------
  191. http://www.dependencywalker.com/
  192. https://docs.microsoft.com/en-us/sysinternals/downloads/procmon
  193. https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/gflags
  194. https://blogs.msdn.microsoft.com/junfeng/2006/11/20/debugging-loadlibrary-failures/
  195. https://stackoverflow.com/questions/15852677/static-and-dynamic-shared-linking-with-mingw
  196. https://github.com/EddieRingle/portaudio/blob/master/src/hostapi/asio/ASIO-README.txt