<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros">
    <DolphinRelease Condition="'$(DolphinRelease)'!='true' or '$(Configuration)'!='Release'">false</DolphinRelease>
    <TargetSuffix>
    </TargetSuffix>
    <TargetSuffix Condition="'$(Configuration)'=='Debug'">D</TargetSuffix>
    <DolphinRootDir>$(SolutionDir)..\</DolphinRootDir>
    <BuildRootDir>$(DolphinRootDir)Build\</BuildRootDir>
    <BinaryRootDir>$(DolphinRootDir)Binary\</BinaryRootDir>
    <BinaryOutputDir>$(BinaryRootDir)$(Platform)\</BinaryOutputDir>
    <ExternalsDir>$(DolphinRootDir)Externals\</ExternalsDir>
    <CoreDir>$(SolutionDir)Core\</CoreDir>
  </PropertyGroup>
  <PropertyGroup>
    <!--
    Opt-in to x64 compiler and tools.
    Unfortunately we can't set this property here, as it'll be overridden later. Instead, set it
    from commandline if you're interested in using x64 toolset
    <PreferredToolArchitecture>x64</PreferredToolArchitecture>
    -->
    <IntDir>$(BuildRootDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
    <OutDir>$(IntDir)bin\</OutDir>
    <TargetName Condition="'$(ConfigurationType)'=='Application'">$(ProjectName)$(TargetSuffix)</TargetName>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <!--ClCompile Base-->
    <ClCompile>
      <!--
      Coagulate all the needed include directories.
      Order matters! (first hit, first use).
        Note: Directory containing source file being compiled is always searched first.
      -->
      <AdditionalIncludeDirectories>$(CoreDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)Bochs_disasm;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)cpp-optparse;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)cubeb\include;$(ExternalsDir)cubeb\msvc;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)curl\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)enet\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)ffmpeg\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)GL;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)glslang\glslang\Public;$(ExternalsDir)glslang\SPIRV;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)imgui;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)libpng;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)libusb\libusb;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)LZO;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)miniupnpc\src;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)mbedtls\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)pugixml;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)SFML\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)Vulkan\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)xxhash;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <AdditionalIncludeDirectories>$(ExternalsDir)zlib;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <PreprocessorDefinitions>HAVE_FFMPEG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>USE_UPNP;USE_USBDK;__LIBUSB__;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>_M_X86=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>SFML_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>USE_ANALYTICS=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>USE_DISCORD_PRESENCE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>CURL_STATICLIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(Platform)'=='x64'">_ARCH_64=1;_M_X86_64=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!--
      Make sure we include a clean version of windows.h.
      -->
      <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!--
      This numeral indicates the "minimum system required" to run the resulting
      program. Dolphin targets Vista+, so it should be 0x0600. However in practice,
      _WIN32_WINNT just removes up-level API declarations from headers. This is a
      problem for XAudio2 and XInput, where Dolphin expects to compile against the
      Win8+ versions of their headers. So while we really need Vista+ level of
      support, we declare Win8+ here globally. If this becomes a problem, the
      higher declaration can be contained to just the XAudio2/XInput related code.
      -->
      <PreprocessorDefinitions>_WIN32_WINNT=0x0602;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <WarningLevel>Level4</WarningLevel>
      <TreatWarningAsError>true</TreatWarningAsError>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <RuntimeTypeInfo>false</RuntimeTypeInfo>
      <MinimalRebuild>false</MinimalRebuild>
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
      <!--Enable latest C++ standard-->
      <LanguageStandard>stdcpplatest</LanguageStandard>
      <!--Enable Standard Conformance-->
      <AdditionalOptions>/permissive- %(AdditionalOptions)</AdditionalOptions>
      <!--Enforce some behaviors as standards-conformant when they don't default as such-->
      <AdditionalOptions>/Zc:inline /Zc:throwingNew /volatile:iso %(AdditionalOptions)</AdditionalOptions>
      <!--Enable detailed debug info-->
      <AdditionalOptions>/Zo %(AdditionalOptions)</AdditionalOptions>
      <!--Treat sources as utf-8-->
      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions>
      <DebugInformationFormat>OldStyle</DebugInformationFormat>
      <DiagnosticsFormat>Caret</DiagnosticsFormat>
      <!--
      4996  is for GetVersionEx being marked as deprecated - which is idiotic and there's not much
                else we can do since many externals use it. The bad part is that there doesn't
                seem to be a way to only ignore the specific instance we don't care about...
      4351  new behavior: elements of array 'array' will be default initialized
      -->
      <DisableSpecificWarnings>4996;4351</DisableSpecificWarnings>
      <!-- Warnings one may want to ignore when using Level4.
      4201  nonstandard extension used : nameless struct/union
      4127  conditional expression is constant
      4100  'identifier' : unreferenced formal parameter
      4244  'conversion' conversion from 'type1' to 'type2', possible loss of data
                Level4 warns if type1==int and there is narrowing
      4121  'symbol' : alignment of a member was sensitive to packing
      4324  Padding was added at the end of a structure because you specified a __declspec(align) value.
      4714  function 'function' marked as __forceinline not inlined
      -->
      <DisableSpecificWarnings>4201;4127;4100;4244;4121;4324;4714;%(DisableSpecificWarnings)</DisableSpecificWarnings>
      <!-- Level4 warnings which should eventually be enabled
      4245  'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
                Currently jits use some annoying code patterns which makes this common
      -->
      <DisableSpecificWarnings>4245;%(DisableSpecificWarnings)</DisableSpecificWarnings>
      <!-- Enable some off-by-default warnings
      4263  Non-virtual member function hides base class virtual function
      4265  Class has virtual functions, but destructor is not virtual
      4946  Reinterpret cast between related types
      -->
      <AdditionalOptions>/w44263 /w44265 /w44946 %(AdditionalOptions)</AdditionalOptions>
    </ClCompile>
    <!--ClCompile Debug-->
    <ClCompile Condition="'$(Configuration)'=='Debug'">
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <PreprocessorDefinitions>_DEBUG;_SECURE_SCL=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
      <Optimization>Disabled</Optimization>
    </ClCompile>
    <!--ClCompile Release-->
    <ClCompile Condition="'$(Configuration)'=='Release'">
      <WholeProgramOptimization Condition="'$(DolphinRelease)'=='true'">true</WholeProgramOptimization>
      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
      <OmitFramePointers>true</OmitFramePointers>
      <StringPooling>true</StringPooling>
      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
      <BufferSecurityCheck>false</BufferSecurityCheck>
      <FunctionLevelLinking>false</FunctionLevelLinking>
      <PreprocessorDefinitions>_SECURE_SCL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ClCompile>
    <!--Link Base-->
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <TreatLinkerWarningAsErrors>true</TreatLinkerWarningAsErrors>
    </Link>
    <!--Link Release-->
    <Link Condition="'$(Configuration)'=='Release'">
      <LinkTimeCodeGeneration Condition="'$(DolphinRelease)'=='true'">UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
      <OptimizeReferences>true</OptimizeReferences>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
    </Link>
    <!--Link Base:Application-->
    <Link Condition="'$(ConfigurationType)'=='Application'">
      <!--See Common/CompatPatches.cpp-->
      <ForceSymbolReferences>enableCompatPatches</ForceSymbolReferences>
      <!--TODO fix up ffmpeg garbage-->
      <AdditionalOptions>/NODEFAULTLIB:libcmt %(AdditionalOptions)</AdditionalOptions>
    </Link>
    <Lib>
      <TreatLibWarningAsErrors>true</TreatLibWarningAsErrors>
      <LinkTimeCodeGeneration Condition="'$(DolphinRelease)'=='true'">true</LinkTimeCodeGeneration>
    </Lib>
    <!--
    Prefer VTune 2015 over 2013 but support both since there is no non-commercial license for 2015 :(
    -->
    <ItemDefinitionGroup Condition="Exists('$(VTUNE_AMPLIFIER_XE_2015_DIR)')">
      <ClCompile>
        <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);"$(VTUNE_AMPLIFIER_XE_2015_DIR)\include"</AdditionalIncludeDirectories>
      </ClCompile>
      <Link>
        <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories);"$(VTUNE_AMPLIFIER_XE_2015_DIR)\lib64"</AdditionalLibraryDirectories>
      </Link>
    </ItemDefinitionGroup>
    <ItemDefinitionGroup Condition="Exists('$(VTUNE_AMPLIFIER_XE_2013_DIR)') And !Exists('$(VTUNE_AMPLIFIER_XE_2015_DIR)')">
      <ClCompile>
        <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories);"$(VTUNE_AMPLIFIER_XE_2013_DIR)\include"</AdditionalIncludeDirectories>
      </ClCompile>
      <Link>
        <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories);"$(VTUNE_AMPLIFIER_XE_2013_DIR)\lib64"</AdditionalLibraryDirectories>
      </Link>
    </ItemDefinitionGroup>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>
