<?xml version="1.0" encoding="utf-8"?>
<Project>
  <!--
    This file is included by *everything* (Externals and Dolphin code).
    If you want to define something that only applies to Dolphin code, use Base.Dolphin.props
  -->
  <Import Project="Base.Macros.props" Condition="'$(BaseMacrosImported)'==''" />
  <PropertyGroup>
    <IntDir>$(BuildRootDir)$(Platform)\$(Configuration)\$(ProjectName)\</IntDir>
    <OutDir>$(IntDir)bin\</OutDir>
    <!--Set link /INCREMENTAL:NO to remove some entropy from builds (assists with deterministic build)-->
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <!--ClCompile Base-->
    <ClCompile>
      <!--Base external header policy: ignore all warnings except template instantiations, and disable analyzer-->
      <ExternalWarningLevel>TurnOffAllWarnings</ExternalWarningLevel>
      <ExternalTemplatesDiagnostics>true</ExternalTemplatesDiagnostics>
      <DisableAnalyzeExternal>true</DisableAnalyzeExternal>
      <TreatAngleIncludeAsExternal>true</TreatAngleIncludeAsExternal>

      <WarningLevel>Level4</WarningLevel>
      <TreatWarningAsError>true</TreatWarningAsError>
      <IntrinsicFunctions>true</IntrinsicFunctions>
      <RuntimeTypeInfo>false</RuntimeTypeInfo>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
      <!--This doesn't seem required but nice to be future-proof-->
      <LanguageStandard_C>stdc17</LanguageStandard_C>
      <!--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:__cplusplus,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>
      <!--
        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>
      <!--
        pathmap replaces path prefixes of source files with a hardcoded value, assisting with keeping output
        files uniform even if actually built from different locations. The mapped path doesn't really need full
        drive prefix, but it keeps things human readable. Note the trailing "\" is actually to be escaped by a
        preceeding "\" in the expanded variable.
      -->
      <AdditionalOptions>/pathmap:"$(DolphinRootDir)\"=d:\ %(AdditionalOptions)</AdditionalOptions>
      <AdditionalOptions>/pathmap:"$(WindowsSdkDir)\"=w:\ %(AdditionalOptions)</AdditionalOptions>
      <AdditionalOptions>/pathmap:"$(VCToolsetsDir)\"=v:\ %(AdditionalOptions)</AdditionalOptions>
    </ClCompile>
    <!--ClCompile Debug-->
    <ClCompile Condition="'$(Configuration)'=='Debug'">
      <PreprocessorDefinitions>_DEBUG;%(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>
      <AdditionalOptions>/Gw %(AdditionalOptions)</AdditionalOptions>
      <WholeProgramOptimization Condition="'$(DolphinRelease)'=='true'">true</WholeProgramOptimization>
    </ClCompile>
    <!--Link Base-->
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <TreatLinkerWarningAsErrors>true</TreatLinkerWarningAsErrors>
      <AdditionalOptions>/experimental:deterministic %(AdditionalOptions)</AdditionalOptions>
    </Link>
    <!--Link Release-->
    <Link Condition="'$(Configuration)'=='Release'">
      <LinkTimeCodeGeneration Condition="'$(DolphinRelease)'=='true'">UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
      <OptimizeReferences>true</OptimizeReferences>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
    </Link>
    <Lib>
      <TreatLibWarningAsErrors>true</TreatLibWarningAsErrors>
      <LinkTimeCodeGeneration Condition="'$(DolphinRelease)'=='true'">true</LinkTimeCodeGeneration>
      <AdditionalOptions>/experimental:deterministic %(AdditionalOptions)</AdditionalOptions>
    </Lib>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>
