* 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']) | ||||