<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0"
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Project configurations -->
  <ItemGroup Label="ProjectConfigurations">
    <ProjectConfiguration Include="Debug|x64">
      <Configuration>Debug</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|x64">
      <Configuration>Release</Configuration>
      <Platform>x64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Debug|ARM64">
      <Configuration>Debug</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
    <ProjectConfiguration Include="Release|ARM64">
      <Configuration>Release</Configuration>
      <Platform>ARM64</Platform>
    </ProjectConfiguration>
  </ItemGroup>

  <!-- Run code analysis locally and in PR CI, but not on release CI -->
  <PropertyGroup Condition="'$(SkipCppCodeAnalysis)' == ''">
    <RunCodeAnalysis>true</RunCodeAnalysis>
    <CodeAnalysisRuleSet>$(MsbuildThisFileDirectory)\CppRuleSet.ruleset</CodeAnalysisRuleSet>
  </PropertyGroup>

  <!-- C++ source compile-specific things for all configurations -->
  <PropertyGroup>
    <PreferredToolArchitecture>x64</PreferredToolArchitecture>
    <PreferredToolArchitecture Condition="'$(PROCESSOR_ARCHITECTURE)' == 'ARM64' or '$(PROCESSOR_ARCHITEW6432)' == 'ARM64'">arm64</PreferredToolArchitecture>
    <VcpkgEnabled>false</VcpkgEnabled>
    <ExternalIncludePath>$(MSBuildThisFileFullPath)\..\deps\;$(MSBuildThisFileFullPath)\..\packages\;$(ExternalIncludePath)</ExternalIncludePath>
    <!-- Enable control flow guard for C++ projects that don't consume any C++ files -->
    <!-- This covers the case where a .dll exports a .lib, but doesn't have any ClCompile entries. -->
    <LinkControlFlowGuard>Guard</LinkControlFlowGuard>
  </PropertyGroup>
  <ItemDefinitionGroup>
    <ClCompile>
      <MultiProcessorCompilation>true</MultiProcessorCompilation>
      <PrecompiledHeader Condition="'$(UsePrecompiledHeaders)' != 'false'">Use</PrecompiledHeader>
      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
      <WarningLevel>Level4</WarningLevel>
      <DisableSpecificWarnings>4679;5271;%(DisableSpecificWarnings)</DisableSpecificWarnings>
      <DisableAnalyzeExternal >true</DisableAnalyzeExternal>
      <ExternalWarningLevel>TurnOffAllWarnings</ExternalWarningLevel>
      <ConformanceMode>false</ConformanceMode>
      <TreatWarningAsError>true</TreatWarningAsError>
      <LanguageStandard>stdcpplatest</LanguageStandard>
      <BuildStlModules>false</BuildStlModules>
      <AdditionalOptions>/await %(AdditionalOptions)</AdditionalOptions>
      <!-- TODO: _SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING for compatibility with VS 17.8. Check if we can remove. -->
      <PreprocessorDefinitions>_SILENCE_STDEXT_ARR_ITERS_DEPRECATION_WARNING;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <!-- CLR + CFG are not compatible >:{ -->
      <ControlFlowGuard Condition="'$(CLRSupport)' == ''">Guard</ControlFlowGuard>
      <DebugInformationFormat Condition="'%(ControlFlowGuard)' == 'Guard'">ProgramDatabase</DebugInformationFormat>
      <SDLCheck>true</SDLCheck>
    </ClCompile>
    <Link>
      <SubSystem>Windows</SubSystem>
    </Link>
    <Lib>
      <TreatLibWarningAsErrors>true</TreatLibWarningAsErrors>
    </Lib>
  </ItemDefinitionGroup>

  <!-- C++ source compile-specific things for Debug/Release configurations -->
  <ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
    <ClCompile>
      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Optimization>Disabled</Optimization>
      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
    </ClCompile>
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
    <ClCompile>
      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
      <Optimization>MaxSpeed</Optimization>
      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
      <FunctionLevelLinking>true</FunctionLevelLinking>
      <IntrinsicFunctions>true</IntrinsicFunctions>
    </ClCompile>
    <Link>
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <OptimizeReferences>true</OptimizeReferences>
    </Link>
  </ItemDefinitionGroup>

  <!-- Global props -->
  <PropertyGroup Label="Globals"
    Condition="'$(OverrideWindowsTargetPlatformVersion)'!='True'">
    <WindowsTargetPlatformVersion>10.0.20348.0</WindowsTargetPlatformVersion>
    <TargetPlatformVersion>10.0.20348.0</TargetPlatformVersion>
    <WindowsTargetPlatformMinVersion>10.0.19041.0</WindowsTargetPlatformMinVersion>
  </PropertyGroup>

  <!-- Props that are constant for both Debug and Release configurations -->
  <PropertyGroup Label="Configuration">
    <PlatformToolset Condition="'$(OverridePlatformToolset)'!='True'">v143</PlatformToolset>
    <CharacterSet>Unicode</CharacterSet>
    <DesktopCompatible>true</DesktopCompatible>
    <SpectreMitigation>Spectre</SpectreMitigation>
  </PropertyGroup>

  <!-- Debug/Release props -->
  <PropertyGroup Condition="'$(Configuration)'=='Debug'"
    Label="Configuration">
    <UseDebugLibraries>true</UseDebugLibraries>
    <LinkIncremental>true</LinkIncremental>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)'=='Release'"
    Label="Configuration">
    <UseDebugLibraries>false</UseDebugLibraries>
    <WholeProgramOptimization>true</WholeProgramOptimization>
    <LinkIncremental>false</LinkIncremental>
  </PropertyGroup>

</Project>
