<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="compile/Microsoft.DotNet.Cli.LzmaArchive.targets" />

  <UsingTask TaskName="FixModeFlags" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="ChangeEntryPointLibraryName" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="RemoveAssetFromDepsPackages" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="CleanPublishOutput" AssemblyFile="$(CLIBuildDll)" />
  <UsingTask TaskName="CrossgenDirectory" AssemblyFile="$(CLIBuildDll)" />    

  <Target Name="Compile" DependsOnTargets="Prepare;
                                           SetupStage;
                                           CompileStage;
                                           BuildProjectsForNuGetPackages;
                                           GenerateNuGetPackagesArchive" />

  <Target Name="SetupStage">
    <PropertyGroup>
      <SrcDirectory>$(RepoRoot)/src</SrcDirectory>
    </PropertyGroup>

    <ItemGroup>
      <CompileStageInputs Include="$(SrcDirectory)/**/*.cs" Exclude="$(SrcDirectory)/**/obj/**/*.cs" />
      <CompileStageInputs Include="$(SrcDirectory)/**/project.json;$(SrcDirectory)/**/project.lock.json" />

      <Stage Include="Stage1">
        <Inputs>@(CompileStageInputs)</Inputs>
        <StageDirectory>$(Stage1Directory)</StageDirectory>
        <StageSymbolsDirectory>$(Stage1SymbolsDirectory)</StageSymbolsDirectory>
        <DotnetExe>$(DotnetStage0)</DotnetExe>
      </Stage>
      <Stage Include="Stage2">
        <Inputs>@(CompileStageInputs)</Inputs>
        <StageDirectory>$(Stage2Directory)</StageDirectory>
        <StageSymbolsDirectory>$(Stage2SymbolsDirectory)</StageSymbolsDirectory>
        <DotnetExe>$(DotnetStage1)</DotnetExe>
      </Stage>          
    </ItemGroup>    
  </Target>    

  <Target Name="CompileStage"
          Inputs="%(Stage.Inputs)"
          Outputs="%(StageDirectory)/sdk/$(SdkVersion)/dotnet.dll">
      <PropertyGroup>
        <DynamicLibPrefix Condition=" '$(OSName)' == 'win' "></DynamicLibPrefix>
        <DynamicLibPrefix Condition=" '$(OSName)' != 'win' ">lib</DynamicLibPrefix>

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

        <DotnetHostBaseName>dotnet$(ExeExtension)</DotnetHostBaseName>
        <DotnetHostFxrBaseName>$(DynamicLibPrefix)hostfxr$(DynamicLibSuffix)</DotnetHostFxrBaseName>
        <HostPolicyBaseName>$(DynamicLibPrefix)hostpolicy$(DynamicLibSuffix)</HostPolicyBaseName>

        <StageDirectory>%(Stage.StageDirectory)</StageDirectory>
        <StageSymbolsDirectory>%(Stage.StageSymbolsDirectory)</StageSymbolsDirectory>
        <SdkOutputDirectory>$(StageDirectory)/sdk/$(SdkVersion)</SdkOutputDirectory>            
        <BinaryToCorehostifyRelDir>runtimes/any/native</BinaryToCorehostifyRelDir>
        <BinaryToCorehostifyOutDir>$(SdkOutputDirectory)/$(BinaryToCorehostifyRelDir)</BinaryToCorehostifyOutDir>
        <MSBuildTargetsDirectory>$(SdkOutputDirectory)/runtimes/any/native</MSBuildTargetsDirectory>
        
        <SharedFrameworkNameVersionPath>$(StageDirectory)/shared/$(SharedFrameworkName)/$(SharedFrameworkVersion)</SharedFrameworkNameVersionPath>
      </PropertyGroup>

      <ItemGroup>
        <BinObj Include="$(SrcDirectory)/**/bin/**/*" />
        <BinObj Include="$(SrcDirectory)/**/obj/**/*" />
        <FilesToRemoveFromStageDirectory Include="$(StageDirectory)/**/*" />

        <SharedFramework Include="$(SharedFrameworkPublishDirectory)/**/*" />

        <BinariesToRemove Include="csc" />
        <BinariesToRemove Include="vbc" />
      </ItemGroup>

      <Delete Files="@(BinObj)" />

      <Delete Files="@(FilesToRemoveFromStageDirectory)" />
      <RemoveDir Directories="$(StageDirectory)" />
      <MakeDir Directories="$(StageDirectory)"/>

      <!-- CopySharedFramework -->
      <Copy SourceFiles="@(SharedFramework)"
            DestinationFiles="@(SharedFramework->'$(StageDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />
    
      <!-- Publish DotNet -->
      <Exec Command="%(Stage.DotnetExe) publish
                     --native-subdirectory
                     --output $(SdkOutputDirectory)
                     --configuration $(Configuration)
                     --version-suffix $(CommitCount)
                     $(SrcDirectory)/dotnet" />

      <!-- Corehostify Binaries -->
      <FixModeFlags Dir="$(SdkOutputDirectory)" />

      <Exec Command="%(Stage.DotnetExe) publish
                     --output $(SdkOutputDirectory)
                     --framework netcoreapp1.0
                     $(SrcDirectory)/compilers" />

      <Copy SourceFiles="$(BinaryToCorehostifyOutDir)/csc.exe"
            DestinationFiles="$(SdkOutputDirectory)/csc.dll" />

      <Move SourceFiles="$(BinaryToCorehostifyOutDir)/csc.exe"
            DestinationFiles="$(SdkOutputDirectory)/csc.exe" />

      <Copy SourceFiles="$(SdkOutputDirectory)/compilers.deps.json"
            DestinationFiles="$(SdkOutputDirectory)/csc.deps.json" />

      <Copy SourceFiles="$(SdkOutputDirectory)/compilers.runtimeconfig.json"
            DestinationFiles="$(SdkOutputDirectory)/csc.runtimeconfig.json" />

      <ChangeEntryPointLibraryName 
            DepsFile="$(SdkOutputDirectory)/csc.deps.json"
            NewName="csc.deps.json" />

      <RemoveAssetFromDepsPackages DepsFile="$(SdkOutputDirectory)/csc.deps.json"
                                   SectionName="runtimeTargets"
                                   AssetPath="$(BinaryToCorehostifyRelDir)/%(BinariesToRemove.Identity).exe" />
      <RemoveAssetFromDepsPackages DepsFile="$(SdkOutputDirectory)/dotnet.deps.json"
                                   SectionName="runtimeTargets"
                                   AssetPath="$(BinaryToCorehostifyRelDir)/%(BinariesToRemove.Identity).exe" />

      <!-- cleanup compilers project output we don't need -->
      <CleanPublishOutput Path="$(SdkOutputDirectory)"
                          Name="compilers"
                          DeleteRuntimeConfigJson="true"
                          DeleteDepsJson="true" />

      <!-- Copy Host to SDK Directory -->
      <Copy SourceFiles="$(SharedFrameworkNameVersionPath)/$(DotnetHostBaseName)"
            DestinationFiles="$(SdkOutputDirectory)/corehost$(ExeExtension)" />

      <Copy SourceFiles="$(SharedFrameworkNameVersionPath)/$(DotnetHostFxrBaseName)"
            DestinationFiles="$(SdkOutputDirectory)/$(DotnetHostFxrBaseName)" />

      <Copy SourceFiles="$(SharedFrameworkNameVersionPath)/$(HostPolicyBaseName)"
            DestinationFiles="$(SdkOutputDirectory)/$(HostPolicyBaseName)" />

      <CrossgenDirectory CoreCLRVersion="$(CoreCLRVersion)"
                         JitVersion="$(JitVersion)"
                         SharedFrameworkNameVersionPath="$(SharedFrameworkNameVersionPath)"
                         SdkOutputDirectory="$(SdkOutputDirectory)" />

      <!-- Generate .version file -->
      <WriteLinesToFile File="$(SdkOutputDirectory)/.version"
                        Lines="$(CommitHash);$(SdkVersion)"
                        Overwrite="true" />

      <ItemGroup>
        <MSBuildTargetsToCopy Include="$(MSBuildTargetsDirectory)/**/*.targets" />
        <MSBuildTargetsToCopy Include="$(MSBuildTargetsDirectory)/**/*.Targets" />
        <MSBuildTargetsToCopy Include="$(MSBuildTargetsDirectory)/**/*.props" />
        <MSBuildTargetsToCopy Include="$(MSBuildTargetsDirectory)/**/*.overridetasks" />
        <MSBuildTargetsToCopy Include="$(MSBuildTargetsDirectory)/**/*.tasks" />
      </ItemGroup>

      <Copy SourceFiles="@(MSBuildTargetsToCopy)"
            DestinationFiles="@(MSBuildTargetsToCopy->'$(SdkOutputDirectory)\%(Filename)%(Extension)')" />

      <ItemGroup>
        <FilesToClean Include="$(StageDirectory)/sdk/**/vbc.exe" />
      </ItemGroup>

      <Delete Files="@(FilesToClean)" />

      <ItemGroup>
        <FilesToCopy Include="$(StageDirectory)/**/*" />
        <PdbsToClean Include="$(StageDirectory)/sdk/**/*.pdb" />
      </ItemGroup>

      <Copy SourceFiles="@(FilesToCopy)"
          DestinationFiles="@(FilesToCopy->'$(StageSymbolsDirectory)\%(RecursiveDir)%(Filename)%(Extension)')" />

      <Delete Files="@(PdbsToClean)" />
  </Target>
</Project>