* 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/.client/ | |||
| 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) | |||
| { | |||
| // 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); | |||
| snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.001", jack_server_dir); | |||
| snprintf (dbpath, sizeof(dbpath), "%s/jack_db/__db.001", fDBFilesDir); | |||
| 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); | |||
| 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 our custom dir | |||
| snprintf (dbpath, sizeof(dbpath), "%s/jack_db", jack_server_dir); | |||
| snprintf (dbpath, sizeof(dbpath), "%s/jack_db", fDBFilesDir); | |||
| rmdir (dbpath); | |||
| } | |||
| #endif | |||
| @@ -94,6 +94,16 @@ int JackMetadata::PropertyInit() | |||
| int ret; | |||
| 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 */ | |||
| if (fDBenv) { | |||
| @@ -105,8 +115,12 @@ int JackMetadata::PropertyInit() | |||
| 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); | |||
| #endif | |||
| 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)); | |||
| @@ -118,7 +132,7 @@ int JackMetadata::PropertyInit() | |||
| 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) { | |||
| jack_error ("Cannot open metadata DB at %s: %s", dbpath, db_strerror (ret)); | |||
| fDB->close (fDB, 0); | |||
| @@ -31,6 +31,7 @@ | |||
| #endif | |||
| #include <stdint.h> | |||
| #include <limits.h> | |||
| #if HAVE_DB | |||
| #include <db.h> | |||
| @@ -88,6 +89,7 @@ class JackMetadata | |||
| DB* fDB; | |||
| DB_ENV* fDBenv; | |||
| const bool fIsEngine; | |||
| char fDBFilesDir[PATH_MAX + 1]; | |||
| #endif | |||
| int PropertyInit(); | |||
| @@ -197,6 +197,12 @@ def build(bld): | |||
| if bld.env['IS_SUN']: | |||
| 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 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 | |||
| @@ -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']: | |||
| conf.env.append_unique('CCDEFINES', '_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('CXXFLAGS', '-Wall') | |||
| @@ -369,8 +377,13 @@ def configure(conf): | |||
| # existing install paths that use ADDON_DIR rather than have to | |||
| # have special cases for windows each time. | |||
| 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: | |||
| conf.env['ADDON_DIR'] = os.path.normpath(os.path.join(conf.env['LIBDIR'], 'jack')) | |||
| conf.define('ADDON_DIR', conf.env['ADDON_DIR']) | |||