230 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.Collections.Immutable;
 | |
| using DependencyListGenerator;
 | |
| using Nuke.Common;
 | |
| using Nuke.Common.IO;
 | |
| using Nuke.Common.ProjectModel;
 | |
| using Nuke.Common.Tooling;
 | |
| using Nuke.Common.Tools.Docker;
 | |
| using Nuke.Common.Tools.DotNet;
 | |
| using Nuke.Common.Tools.MSBuild;
 | |
| using Serilog;
 | |
| using static Nuke.Common.EnvironmentInfo;
 | |
| using static Nuke.Common.IO.FileSystemTasks;
 | |
| using static Nuke.Common.Tools.Docker.DockerTasks;
 | |
| using static Nuke.Common.Tools.DotNet.DotNetTasks;
 | |
| using static Nuke.Common.Tools.MSBuild.MSBuildTasks;
 | |
| 
 | |
| partial class Build
 | |
| {
 | |
|     Target CompileNativeSrcWindows => _ => _
 | |
|         .Unlisted()
 | |
|         .After(CompileManagedSrc)
 | |
|         .After(GenerateNetFxAssemblyRedirectionSource)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             // If we're building for x64, build for x86 too
 | |
|             var platforms =
 | |
|             Equals(Platform, MSBuildTargetPlatform.x64)
 | |
|                 ? new[] { MSBuildTargetPlatform.x64, MSBuildTargetPlatform.x86 }
 | |
|                 : new[] { MSBuildTargetPlatform.x86 };
 | |
| 
 | |
|             foreach (var project in Solution.GetNativeSrcProjects())
 | |
|             {
 | |
|                 // Can't use dotnet msbuild, as needs to use the VS version of MSBuild
 | |
|                 MSBuild(s => s
 | |
|                     .SetTargetPath(project)
 | |
|                     .SetConfiguration(BuildConfiguration)
 | |
|                     .DisableRestore()
 | |
|                     .SetMaxCpuCount(null)
 | |
|                     .CombineWith(platforms, (m, platform) => m
 | |
|                         .SetTargetPlatform(platform)));
 | |
|             }
 | |
|         });
 | |
| 
 | |
|     Target CompileNativeTestsWindows => _ => _
 | |
|         .Unlisted()
 | |
|         .After(CompileNativeSrc)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             // If we're building for x64, build for x86 too
 | |
|             var platforms =
 | |
|             Equals(Platform, MSBuildTargetPlatform.x64)
 | |
|                 ? new[] { MSBuildTargetPlatform.x64, MSBuildTargetPlatform.x86 }
 | |
|                 : new[] { MSBuildTargetPlatform.x86 };
 | |
| 
 | |
|             // Can't use dotnet msbuild, as needs to use the VS version of MSBuild
 | |
|             MSBuild(s => s
 | |
|                 .SetTargetPath(Solution.GetNativeTestProject())
 | |
|                 .SetConfiguration(BuildConfiguration)
 | |
|                 .DisableRestore()
 | |
|                 .SetMaxCpuCount(null)
 | |
|                 .CombineWith(platforms, (m, platform) => m
 | |
|                     .SetTargetPlatform(platform)));
 | |
|         });
 | |
| 
 | |
|     Target PublishNativeProfilerWindows => _ => _
 | |
|         .Unlisted()
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .After(CompileNativeSrc, PublishManagedProfiler)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             foreach (var architecture in ArchitecturesForPlatform)
 | |
|             {
 | |
|                 var source = NativeProfilerProject.Directory / "bin" / BuildConfiguration / architecture.ToString() /
 | |
|                              $"{NativeProfilerProject.Name}.dll";
 | |
|                 var dest = TracerHomeDirectory / $"win-{architecture}";
 | |
| 
 | |
|                 Log.Information($"Copying '{source}' to '{dest}'");
 | |
| 
 | |
|                 CopyFileToDirectory(source, dest, FileExistsPolicy.Overwrite);
 | |
|             }
 | |
|         });
 | |
| 
 | |
|     Target RunNativeTestsWindows => _ => _
 | |
|         .Unlisted()
 | |
|         .After(CompileNativeSrcWindows)
 | |
|         .After(CompileNativeTestsWindows)
 | |
|         .After(PublishManagedProfiler)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             var project = Solution.GetProjectByName(Projects.Tests.AutoInstrumentationNativeTests);
 | |
|             var workingDirectory = project.Directory / "bin" / BuildConfiguration.ToString() / Platform.ToString();
 | |
|             var exePath = workingDirectory / $"{project.Name}.exe";
 | |
|             var testExe = ToolResolver.GetTool(exePath);
 | |
| 
 | |
|             testExe($"--gtest_output=xml", workingDirectory: workingDirectory);
 | |
|         });
 | |
| 
 | |
|     Target PublishIisTestApplications => _ => _
 | |
|         .Unlisted()
 | |
|         .After(CompileManagedTests)
 | |
|         .OnlyWhenStatic(() => IsWin && Containers == ContainersWindows)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             var aspNetProject = Solution.GetProjectByName(Projects.Tests.Applications.AspNet);
 | |
| 
 | |
|             var localCopyTracerHome = aspNetProject.Directory / "bin" / "tracer-home";
 | |
|             CopyDirectoryRecursively(TracerHomeDirectory, localCopyTracerHome);
 | |
| 
 | |
|             BuildDockerImage(aspNetProject);
 | |
| 
 | |
|             Directory.Delete(localCopyTracerHome, true);
 | |
| 
 | |
|             var wcfProject = Solution.GetProjectByName(Projects.Tests.Applications.Wcf);
 | |
|             BuildDockerImage(wcfProject);
 | |
|         });
 | |
| 
 | |
|     void BuildDockerImage(Project project)
 | |
|     {
 | |
|         MSBuild(x => x
 | |
|             .SetConfiguration(BuildConfiguration)
 | |
|             .SetTargetPlatform(Platform)
 | |
|             .SetProperty("DeployOnBuild", true)
 | |
|             .SetMaxCpuCount(null)
 | |
|             .SetProperty("PublishProfile",
 | |
|                 project.Directory / "Properties" / "PublishProfiles" / $"FolderProfile.{BuildConfiguration}.pubxml")
 | |
|             .SetTargetPath(project));
 | |
| 
 | |
|         DockerBuild(x => x
 | |
|             .SetPath(".")
 | |
|             .SetBuildArg($"configuration={BuildConfiguration}", $"windowscontainer_version={WindowsContainerVersion}")
 | |
|             .EnableRm()
 | |
|             .SetTag(Path.GetFileNameWithoutExtension(project).Replace(".", "-").ToLowerInvariant())
 | |
|             .SetProcessWorkingDirectory(project.Directory)
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     Target GenerateNetFxTransientDependencies => _ => _
 | |
|         .Unlisted()
 | |
|         .After(Restore)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             var project = Solution.GetProjectByName(Projects.AutoInstrumentation).GetMSBuildProject();
 | |
|             var packages = Solution.Directory / "src" / "Directory.Packages.props";
 | |
|             var commonExcludedAssets = Solution.Directory / "src" / "CommonExcludedAssets.props";
 | |
| 
 | |
|             const string label = $"Transient dependencies auto-generated by {nameof(GenerateNetFxTransientDependencies)}";
 | |
| 
 | |
|             var packagesGroup = project.Xml.ItemGroups.FirstOrDefault(x => x.Label == label);
 | |
|             if (packagesGroup == null)
 | |
|             {
 | |
|                 packagesGroup = project.Xml.AddItemGroup();
 | |
|                 packagesGroup.Label = label;
 | |
|                 packagesGroup.Condition = " '$(TargetFramework)' == 'net462' ";
 | |
|             }
 | |
| 
 | |
|             var packagesProject = ProjectModelTasks.ParseProject(packages);
 | |
|             var versionGroup = packagesProject.Xml.ItemGroups.FirstOrDefault(x => x.Label == label);
 | |
|             if (versionGroup == null)
 | |
|             {
 | |
|                 versionGroup = packagesProject.Xml.AddItemGroup();
 | |
|                 versionGroup.Label = label;
 | |
|             }
 | |
| 
 | |
|             var commonExcludedAssetsProject = ProjectModelTasks.ParseProject(commonExcludedAssets);
 | |
|             var excludedProjectsGroup = commonExcludedAssetsProject.Xml.ItemGroups.First(x => x.Condition == string.Empty);
 | |
| 
 | |
|             var excludedDependencies = excludedProjectsGroup.Items.Select(x => x.Include).ToImmutableList();
 | |
| 
 | |
|             var deps = Generator.EnumerateDependencies(project.FullPath, excludedDependencies);
 | |
|             foreach (var item in deps)
 | |
|             {
 | |
|                 if (!packagesGroup.Items.Any(x => x.Include == item.Name))
 | |
|                 {
 | |
|                     packagesGroup.AddItem("PackageReference", item.Name);
 | |
|                 }
 | |
| 
 | |
|                 if (!versionGroup.Items.Any(x => x.Include == item.Name))
 | |
|                 {
 | |
|                     var reference = versionGroup.AddItem("PackageVersion", item.Name);
 | |
|                     reference.AddMetadata("Version", item.Version, expressAsAttribute: true);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             project.Save();
 | |
|             packagesProject.Save();
 | |
|         });
 | |
| 
 | |
|     Target GenerateNetFxAssemblyRedirectionSource => _ => _
 | |
|         .Unlisted()
 | |
|         .After(PublishManagedProfiler)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() =>
 | |
|         {
 | |
|             var netFxAssembliesFolder = TracerHomeDirectory / MapToFolderOutput(TargetFramework.NET462);
 | |
|             var generatedSourceFile = SourceDirectory / Projects.AutoInstrumentationNative / "netfx_assembly_redirection.h";
 | |
| 
 | |
|             AssemblyRedirectionSourceGenerator.Generate(netFxAssembliesFolder, generatedSourceFile);
 | |
|         });
 | |
| 
 | |
|     Target InstallNetFxAssembliesGAC => _ => _
 | |
|         .Unlisted()
 | |
|         .After(BuildTracer)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() => RunNetFxGacOperation("-i"));
 | |
| 
 | |
|     /// <remarks>
 | |
|     /// Warning: This target could cause potential harm to your system by removing a required library from GAC.
 | |
|     /// </remarks>
 | |
|     Target UninstallNetFxAssembliesGAC => _ => _
 | |
|         .Description("Removes .NET Framework output libraries from the GAC.")
 | |
|         .After(BuildTracer)
 | |
|         .OnlyWhenStatic(() => IsWin)
 | |
|         .Executes(() => RunNetFxGacOperation("-u"));
 | |
| 
 | |
|     private void RunNetFxGacOperation(string operation)
 | |
|     {
 | |
|         var netFxAssembliesFolder = TracerHomeDirectory / MapToFolderOutput(TargetFramework.NET462);
 | |
|         var installTool = Solution.GetProjectByName(Projects.Tools.GacInstallTool);
 | |
| 
 | |
|         DotNetRun(s => s
 | |
|             .SetProjectFile(installTool)
 | |
|             .SetConfiguration(BuildConfiguration)
 | |
|             .SetApplicationArguments($"{operation} {netFxAssembliesFolder}"));
 | |
|     }
 | |
| }
 |