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.

271 lines
9.5KB

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