<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="Microsoft.DotNet.Cli.tasks" />
  <Import Project="prepare/CheckPrereqs.targets" />
  <Import Project="Microsoft.DotNet.Cli.BundledSdks.props" />
  <Import Project="Microsoft.DotNet.Cli.BundledTemplates.props" />
  <Import Project="Microsoft.DotNet.Cli.DependencyVersions.props" />

  <Target Name="Prepare"
          DependsOnTargets="Init;DownloadHostAndSharedFxArtifacts;RestoreSrcPackages;RestoreToolsPackages" />

  <Target Name="Init"
          DependsOnTargets="InitializeCommonProps;
                            BuildDotnetCliBuildFramework;
                            CheckPrereqs;">
  </Target>

  <Target Name="InitializeCommonProps"
          DependsOnTargets="BuildDotnetCliBuildFramework" >

    <!-- Current Runtime Information -->
    <GetCurrentRuntimeInformation OverrideRid="$(OverrideRid)">
      <Output TaskParameter="Rid" PropertyName="Rid" />
      <Output TaskParameter="Architecture" PropertyName="Architecture" />
      <Output TaskParameter="OSName" PropertyName="OSName" />
    </GetCurrentRuntimeInformation>
    
    <!-- Common Properties -->
    <PropertyGroup>
      <IsDesktopAvailable>False</IsDesktopAvailable>
      <IsDesktopAvailable Condition=" '$(OSName)' == 'win' ">True</IsDesktopAvailable>
      <DotNetPath>$(Stage0Directory)</DotNetPath>
      <BaseOutputDirectory>$(RepoRoot)/artifacts/$(Rid)</BaseOutputDirectory>
      <ToolsOutputDirectory>$(BaseOutputDirectory)/tools</ToolsOutputDirectory>
      <Stage1Directory>$(BaseOutputDirectory)/stage1</Stage1Directory>
      <Stage1SymbolsDirectory>$(BaseOutputDirectory)/stage1symbols</Stage1SymbolsDirectory>
      <DotnetStage1>$(Stage1Directory)/dotnet$(ExeExtension)</DotnetStage1>
      <Stage2Directory>$(BaseOutputDirectory)/stage2</Stage2Directory>
      <Stage2SymbolsDirectory>$(BaseOutputDirectory)/stage2symbols</Stage2SymbolsDirectory>
      <DotnetStage2>$(Stage2Directory)/dotnet$(ExeExtension)</DotnetStage2>
      <OutputDirectory>$(Stage2Directory)/</OutputDirectory>
      <Stage2CompilationDirectory>$(BaseOutputDirectory)/stage2compilation</Stage2CompilationDirectory>
      <IntermediateDirectory>$(BaseOutputDirectory)/intermediate</IntermediateDirectory>
      <PackagesDirectory>$(BaseOutputDirectory)/packages</PackagesDirectory>
      <SharedFrameworkPublishDirectory>$(IntermediateDirectory)/sharedFrameworkPublish</SharedFrameworkPublishDirectory>
      <CoreCLRRid>$(Rid)</CoreCLRRid>
      <CoreCLRRid Condition=" '$(OSName)' == 'win' ">win7-$(Architecture)</CoreCLRRid>
      <CoreCLRRid Condition=" '$(OSName)' == 'osx' ">osx.10.10-x64</CoreCLRRid>
      <CoreCLRRid Condition=" '$(OSName)' == 'centos' OR '$(OSName)' == 'rhel' ">rhel.7-x64</CoreCLRRid>
      <CoreSetupBlobAccessTokenParam Condition=" '$(CoreSetupBlobAccessToken)' != '' ">?$(CoreSetupBlobAccessToken)</CoreSetupBlobAccessTokenParam>
    </PropertyGroup>

    <GetCommitHash RepoRoot="$(RepoRoot)">
      <Output TaskParameter="CommitHash" PropertyName="CommitHash" />
    </GetCommitHash>

    <GenerateBuildVersionInfo RepoRoot="$(RepoRoot)">
      <Output TaskParameter="VersionMajor" PropertyName="VersionMajor" />
      <Output TaskParameter="VersionMinor" PropertyName="VersionMinor" />
      <Output TaskParameter="VersionPatch" PropertyName="VersionPatch" />
      <Output TaskParameter="CommitCount" PropertyName="DefaultCommitCount" />
      <Output TaskParameter="ReleaseSuffix" PropertyName="DefaultReleaseSuffix" />
      <Output TaskParameter="MsiVersion" PropertyName="MsiVersion" />
      <Output TaskParameter="VersionBadgeMoniker" PropertyName="VersionBadgeMoniker" />
      <Output TaskParameter="Channel" PropertyName="Channel" />
      <Output TaskParameter="BranchName" PropertyName="BranchName" Condition=" '$(BranchName)' == '' " />
    </GenerateBuildVersionInfo>

    <PropertyGroup>
      <CommitCount Condition=" '$(CommitCount)' == '' ">$(DefaultCommitCount)</CommitCount>
      <ReleaseSuffix Condition=" '$(ReleaseSuffix)' == '' ">$(DefaultReleaseSuffix)</ReleaseSuffix>

      <SimpleVersion Condition=" '$(DropSuffix)' == '' ">$(VersionMajor).$(VersionMinor).$(VersionPatch).$(CommitCount)</SimpleVersion>
      <SimpleVersion Condition=" '$(SimpleVersion)' == '' ">$(VersionMajor).$(VersionMinor).$(VersionPatch)</SimpleVersion>

      <VersionSuffix Condition=" '$(DropSuffix)' == '' ">$(ReleaseSuffix)-$(CommitCount)</VersionSuffix>

      <FullNugetVersion>$(VersionMajor).$(VersionMinor).$(VersionPatch)-$(ReleaseSuffix)-$(CommitCount)</FullNugetVersion>

      <NugetVersion Condition=" '$(DropSuffix)' == '' ">$(FullNugetVersion)</NugetVersion>
      <NugetVersion Condition=" '$(NugetVersion)' == '' ">$(VersionMajor).$(VersionMinor).$(VersionPatch)</NugetVersion>

      <SdkVersion>$(NugetVersion)</SdkVersion>
      <SdkNugetVersion>$(NugetVersion)</SdkNugetVersion>

      <VersionBadge>$(BaseOutputDirectory)/$(VersionBadgeMoniker)_$(Configuration)_version_badge.svg</VersionBadge>

      <ArchiveExtension Condition=" '$(OSName)' == 'win' ">.zip</ArchiveExtension>
      <ArchiveExtension Condition=" '$(OSName)' != 'win' ">.tar.gz</ArchiveExtension>

      <InstallerExtension Condition=" '$(OSName)' == 'win' ">.msi</InstallerExtension>
      <InstallerExtension Condition=" '$(OSName)' == 'osx' ">.pkg</InstallerExtension>
      <InstallerExtension Condition=" '$(OSName)' == 'ubuntu' ">.deb</InstallerExtension>

      <BundleExtension Condition=" '$(OSName)' == 'win' ">.exe</BundleExtension>
      <BundleExtension Condition=" '$(OSName)' == 'osx' ">$(InstallerExtension)</BundleExtension>
      <BundleExtension Condition=" '$(OSName)' == 'ubuntu' ">$(InstallerExtension)</BundleExtension>

      <ProductMonikerRid Condition=" '$(Rid)' == 'ubuntu.16.04-x64' Or 
                                     '$(Rid)' == 'ubuntu.16.10-x64' Or 
                                     '$(Rid)' == 'fedora.23-x64' Or 
                                     '$(Rid)' == 'fedora.24-x64' Or 
                                     '$(Rid)' == 'opensuse.13.2-x64' Or 
                                     '$(Rid)' == 'opensuse.42.1-x64' ">$(Rid)</ProductMonikerRid>
      <ProductMonikerRid Condition=" '$(ProductMonikerRid)' == '' ">$(OSName)-$(Architecture)</ProductMonikerRid>

      <DynamicLibPrefix>lib</DynamicLibPrefix>
      <DynamicLibPrefix Condition=" '$(OSName)' == 'win' "></DynamicLibPrefix>
      <DynamicLibExtension>.so</DynamicLibExtension>
      <DynamicLibExtension Condition=" '$(OSName)' == 'win' ">.dll</DynamicLibExtension>
      <DynamicLibExtension Condition=" '$(OSName)' == 'osx' ">.dylib</DynamicLibExtension>

      <ArtifactNameSdk>dotnet-sdk</ArtifactNameSdk>
      <ArtifactNameSdkDebug>dotnet-sdk-debug</ArtifactNameSdkDebug>
      <ArtifactNameCombinedHostHostFxrFrameworkSdk>dotnet-dev</ArtifactNameCombinedHostHostFxrFrameworkSdk>
      <ArtifactNameCombinedFrameworkSdk>dotnet-sharedframework-sdk</ArtifactNameCombinedFrameworkSdk>

      <ArtifactNameWithVersionSdk>$(ArtifactNameSdk)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionSdk>
      <ArtifactNameWithVersionSdkDebug>$(ArtifactNameSdkDebug)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionSdkDebug>
      <ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>$(ArtifactNameCombinedHostHostFxrFrameworkSdk)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionCombinedHostHostFxrFrameworkSdk>
      <ArtifactNameWithVersionCombinedFrameworkSdk>$(ArtifactNameCombinedFrameworkSdk)-$(ProductMonikerRid).$(SdkVersion)</ArtifactNameWithVersionCombinedFrameworkSdk>

      <!-- Downloaded Installers + Archives -->
      <DownloadedSharedHostInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-host-$(ProductMonikerRid).$(SharedHostVersion)$(InstallerExtension)</DownloadedSharedHostInstallerFileName>
      <DownloadedSharedHostInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedSharedHostInstallerFileName)</DownloadedSharedHostInstallerFile>

      <DownloadedHostFxrInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-hostfxr-$(ProductMonikerRid).$(HostFxrVersion)$(InstallerExtension)</DownloadedHostFxrInstallerFileName>
      <DownloadedHostFxrInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedHostFxrInstallerFileName)</DownloadedHostFxrInstallerFile>

      <DownloadedSharedFrameworkInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-sharedframework-$(ProductMonikerRid).$(SharedFrameworkVersion)$(InstallerExtension)</DownloadedSharedFrameworkInstallerFileName>
      <DownloadedSharedFrameworkInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(DownloadedSharedFrameworkInstallerFileName)</DownloadedSharedFrameworkInstallerFile>

      <CombinedFrameworkHostCompressedFileName>dotnet-$(ProductMonikerRid).$(SharedFrameworkVersion)$(ArchiveExtension)</CombinedFrameworkHostCompressedFileName>
    </PropertyGroup>

    <PropertyGroup>
      <HasAdditionalSharedFramework Condition="'$(Rid)' != 'ubuntu.16.10-x64' AND
                                               '$(Rid)' != 'fedora.24-x64' AND
                                               '$(Rid)' != 'opensuse.42.1-x64'">true</HasAdditionalSharedFramework>
      <IncludeAdditionalSharedFrameworks Condition=" '$(IncludeAdditionalSharedFrameworks)' == '' AND '$(HasAdditionalSharedFramework)' == 'true' ">true</IncludeAdditionalSharedFrameworks>
      <IncludeAdditionalSharedFrameworks Condition=" '$(IncludeAdditionalSharedFrameworks)' == '' ">false</IncludeAdditionalSharedFrameworks>
    </PropertyGroup>

    <!-- Additional Shared Framework to be installed -->
    <PropertyGroup Condition=" '$(IncludeAdditionalSharedFrameworks)' == 'true' ">
      <AdditionalCoreSetupChannel>preview</AdditionalCoreSetupChannel>
      <AdditionalSharedFrameworkVersion>1.0.5</AdditionalSharedFrameworkVersion>
      <AdditionalSharedHostVersion>1.0.1</AdditionalSharedHostVersion>
      <AdditionalHostFxrContainerVersion>1.0.1</AdditionalHostFxrContainerVersion>
      <AdditionalHostFxrVersion Condition=" '$(OSName)' != 'win' ">1.0.1</AdditionalHostFxrVersion>
      <AdditionalHostFxrVersion Condition=" '$(OSName)' == 'win' ">1.0.5</AdditionalHostFxrVersion>

      <!-- Additional Downloaded Installers + Archives -->
      <AdditionalDownloadedSharedHostInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-host-$(ProductMonikerRid).$(AdditionalSharedHostVersion)$(InstallerExtension)</AdditionalDownloadedSharedHostInstallerFileName>
      <AdditionalDownloadedSharedHostInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(AdditionalDownloadedSharedHostInstallerFileName)</AdditionalDownloadedSharedHostInstallerFile>

      <AdditionalDownloadedHostFxrInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-hostfxr-$(ProductMonikerRid).$(AdditionalHostFxrVersion)$(InstallerExtension)</AdditionalDownloadedHostFxrInstallerFileName>
      <AdditionalDownloadedHostFxrInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(AdditionalDownloadedHostFxrInstallerFileName)</AdditionalDownloadedHostFxrInstallerFile>

      <AdditionalDownloadedSharedFrameworkInstallerFileName Condition=" '$(InstallerExtension)' != '' ">dotnet-sharedframework-$(ProductMonikerRid).$(AdditionalSharedFrameworkVersion)$(InstallerExtension)</AdditionalDownloadedSharedFrameworkInstallerFileName>
      <AdditionalDownloadedSharedFrameworkInstallerFile Condition=" '$(InstallerExtension)' != '' ">$(PackagesDirectory)/$(AdditionalDownloadedSharedFrameworkInstallerFileName)</AdditionalDownloadedSharedFrameworkInstallerFile>

      <AdditionalCombinedFrameworkHostCompressedFileName>dotnet-$(ProductMonikerRid).$(AdditionalSharedFrameworkVersion)$(ArchiveExtension)</AdditionalCombinedFrameworkHostCompressedFileName>
    </PropertyGroup>


    <!-- SetTelemetryProfile -->
    <SetEnvVar Name="DOTNET_CLI_TELEMETRY_PROFILE" Value="$(DOTNET_CLI_TELEMETRY_PROFILE);https://github.com/dotnet/cli;$(CommitHash)" />
  </Target>

  <Target Name="SetupDownloadHostAndSharedFxInputsOutputs" DependsOnTargets="Init">
    <PropertyGroup>
      <CoreSetupBlobRootUrl Condition="'$(CoreSetupBlobRootUrl)' == ''">https://dotnetcli.azureedge.net/dotnet/</CoreSetupBlobRootUrl>
      <CoreSetupBlobRootUrlWithChannel>$(CoreSetupBlobRootUrl)$(CoreSetupChannel)</CoreSetupBlobRootUrlWithChannel>
      <SharedFrameworkArchiveBlobRootUrl>$(CoreSetupBlobRootUrlWithChannel)/Binaries/$(SharedFrameworkVersion)</SharedFrameworkArchiveBlobRootUrl>
      <CoreSetupInstallerBlobRootUrl>$(CoreSetupBlobRootUrlWithChannel)/Installers</CoreSetupInstallerBlobRootUrl>
      <CoreSetupDownloadDirectory>$(IntermediateDirectory)/coreSetupDownload/$(SharedFrameworkVersion)</CoreSetupDownloadDirectory>
      <CombinedSharedHostAndFrameworkArchive>$(CoreSetupDownloadDirectory)/combinedSharedHostAndFrameworkArchive</CombinedSharedHostAndFrameworkArchive>
    </PropertyGroup>

    <ItemGroup>
      <_DownloadAndExtractItem Include="CombinedSharedHostAndFrameworkArchive"
                               Condition="!Exists('$(CombinedSharedHostAndFrameworkArchive)')">
        <Url>$(SharedFrameworkArchiveBlobRootUrl)/$(CombinedFrameworkHostCompressedFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(CombinedSharedHostAndFrameworkArchive)</DownloadFileName>
        <ExtractDestination>$(SharedFrameworkPublishDirectory)</ExtractDestination>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="DownloadedSharedFrameworkInstallerFile"
                               Condition="!Exists('$(DownloadedSharedFrameworkInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(CoreSetupInstallerBlobRootUrl)/$(SharedFrameworkVersion)/$(DownloadedSharedFrameworkInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(DownloadedSharedFrameworkInstallerFile)</DownloadFileName>
        <ExtractDestination></ExtractDestination>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="DownloadedSharedHostInstallerFile"
                               Condition="!Exists('$(DownloadedSharedHostInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(CoreSetupInstallerBlobRootUrl)/$(SharedHostVersion)/$(DownloadedSharedHostInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(DownloadedSharedHostInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="DownloadedHostFxrInstallerFile"
                               Condition="!Exists('$(DownloadedHostFxrInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(CoreSetupInstallerBlobRootUrl)/$(HostFxrContainerVersion)/$(DownloadedHostFxrInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(DownloadedHostFxrInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>
    </ItemGroup>

    <!-- Additional Shared Framework to be installed -->
    <PropertyGroup Condition=" '$(IncludeAdditionalSharedFrameworks)' != 'false' ">
      <AdditionalCoreSetupBlobRootUrlWithChannel>$(CoreSetupBlobRootUrl)$(AdditionalCoreSetupChannel)</AdditionalCoreSetupBlobRootUrlWithChannel>
      <AdditionalSharedFrameworkArchiveBlobRootUrl>$(AdditionalCoreSetupBlobRootUrlWithChannel)/Binaries/$(AdditionalSharedFrameworkVersion)</AdditionalSharedFrameworkArchiveBlobRootUrl>
      <AdditionalCoreSetupInstallerBlobRootUrl>$(AdditionalCoreSetupBlobRootUrlWithChannel)/Installers</AdditionalCoreSetupInstallerBlobRootUrl>
      <AdditionalCoreSetupDownloadDirectory>$(IntermediateDirectory)/coreSetupDownload/$(AdditionalSharedFrameworkVersion)</AdditionalCoreSetupDownloadDirectory>
      <AdditionalCombinedSharedHostAndFrameworkArchive>$(AdditionalCoreSetupDownloadDirectory)/combinedSharedHostAndFrameworkArchive</AdditionalCombinedSharedHostAndFrameworkArchive>
    </PropertyGroup>

    <ItemGroup Condition=" '$(IncludeAdditionalSharedFrameworks)' != 'false' ">
      <_DownloadAndExtractItem Include="AdditionalCombinedSharedHostAndFrameworkArchive"
                               Condition="!Exists('$(AdditionalCombinedSharedHostAndFrameworkArchive)')">
        <Url>$(AdditionalSharedFrameworkArchiveBlobRootUrl)/$(AdditionalCombinedFrameworkHostCompressedFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(AdditionalCombinedSharedHostAndFrameworkArchive)</DownloadFileName>
        <ExtractDestination>$(SharedFrameworkPublishDirectory)</ExtractDestination>
        <!-- don't overwrite the destination because both shared fx's need to be combined -->
        <OverwriteDestination>False</OverwriteDestination>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="AdditionalDownloadedSharedFrameworkInstallerFile"
                               Condition="!Exists('$(AdditionalDownloadedSharedFrameworkInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(AdditionalCoreSetupInstallerBlobRootUrl)/$(AdditionalSharedFrameworkVersion)/$(AdditionalDownloadedSharedFrameworkInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(AdditionalDownloadedSharedFrameworkInstallerFile)</DownloadFileName>
        <ExtractDestination></ExtractDestination>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="AdditionalDownloadedSharedHostInstallerFile"
                               Condition="!Exists('$(AdditionalDownloadedSharedHostInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(AdditionalCoreSetupInstallerBlobRootUrl)/$(AdditionalSharedHostVersion)/$(AdditionalDownloadedSharedHostInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(AdditionalDownloadedSharedHostInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>

      <_DownloadAndExtractItem Include="AdditionalDownloadedHostFxrInstallerFile"
                               Condition="!Exists('$(AdditionalDownloadedHostFxrInstallerFile)') And '$(InstallerExtension)' != ''">
        <Url>$(AdditionalCoreSetupInstallerBlobRootUrl)/$(AdditionalHostFxrContainerVersion)/$(AdditionalDownloadedHostFxrInstallerFileName)$(CoreSetupBlobAccessTokenParam)</Url>
        <DownloadFileName>$(AdditionalDownloadedHostFxrInstallerFile)</DownloadFileName>
        <ExtractDestintation></ExtractDestintation>
      </_DownloadAndExtractItem>
    </ItemGroup>
  </Target>

  <Target Name="DownloadHostAndSharedFxArtifacts"
          DependsOnTargets="SetupDownloadHostAndSharedFxInputsOutputs">

    <PropertyGroup>
      <OverwriteExtractionDestination>%(_DownloadAndExtractItem.OverwriteDestination)</OverwriteExtractionDestination>
      <OverwriteExtractionDestination Condition="'$(OverwriteExtractionDestination)' == ''">True</OverwriteExtractionDestination>
    </PropertyGroup>
    
    <DownloadFile Condition=" '@(_DownloadAndExtractItem)' != '' "
                  Uri="%(_DownloadAndExtractItem.Url)"
                  DestinationPath="%(_DownloadAndExtractItem.DownloadFileName)" />

    <ZipFileExtractToDirectory Condition=" '%(_DownloadAndExtractItem.ExtractDestination)' != '' AND '$(OSName)' == 'win' "
                               SourceArchive="%(_DownloadAndExtractItem.DownloadFileName)"
                               DestinationDirectory="%(_DownloadAndExtractItem.ExtractDestination)"
                               OverwriteDestination="$(OverwriteExtractionDestination)" />

    <TarGzFileExtractToDirectory Condition=" '%(_DownloadAndExtractItem.ExtractDestination)' != '' AND '$(OSName)' != 'win' "
                               SourceArchive="%(_DownloadAndExtractItem.DownloadFileName)"
                               DestinationDirectory="%(_DownloadAndExtractItem.ExtractDestination)"
                               OverwriteDestination="$(OverwriteExtractionDestination)" />
  </Target>

  <Target Name="RestoreSrcPackages"
          DependsOnTargets="SetupRestoreSrcPackagesInputsOutputs;Init"
          Inputs="@(RestoreSrcPackagesInput)"
          Outputs="@(RestoreSrcPackagesInput->'%(RelativeDir)/obj/project.assets.json');@(RestoreSrcPackagesInput->'%(RelativeDir)/obj/%(Filename).csproj.nuget.g.props');@(RestoreSrcPackagesInput->'%(RelativeDir)/obj/%(Filename).csproj.nuget.g.targets')">

    <CallTarget Targets="CleanSrcLockFiles" />

    <DotNetRestore ToolPath="$(DotNetPath)"
                   ProjectPath="&quot;%(RestoreSrcPackagesInput.FullPath)&quot;"
                   ConfigFile="$(RepoRoot)\NuGet.Config" />

  </Target>

  <Target Name="CleanSrcLockFiles" >
    <ItemGroup>
      <SrcLockFiles Include="$(RepoRoot)/src/**/project.assets.json;$(RepoRoot)/src/**/*.csproj.nuget.g.props;$(RepoRoot)/src/**/*.csproj.nuget.g.targets" />
    </ItemGroup>
    <Delete Files="@(SrcLockFiles)" />
  </Target>

  <Target Name="SetupRestoreSrcPackagesInputsOutputs">
    <ItemGroup>
      <RestoreSrcPackagesInput Include="$(RepoRoot)/src/**/*.csproj" Exclude="$(RepoRoot)/src/**/%24projectName%24.csproj"/>
    </ItemGroup>
  </Target>

  <Target Name="RestoreToolsPackages"
          DependsOnTargets="SetupRestoreToolsPackagesInputsOutputs;Init"
          Inputs="@(RestoreToolsPackagesInput)"
          Outputs="@(RestoreToolsPackagesInput->'%(RelativeDir)/obj/project.assets.json');@(RestoreToolsPackagesInput->'%(RelativeDir)/obj/%(Filename).csproj.nuget.g.props');@(RestoreToolsPackagesInput->'%(RelativeDir)/obj/%(Filename).csproj.nuget.g.targets')">

    <CallTarget Targets="CleanToolsLockFiles" />

    <DotNetRestore ToolPath="$(DotNetPath)"
                   ProjectPath="&quot;%(RestoreToolsPackagesInput.FullPath)&quot;"
                   ConfigFile="$(RepoRoot)\NuGet.Config" />

  </Target>

  <Target Name="CleanToolsLockFiles" >
    <ItemGroup>
      <ToolsLockFiles Include="$(RepoRoot)/tools/**/project.assets.json;$(RepoRoot)/tools/**/*.csproj.nuget.g.props;$(RepoRoot)/tools/**/*.csproj.nuget.g.targets" />
    </ItemGroup>
    <Delete Files="@(ToolsLockFiles)" />
  </Target>

  <Target Name="SetupRestoreToolsPackagesInputsOutputs">
    <ItemGroup>
      <RestoreToolsPackagesInput Include="$(RepoRoot)/tools/**/*.csproj" />
    </ItemGroup>
  </Target>

</Project>