<Project>
  <!--
    NOTE! This file gets written-over entirely by the release builds.
    Any build logic in this file must be optional and only apply to non-release builds.
  -->

  <!-- MsBuildCache -->
  <PropertyGroup>
    <!-- Off by default -->
    <MsBuildCacheEnabled Condition="'$(MsBuildCacheEnabled)' == ''">false</MsBuildCacheEnabled>

    <!-- Always off during package restore -->
    <MsBuildCacheEnabled Condition=" '$(ExcludeRestorePackageImports)' == 'true' ">false</MsBuildCacheEnabled>

    <!-- In Azure pipelines, use Pipeline Caching as the cache storage backend. Otherwise, use the local cache. -->
    <MSBuildCachePackageName Condition="'$(TF_BUILD)' != ''">Microsoft.MSBuildCache.AzurePipelines</MSBuildCachePackageName>
    <MSBuildCachePackageName Condition="'$(MSBuildCachePackageName)' == ''">Microsoft.MSBuildCache.Local</MSBuildCachePackageName>
  </PropertyGroup>

  <PropertyGroup Condition="'$(MSBuildCacheEnabled)' == 'true'">
    <!-- Change this to bust the cache -->
    <MSBuildCacheCacheUniverse Condition="'$(MSBuildCacheCacheUniverse)' == ''">202310210737</MSBuildCacheCacheUniverse>

    <!--
      Visual Studio telemetry reads various ApplicationInsights.config files and other files after the project is finished, likely in a detached process.
      This is acceptable and should not impact cache correctness.
    -->
    <MSBuildCacheAllowFileAccessAfterProjectFinishFilePatterns>
      $(MSBuildCacheAllowFileAccessAfterProjectFinishFilePatterns);
      \**\ApplicationInsights.config;
      $(LocalAppData)\Microsoft\VSApplicationInsights\**;
      $(LocalAppData)\Microsoft\Windows\INetCache\**;
      A:\;
      E:\;
      $(windir)\**;
    </MSBuildCacheAllowFileAccessAfterProjectFinishFilePatterns>

    <!-- 
      This repo uses a common output directory with many projects writing duplicate outputs. Allow everything, but note this costs some performance in the form of requiring
      the cache to use copies instead of hardlinks when pulling from cache.
    -->
    <MSBuildCacheIdenticalDuplicateOutputPatterns>$(MSBuildCacheIdenticalDuplicateOutputPatterns);bin\**</MSBuildCacheIdenticalDuplicateOutputPatterns>

    <!-- 
      vcpkg is invoked for each and every vcxproj and each invocation uses the same base dir for logging, so allow these duplicate "outputs".
    -->
    <MSBuildCacheIdenticalDuplicateOutputPatterns>$(MSBuildCacheIdenticalDuplicateOutputPatterns);obj\*\vcpkg\**</MSBuildCacheIdenticalDuplicateOutputPatterns>

    <!-- version of MSBuildCache is not part of the cache key -->
    <PackagesConfigFile>$(MSBuildThisFileDirectory)\dep\nuget\packages.config</PackagesConfigFile>
    <MSBuildCacheIgnoredInputPatterns>$(MSBuildCacheIgnoredInputPatterns);$(PackagesConfigFile)</MSBuildCacheIgnoredInputPatterns>
  </PropertyGroup>

  <PropertyGroup Condition="'$(MSBuildCacheEnabled)' == 'true' and '$(MSBuildCachePackageRoot)' == ''">
    <PackagesConfigContents>$([System.IO.File]::ReadAllText("$(PackagesConfigFile)"))</PackagesConfigContents>
    <MSBuildCachePackageVersion>$([System.Text.RegularExpressions.Regex]::Match($(PackagesConfigContents), 'Microsoft.MSBuildCache.*?version="(.*?)"').Groups[1].Value)</MSBuildCachePackageVersion>
    <MSBuildCachePackageRoot>$(MSBuildThisFileDirectory)packages\$(MSBuildCachePackageName).$(MSBuildCachePackageVersion)</MSBuildCachePackageRoot>
    <MSBuildCacheSharedCompilationPackageRoot>$(MSBuildThisFileDirectory)packages\Microsoft.MSBuildCache.SharedCompilation.$(MSBuildCachePackageVersion)</MSBuildCacheSharedCompilationPackageRoot>
  </PropertyGroup>

  <ImportGroup Condition="'$(MSBuildCacheEnabled)' == 'true'">
    <Import Project="$(MSBuildCachePackageRoot)\build\$(MSBuildCachePackageName).props" />
    <Import Project="$(MSBuildCacheSharedCompilationPackageRoot)\build\Microsoft.MSBuildCache.SharedCompilation.props" />
  </ImportGroup>
</Project>