<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="Base.Macros.props" Condition="'$(BaseMacrosImported)'==''" />
  <PropertyGroup>
    <IntDir>$(BuildRootDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
    <OutDir>$(IntDir)bin\</OutDir>
    <TargetName Condition="'$(ConfigurationType)'=='Application'">$(ProjectName)$(TargetSuffix)</TargetName>
    <!--Set link /INCREMENTAL:NO to remove some entropy from builds (assists with /Brepro)-->
    <LinkIncremental>false</LinkIncremental>
    <!--
      Coagulate external include directories.
      Order matters! (first hit, first use).
        Note: Directory containing source file being compiled is always searched first.
      -->
    <ExternalIncludePath>$(ExternalsDir)Bochs_disasm;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)bzip2;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)cpp-optparse;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)FreeSurround\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)cubeb\include;$(ExternalsDir)cubeb\msvc;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)curl\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)discord-rpc\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)ed25519;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)enet\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)ffmpeg\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)fmt\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)GL;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)glslang;$(ExternalsDir)glslang\StandAlone;$(ExternalsDir)glslang\glslang\Public;$(ExternalsDir)glslang\SPIRV;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)imgui;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)liblzma\api;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)libpng;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)libusb\libusb;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)LZO;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)mGBA\mgba\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)miniupnpc\src;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)minizip;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)mbedtls\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)OpenAL\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)picojson;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)pugixml;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)rangeset\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)SFML\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)soundtouch;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)Vulkan\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)WIL\include;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)xxhash;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)zlib;$(ExternalIncludePath)</ExternalIncludePath>
    <ExternalIncludePath>$(ExternalsDir)zstd\lib;$(ExternalIncludePath)</ExternalIncludePath>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <!--ClCompile Base-->
    <ClCompile>
      <AdditionalIncludeDirectories>$(CoreDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
      <!--Base external header policy: ignore all warnings except template instantiations, and disable analyzer-->
      <ExternalWarningLevel>TurnOffAllWarnings</ExternalWarningLevel>
      <ExternalTemplatesDiagnostics>true</ExternalTemplatesDiagnostics>
      <DisableAnalyzeExternal>true</DisableAnalyzeExternal>
      <PreprocessorDefinitions>FMT_HEADER_ONLY=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!--
        It would be a good idea to disable _CRT_SECURE_NO_WARNINGS and get rid of e.g. C string parsing funcs
        Unfortunately this also complains about FILE* APIs, which can be inconvenient to replace.
      -->
      <PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!--IOS net code uses some ipv4-only functions which are marked as deprecated by winsock2-->
      <PreprocessorDefinitions>_WINSOCK_DEPRECATED_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!--Currently needed for some code in StringUtil used only on Android-->
      <PreprocessorDefinitions>_SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>USE_UPNP;USE_USBDK;__LIBUSB__;%(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>WIL_SUPPRESS_EXCEPTIONS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>LZMA_API_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(Platform)'=='x64'">_ARCH_64=1;_M_X86=1;_M_X86_64=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(Platform)'=='ARM64'">_ARCH_64=1;_M_ARM_64=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(Platform)'=='x64'">HAVE_FFMPEG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>USE_GDBSTUB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions Condition="'$(Platform)'!='ARM64'">HAS_OPENGL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>HAS_VULKAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <PreprocessorDefinitions>HAS_LIBMGBA;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!--
      Make sure we include a clean version of windows.h.
      -->
      <PreprocessorDefinitions>WIN32_LEAN_AND_MEAN;NOMINMAX;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <WarningLevel>Level4</WarningLevel>
      <TreatWarningAsError>true</TreatWarningAsError>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <RuntimeTypeInfo>false</RuntimeTypeInfo>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
      <!--Enable latest C++ standard-->
      <LanguageStandard>stdcpplatest</LanguageStandard>
      <!--Enable Standard Conformance-->
      <ConformanceMode>true</ConformanceMode>
      <!--Enforce some behaviors as standards-conformant when they don't default as such.-->
      <AdditionalOptions>/Zc:externConstexpr,lambda,preprocessor,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>
      <!-- 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>
      <!-- Temporarily disable warnings to enable /Zc:preprocessor compatibility with WinSDK headers.
      5105  macro expansion producing 'defined' has undefined behavior
      -->
      <DisableSpecificWarnings>5105;%(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>
      <AdditionalOptions>/Brepro %(AdditionalOptions)</AdditionalOptions>
      <!--
        A (currently) hidden switch, like /Brepro, furthermore enabling warnings about non-deterministic code.
        This may be advantageous over /Brepro, which inits __DATE__, __TIME__, etc. equal to 1 (and allows
        them to be redefined), which could have unexpected results.
      -->
      <AdditionalOptions>/experimental:deterministic %(AdditionalOptions)</AdditionalOptions>
    </ClCompile>
    <!--ClCompile Debug-->
    <ClCompile Condition="'$(Configuration)'=='Debug'">
      <PreprocessorDefinitions>_DEBUG;_SECURE_SCL=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
      <Optimization>Disabled</Optimization>
    </ClCompile>
    <ClCompile Condition="'$(Configuration)'=='Debug' And '$(EnableASAN)'=='true'">
      <BasicRuntimeChecks>Default</BasicRuntimeChecks>
    </ClCompile>
    <!--ClCompile Release-->
    <ClCompile Condition="'$(Configuration)'=='Release'">
      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
      <OmitFramePointers>true</OmitFramePointers>
      <StringPooling>true</StringPooling>
      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
      <BufferSecurityCheck>false</BufferSecurityCheck>
      <PreprocessorDefinitions>_SECURE_SCL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <AdditionalOptions>/Gw %(AdditionalOptions)</AdditionalOptions>
      <WholeProgramOptimization Condition="'$(DolphinRelease)'=='true'">true</WholeProgramOptimization>
    </ClCompile>
    <!--Link Base-->
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <TreatLinkerWarningAsErrors>true</TreatLinkerWarningAsErrors>
      <AdditionalOptions>/Brepro %(AdditionalOptions)</AdditionalOptions>
    </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>
      <AdditionalOptions>/Brepro %(AdditionalOptions)</AdditionalOptions>
    </Lib>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>