* Add guide for compiling on MinGW using waf * Update wscripts and guide for MinGW * Fix README_MINGW typos * Add instructions for ASIO support * Update jackd example * Patch for metadata support on Windows * Update VS project for building JackRouter * JackRouter/VS: add int redefinition fix to all build configurations * VS: ignore Visual Studio build files and user settings * Revise and extend README_MINGW * Fix typos in README_MINGW * Update MinGW build guide * Replace MAX_PATH with PATH_MAX (win32) * Include limits.h in JackMetadata.h Co-authored-by: Schrödinger's Cat <6382400+Schroedingers-Cat@users.noreply.github.com>tags/v1.9.15
@@ -6,3 +6,10 @@ __pycache__ | |||||
android/.server/ | android/.server/ | ||||
android/.client/ | android/.client/ | ||||
codeBlocks | codeBlocks | ||||
# Visual Studio files | |||||
*.vcxproj.user | |||||
windows/JackRouter/.vs | |||||
windows/JackRouter/Debug | |||||
windows/JackRouter/Release | |||||
windows/JackRouter/Release64 |
@@ -68,20 +68,20 @@ JackMetadata::~JackMetadata() | |||||
if (fIsEngine) | if (fIsEngine) | ||||
{ | { | ||||
// cleanup after libdb, nasty! | // cleanup after libdb, nasty! | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", fDBFilesDir); | |||||
remove (dbpath); | remove (dbpath); | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.001", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.001", fDBFilesDir); | |||||
remove (dbpath); | remove (dbpath); | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.002", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.002", fDBFilesDir); | |||||
remove (dbpath); | remove (dbpath); | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.003", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.003", fDBFilesDir); | |||||
remove (dbpath); | remove (dbpath); | ||||
// remove our custom dir | // remove our custom dir | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db", fDBFilesDir); | |||||
rmdir (dbpath); | rmdir (dbpath); | ||||
} | } | ||||
#endif | #endif | ||||
@@ -94,6 +94,16 @@ int JackMetadata::PropertyInit() | |||||
int ret; | int ret; | ||||
char dbpath[PATH_MAX + 1]; | char dbpath[PATH_MAX + 1]; | ||||
#ifdef WIN32 | |||||
ret = GetTempPathA (PATH_MAX, fDBFilesDir); | |||||
if ((ret > PATH_MAX) || (ret == 0)) { | |||||
jack_error ("cannot get path for temp files"); | |||||
return -1; | |||||
} | |||||
#else | |||||
strncpy (fDBFilesDir, jack_server_dir, PATH_MAX); | |||||
#endif | |||||
/* idempotent */ | /* idempotent */ | ||||
if (fDBenv) { | if (fDBenv) { | ||||
@@ -105,8 +115,12 @@ int JackMetadata::PropertyInit() | |||||
return -1; | return -1; | ||||
} | } | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db", fDBFilesDir); | |||||
#ifdef WIN32 | |||||
mkdir (dbpath); | |||||
#else | |||||
mkdir (dbpath, S_IRWXU | S_IRWXG); | mkdir (dbpath, S_IRWXU | S_IRWXG); | ||||
#endif | |||||
if ((ret = fDBenv->open (fDBenv, dbpath, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) { | if ((ret = fDBenv->open (fDBenv, dbpath, DB_CREATE | DB_INIT_LOCK | DB_INIT_MPOOL | DB_THREAD, 0)) != 0) { | ||||
jack_error ("cannot open DB environment: %s", db_strerror (ret)); | jack_error ("cannot open DB environment: %s", db_strerror (ret)); | ||||
@@ -118,7 +132,7 @@ int JackMetadata::PropertyInit() | |||||
return -1; | return -1; | ||||
} | } | ||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", jack_server_dir); | |||||
snprintf (dbpath, sizeof(dbpath), "%s/jack_db/metadata.db", fDBFilesDir); | |||||
if ((ret = fDB->open (fDB, NULL, dbpath, NULL, DB_HASH, DB_CREATE | DB_THREAD, 0666)) != 0) { | if ((ret = fDB->open (fDB, NULL, dbpath, NULL, DB_HASH, DB_CREATE | DB_THREAD, 0666)) != 0) { | ||||
jack_error ("Cannot open metadata DB at %s: %s", dbpath, db_strerror (ret)); | jack_error ("Cannot open metadata DB at %s: %s", dbpath, db_strerror (ret)); | ||||
fDB->close (fDB, 0); | fDB->close (fDB, 0); | ||||
@@ -31,6 +31,7 @@ | |||||
#endif | #endif | ||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <limits.h> | |||||
#if HAVE_DB | #if HAVE_DB | ||||
#include <db.h> | #include <db.h> | ||||
@@ -88,6 +89,7 @@ class JackMetadata | |||||
DB* fDB; | DB* fDB; | ||||
DB_ENV* fDBenv; | DB_ENV* fDBenv; | ||||
const bool fIsEngine; | const bool fIsEngine; | ||||
char fDBFilesDir[PATH_MAX + 1]; | |||||
#endif | #endif | ||||
int PropertyInit(); | int PropertyInit(); | ||||
@@ -197,6 +197,12 @@ def build(bld): | |||||
if bld.env['IS_SUN']: | if bld.env['IS_SUN']: | ||||
clientlib.env.append_value('LINKFLAGS', '-lnsl -lsocket') | clientlib.env.append_value('LINKFLAGS', '-lnsl -lsocket') | ||||
if bld.env['IS_WINDOWS']: | |||||
# statically link libjack to libstdc++, some client apps like ardour come | |||||
# with a different version of libstdc++.dll that takes precedence and results | |||||
# in missing symbols during runtime | |||||
clientlib.env.append_value('LINKFLAGS', ['-static-libstdc++', '--disable-auto-import']) | |||||
if bld.variant: | if bld.variant: | ||||
# if there is variant defined, we expect it to be the 32bit client lib one | # if there is variant defined, we expect it to be the 32bit client lib one | ||||
# we don't want to build other stuff in this variant | # we don't want to build other stuff in this variant | ||||
@@ -0,0 +1,25 @@ | |||||
| |||||
Microsoft Visual Studio Solution File, Format Version 12.00 | |||||
# Visual Studio 15 | |||||
VisualStudioVersion = 15.0.27703.2018 | |||||
MinimumVisualStudioVersion = 10.0.40219.1 | |||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JackRouter_MinGW_deps", "JackRouter_MinGW_deps.vcxproj", "{08E8BE85-76F9-4070-B85E-0CA6A38BCBB4}" | |||||
EndProject | |||||
Global | |||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||||
Debug|x64 = Debug|x64 | |||||
Release|x64 = Release|x64 | |||||
EndGlobalSection | |||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||||
{08E8BE85-76F9-4070-B85E-0CA6A38BCBB4}.Debug|x64.ActiveCfg = Debug|x64 | |||||
{08E8BE85-76F9-4070-B85E-0CA6A38BCBB4}.Debug|x64.Build.0 = Debug|x64 | |||||
{08E8BE85-76F9-4070-B85E-0CA6A38BCBB4}.Release|x64.ActiveCfg = Release|x64 | |||||
{08E8BE85-76F9-4070-B85E-0CA6A38BCBB4}.Release|x64.Build.0 = Release|x64 | |||||
EndGlobalSection | |||||
GlobalSection(SolutionProperties) = preSolution | |||||
HideSolutionNode = FALSE | |||||
EndGlobalSection | |||||
GlobalSection(ExtensibilityGlobals) = postSolution | |||||
SolutionGuid = {14794710-1A0E-40AE-99C4-98C59280F0C3} | |||||
EndGlobalSection | |||||
EndGlobal |
@@ -0,0 +1,287 @@ | |||||
<?xml version="1.0" encoding="utf-8"?> | |||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | |||||
<ItemGroup Label="ProjectConfigurations"> | |||||
<ProjectConfiguration Include="Debug|Win32"> | |||||
<Configuration>Debug</Configuration> | |||||
<Platform>Win32</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Debug|x64"> | |||||
<Configuration>Debug</Configuration> | |||||
<Platform>x64</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Release|Win32"> | |||||
<Configuration>Release</Configuration> | |||||
<Platform>Win32</Platform> | |||||
</ProjectConfiguration> | |||||
<ProjectConfiguration Include="Release|x64"> | |||||
<Configuration>Release</Configuration> | |||||
<Platform>x64</Platform> | |||||
</ProjectConfiguration> | |||||
</ItemGroup> | |||||
<PropertyGroup Label="Globals"> | |||||
<SccProjectName /> | |||||
<SccLocalPath /> | |||||
<ProjectGuid>{08E8BE85-76F9-4070-B85E-0CA6A38BCBB4}</ProjectGuid> | |||||
<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion> | |||||
</PropertyGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseOfMfc>false</UseOfMfc> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseOfMfc>false</UseOfMfc> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseOfMfc>false</UseOfMfc> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> | |||||
<ConfigurationType>DynamicLibrary</ConfigurationType> | |||||
<UseOfMfc>false</UseOfMfc> | |||||
<PlatformToolset>v141</PlatformToolset> | |||||
</PropertyGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | |||||
<ImportGroup Label="ExtensionSettings"> | |||||
</ImportGroup> | |||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" /> | |||||
</ImportGroup> | |||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" /> | |||||
</ImportGroup> | |||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" /> | |||||
</ImportGroup> | |||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> | |||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | |||||
<Import Project="$(VCTargetsPath)Microsoft.Cpp.UpgradeFromVC60.props" /> | |||||
</ImportGroup> | |||||
<PropertyGroup Label="UserMacros" /> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
<OutDir>.\Debug\</OutDir> | |||||
<IntDir>.\Debug\</IntDir> | |||||
<LinkIncremental>true</LinkIncremental> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<OutDir>.\Debug\</OutDir> | |||||
<IntDir>.\Debug\</IntDir> | |||||
<LinkIncremental>true</LinkIncremental> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
<OutDir>.\Release\</OutDir> | |||||
<IntDir>.\Release\</IntDir> | |||||
<LinkIncremental>false</LinkIncremental> | |||||
</PropertyGroup> | |||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<OutDir>.\Release64\</OutDir> | |||||
<IntDir>.\Release64\</IntDir> | |||||
<LinkIncremental>false</LinkIncremental> | |||||
</PropertyGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | |||||
<ClCompile> | |||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> | |||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion> | |||||
<FunctionLevelLinking>false</FunctionLevelLinking> | |||||
<Optimization>Disabled</Optimization> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<MinimalRebuild>true</MinimalRebuild> | |||||
<AdditionalIncludeDirectories>c:\msys64\opt\asiosdk\common;..\..\common;..\..\common\jack;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||||
<PreprocessorDefinitions>_STDINT_H;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<AssemblerListingLocation>.\Debug\</AssemblerListingLocation> | |||||
<BrowseInformation>true</BrowseInformation> | |||||
<PrecompiledHeaderOutputFile>.\Debug\JackRouter.pch</PrecompiledHeaderOutputFile> | |||||
<ObjectFileName>.\Debug\</ObjectFileName> | |||||
<ProgramDataBaseFileName>.\Debug\</ProgramDataBaseFileName> | |||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> | |||||
</ClCompile> | |||||
<Midl> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<TypeLibraryName>.\Debug\JackRouter.tlb</TypeLibraryName> | |||||
<MkTypLibCompatible>true</MkTypLibCompatible> | |||||
<TargetEnvironment>Win32</TargetEnvironment> | |||||
</Midl> | |||||
<ResourceCompile> | |||||
<Culture>0x0409</Culture> | |||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
</ResourceCompile> | |||||
<Bscmake> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<OutputFile>.\Debug\JackRouter.bsc</OutputFile> | |||||
</Bscmake> | |||||
<Link> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<LinkDLL>true</LinkDLL> | |||||
<GenerateDebugInformation>true</GenerateDebugInformation> | |||||
<SubSystem>Windows</SubSystem> | |||||
<OutputFile>Debug/JackRouter_debug.dll</OutputFile> | |||||
<ImportLibrary>.\Debug\JackRouter_debug.lib</ImportLibrary> | |||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> | |||||
<ModuleDefinitionFile>.\JackRouter.def</ModuleDefinitionFile> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> | |||||
<ClCompile> | |||||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary> | |||||
<InlineFunctionExpansion>Default</InlineFunctionExpansion> | |||||
<FunctionLevelLinking>false</FunctionLevelLinking> | |||||
<Optimization>Disabled</Optimization> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<AdditionalIncludeDirectories>c:\msys64\opt\asiosdk\common;..\..\common;..\..\common\jack;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||||
<PreprocessorDefinitions>_STDINT_H;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<AssemblerListingLocation>.\Debug\</AssemblerListingLocation> | |||||
<BrowseInformation>true</BrowseInformation> | |||||
<PrecompiledHeaderOutputFile>.\Debug\JackRouter.pch</PrecompiledHeaderOutputFile> | |||||
<ObjectFileName>.\Debug\</ObjectFileName> | |||||
<ProgramDataBaseFileName>.\Debug\</ProgramDataBaseFileName> | |||||
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> | |||||
</ClCompile> | |||||
<Midl> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<TypeLibraryName>.\Debug\JackRouter.tlb</TypeLibraryName> | |||||
<MkTypLibCompatible>true</MkTypLibCompatible> | |||||
</Midl> | |||||
<ResourceCompile> | |||||
<Culture>0x0409</Culture> | |||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
</ResourceCompile> | |||||
<Bscmake> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<OutputFile>.\Debug\JackRouter.bsc</OutputFile> | |||||
</Bscmake> | |||||
<Link> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<LinkDLL>true</LinkDLL> | |||||
<GenerateDebugInformation>true</GenerateDebugInformation> | |||||
<SubSystem>Windows</SubSystem> | |||||
<OutputFile>Debug/JackRouter_debug.dll</OutputFile> | |||||
<ImportLibrary>.\Debug\JackRouter_debug.lib</ImportLibrary> | |||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> | |||||
<ModuleDefinitionFile>.\JackRouter.def</ModuleDefinitionFile> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | |||||
<ClCompile> | |||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> | |||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> | |||||
<StringPooling>true</StringPooling> | |||||
<FunctionLevelLinking>true</FunctionLevelLinking> | |||||
<Optimization>MaxSpeed</Optimization> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<AdditionalIncludeDirectories>c:\msys64\opt\asiosdk\common;..\..\common;..\..\common\jack;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||||
<PreprocessorDefinitions>_STDINT_H;WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<AssemblerListingLocation>.\Release\</AssemblerListingLocation> | |||||
<BrowseInformation>true</BrowseInformation> | |||||
<PrecompiledHeaderOutputFile>.\Release\JackRouter.pch</PrecompiledHeaderOutputFile> | |||||
<ObjectFileName>.\Release\</ObjectFileName> | |||||
<ProgramDataBaseFileName>.\Release\</ProgramDataBaseFileName> | |||||
</ClCompile> | |||||
<Midl> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<TypeLibraryName>.\Release\JackRouter.tlb</TypeLibraryName> | |||||
<MkTypLibCompatible>true</MkTypLibCompatible> | |||||
<TargetEnvironment>Win32</TargetEnvironment> | |||||
</Midl> | |||||
<ResourceCompile> | |||||
<Culture>0x0409</Culture> | |||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
</ResourceCompile> | |||||
<Bscmake> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<OutputFile>.\Release\JackRouter.bsc</OutputFile> | |||||
</Bscmake> | |||||
<Link> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<LinkDLL>true</LinkDLL> | |||||
<SubSystem>Windows</SubSystem> | |||||
<OutputFile>.\Release\JackRouter.dll</OutputFile> | |||||
<ImportLibrary>.\Release\JackRouter.lib</ImportLibrary> | |||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> | |||||
<ModuleDefinitionFile>.\JackRouter.def</ModuleDefinitionFile> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> | |||||
<ClCompile> | |||||
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> | |||||
<InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> | |||||
<StringPooling>true</StringPooling> | |||||
<FunctionLevelLinking>true</FunctionLevelLinking> | |||||
<Optimization>MaxSpeed</Optimization> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<WarningLevel>Level3</WarningLevel> | |||||
<AdditionalIncludeDirectories>c:\msys64\opt\asiosdk\common;..\..\common;..\..\common\jack;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | |||||
<PreprocessorDefinitions>_STDINT_H;WIN32;NDEBUG;_WINDOWS;PSAPI_VERSION=2;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<AssemblerListingLocation>.\Release\</AssemblerListingLocation> | |||||
<BrowseInformation>true</BrowseInformation> | |||||
<PrecompiledHeaderOutputFile>.\Release\JackRouter.pch</PrecompiledHeaderOutputFile> | |||||
<ObjectFileName>.\Release\</ObjectFileName> | |||||
<ProgramDataBaseFileName>.\Release\</ProgramDataBaseFileName> | |||||
<IgnoreStandardIncludePath>false</IgnoreStandardIncludePath> | |||||
<ForcedIncludeFiles>stdint.h</ForcedIncludeFiles> | |||||
</ClCompile> | |||||
<Midl> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
<TypeLibraryName>.\Release\JackRouter.tlb</TypeLibraryName> | |||||
<MkTypLibCompatible>true</MkTypLibCompatible> | |||||
</Midl> | |||||
<ResourceCompile> | |||||
<Culture>0x0409</Culture> | |||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | |||||
</ResourceCompile> | |||||
<Bscmake> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<OutputFile>.\Release\JackRouter64.bsc</OutputFile> | |||||
</Bscmake> | |||||
<Link> | |||||
<SuppressStartupBanner>true</SuppressStartupBanner> | |||||
<LinkDLL>true</LinkDLL> | |||||
<SubSystem>Windows</SubSystem> | |||||
<OutputFile>.\Release64\JackRouter.dll</OutputFile> | |||||
<ImportLibrary>.\Release\JackRouter64.lib</ImportLibrary> | |||||
<AdditionalDependencies>odbc32.lib;odbccp32.lib;winmm.lib;%(AdditionalDependencies)</AdditionalDependencies> | |||||
<ModuleDefinitionFile>.\JackRouter.def</ModuleDefinitionFile> | |||||
</Link> | |||||
</ItemDefinitionGroup> | |||||
<ItemGroup> | |||||
<ClCompile Include="c:\msys64\opt\asiosdk\common\combase.cpp" /> | |||||
<ClCompile Include="c:\msys64\opt\asiosdk\common\dllentry.cpp" /> | |||||
<ClCompile Include="JackRouter.cpp" /> | |||||
<ClCompile Include="profport.cpp" /> | |||||
<ClCompile Include="c:\msys64\opt\asiosdk\common\register.cpp" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<CustomBuild Include="JackRouter.def" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ResourceCompile Include="resource.rc" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ClInclude Include="..\..\..\common\asio.h" /> | |||||
<ClInclude Include="..\..\Common\Asiodrvr.h" /> | |||||
<ClInclude Include="..\asiosmpl.h" /> | |||||
<ClInclude Include="..\..\..\common\asiosys.h" /> | |||||
<ClInclude Include="..\..\..\common\combase.h" /> | |||||
<ClInclude Include="..\..\..\common\iasiodrv.h" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<Library Include="c:\msys64\opt\jack\bin\jack.dll.a" /> | |||||
<Library Include="Psapi.Lib" /> | |||||
</ItemGroup> | |||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | |||||
<ImportGroup Label="ExtensionTargets"> | |||||
</ImportGroup> | |||||
</Project> |
@@ -0,0 +1,270 @@ | |||||
HOW TO COMPILE JACK USING WAF AND 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 | |||||
Introduction | |||||
------------ | |||||
This guide contains detailed instructions for building JACK on a modern MinGW | |||||
installation. It was conceived as the starting point for unifying the JACK build | |||||
process across all platforms. | |||||
As this is work in progress, there are still a couple of caveats: | |||||
- Asynchronous mode is unusable with low latencies | |||||
- JackRouter still builds using a Visual Studio project | |||||
- Lots of real world testing is needed | |||||
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 | |||||
-------------------- | |||||
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 | |||||
windows/JackRouter/JackRouter_MinGW_deps.vcxproj | |||||
Differences from the original JackRouter.vcxproj: | |||||
- Depends on the asiosdk files from the previous MinGW JACK installation (i.e., | |||||
it points to absolute paths starting with C:\msys64\opt) | |||||
- Links to the jack.dll.a created by the previous build, instead of libjack.lib | |||||
This means JackRouter.dll will currently depend on libjack-0.dll | |||||
- Force includes stdint.h and defines _STDINT_H to avoid int8_t, int32_t and | |||||
uint32_t basic types redefinition during compilation | |||||
Running and distributing | |||||
------------------------ | |||||
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 |
@@ -212,6 +212,14 @@ def configure(conf): | |||||
if conf.env['IS_WINDOWS']: | if conf.env['IS_WINDOWS']: | ||||
conf.env.append_unique('CCDEFINES', '_POSIX') | conf.env.append_unique('CCDEFINES', '_POSIX') | ||||
conf.env.append_unique('CXXDEFINES', '_POSIX') | conf.env.append_unique('CXXDEFINES', '_POSIX') | ||||
if Options.options.platform == 'msys': | |||||
conf.env.append_value('INCLUDES', ['/mingw64/include']) | |||||
conf.check( | |||||
header_name='asio.h', | |||||
includes='/opt/asiosdk/common', | |||||
msg='Checking for ASIO SDK', | |||||
define_name='HAVE_ASIO', | |||||
mandatory=False) | |||||
conf.env.append_unique('CFLAGS', '-Wall') | conf.env.append_unique('CFLAGS', '-Wall') | ||||
conf.env.append_unique('CXXFLAGS', '-Wall') | conf.env.append_unique('CXXFLAGS', '-Wall') | ||||
@@ -369,8 +377,13 @@ def configure(conf): | |||||
# existing install paths that use ADDON_DIR rather than have to | # existing install paths that use ADDON_DIR rather than have to | ||||
# have special cases for windows each time. | # have special cases for windows each time. | ||||
conf.env['ADDON_DIR'] = conf.env['BINDIR'] + '/jack' | conf.env['ADDON_DIR'] = conf.env['BINDIR'] + '/jack' | ||||
# don't define ADDON_DIR in config.h, use the default 'jack' defined in | |||||
# windows/JackPlatformPlug_os.h | |||||
if Options.options.platform == 'msys': | |||||
conf.define('ADDON_DIR', 'jack') | |||||
conf.define('__STDC_FORMAT_MACROS', 1) # for PRIu64 | |||||
else: | |||||
# don't define ADDON_DIR in config.h, use the default 'jack' defined in | |||||
# windows/JackPlatformPlug_os.h | |||||
pass | |||||
else: | else: | ||||
conf.env['ADDON_DIR'] = os.path.normpath(os.path.join(conf.env['LIBDIR'], 'jack')) | conf.env['ADDON_DIR'] = os.path.normpath(os.path.join(conf.env['LIBDIR'], 'jack')) | ||||
conf.define('ADDON_DIR', conf.env['ADDON_DIR']) | conf.define('ADDON_DIR', conf.env['ADDON_DIR']) | ||||