From dac29eed592e74a744ad58f8ee24d2d21fa3a436 Mon Sep 17 00:00:00 2001 From: Sven Boemer Date: Wed, 26 Oct 2022 12:54:53 -0700 Subject: [PATCH] Use implicit package reference for ILC build package (#28690) This removes the bundled ILCompiler bits from the SDK, and instead uses implicit PackageReference to import targets that correctly match the ILCompiler package version. Also adds validation that the explict PackageReference scenario uses the expected ILCompiler host and target bits. It doesn't include 8.0 tests. --- eng/Version.Details.xml | 5 -- eng/Versions.props | 1 - src/Layout/redist/targets/BundledSdks.targets | 1 - .../ProcessFrameworkReferences.cs | 12 +++-- ...T.Sdk.FrameworkReferenceResolution.targets | 11 ++++- .../targets/Microsoft.NET.Sdk.props | 1 - .../targets/Microsoft.NET.Sdk.targets | 5 -- .../GivenThatWeWantToPublishAnAotApp.cs | 48 +++++++++++++++---- 8 files changed, 55 insertions(+), 29 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index df8f5882a94b..54fe8e6c1756 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -114,11 +114,6 @@ 4db6ac94ffa8bf6dae8ad9c5c68f94b58de917fd - - https://github.com/dotnet/runtime - 5108757b997c59ab8ba1fc5309ab0d4e730e2b77 - - https://github.com/dotnet/linker 4db6ac94ffa8bf6dae8ad9c5c68f94b58de917fd diff --git a/eng/Versions.props b/eng/Versions.props index 45c10e80b031..3a4406ea71fe 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -93,7 +93,6 @@ 8.0.0-alpha.1.22524.5 8.0.0-alpha.1.22524.5 8.0.0-alpha.1.22524.5 - 8.0.0-alpha.1.22524.5 diff --git a/src/Layout/redist/targets/BundledSdks.targets b/src/Layout/redist/targets/BundledSdks.targets index 6f8b0fc3b333..5b1fd3a195a0 100644 --- a/src/Layout/redist/targets/BundledSdks.targets +++ b/src/Layout/redist/targets/BundledSdks.targets @@ -5,6 +5,5 @@ - diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs index 9447c16cbd02..27bd7241c4de 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ProcessFrameworkReferences.cs @@ -104,6 +104,9 @@ public class ProcessFrameworkReferences : TaskBase [Output] public ITaskItem[] TargetILCompilerPacks { get; set; } + [Output] + public ITaskItem[] ImplicitPackageReferences { get; set; } + // Runtime packs which aren't available for the specified RuntimeIdentifier [Output] public ITaskItem[] UnavailableRuntimePacks { get; set; } @@ -621,6 +624,9 @@ private bool AddAotOrR2RRuntimePackage(AotPackageType packageType, Version norma else { HostILCompilerPacks = new[] { newItem }; + var ilCompilerBuildPackageReference = new TaskItem(knownPack.ItemSpec); + ilCompilerBuildPackageReference.SetMetadata(MetadataKeys.Version, packVersion); + ImplicitPackageReferences = new[] { ilCompilerBuildPackageReference }; // ILCompiler supports cross target compilation. If there is a cross-target request, we need to download that package as well // We expect RuntimeIdentifier to be defined during publish but can allow during build if (RuntimeIdentifier != null) @@ -633,17 +639,13 @@ private bool AddAotOrR2RRuntimePackage(AotPackageType packageType, Version norma if (!hostRuntimeIdentifier.Equals(targetRuntimeIdentifier)) { var runtimeIlcPackName = packPattern.Replace("**RID**", targetRuntimeIdentifier); - TaskItem targetIlcPackToDownload = new TaskItem(runtimeIlcPackName); - targetIlcPackToDownload.SetMetadata(MetadataKeys.Version, packVersion); - packagesToDownload.Add(targetIlcPackToDownload); - var newItem2 = new TaskItem(runtimeIlcPackName); newItem2.SetMetadata(MetadataKeys.NuGetPackageId, runtimeIlcPackName); newItem2.SetMetadata(MetadataKeys.NuGetPackageVersion, packVersion); TargetILCompilerPacks = new[] { newItem2 }; } } - } + } return true; } diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.FrameworkReferenceResolution.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.FrameworkReferenceResolution.targets index df564baca1a4..c66580e5e4e5 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.FrameworkReferenceResolution.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.FrameworkReferenceResolution.targets @@ -1,4 +1,4 @@ - + + <_ImplicitPackageReference Remove="@(PackageReference)" /> + + - - true - - diff --git a/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs b/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs index 78d198b4e1f2..b1095087a0f5 100644 --- a/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs +++ b/src/Tests/Microsoft.NET.Publish.Tests/GivenThatWeWantToPublishAnAotApp.cs @@ -27,6 +27,8 @@ public class GivenThatWeWantToPublishAnAotApp : SdkTest { private readonly string RuntimeIdentifier = $"/p:RuntimeIdentifier={RuntimeInformation.RuntimeIdentifier}"; + private readonly string ExplicitPackageVersion = "7.0.0-rc.2.22456.11"; + public GivenThatWeWantToPublishAnAotApp(ITestOutputHelper log) : base(log) { } @@ -272,7 +274,7 @@ public void NativeAot_hw_runs_with_PackageReference_PublishAot_is_enabled(string testProject.AdditionalProperties["PublishAot"] = "true"; // This will add a reference to a package that will also be automatically imported by the SDK - testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); // Linux symbol files are embedded and require additional steps to be stripped to a separate file // assumes /bin (or /usr/bin) are in the PATH @@ -282,7 +284,7 @@ public void NativeAot_hw_runs_with_PackageReference_PublishAot_is_enabled(string } var testAsset = _testAssetsManager.CreateTestProject(testProject); - var publishCommand = new PublishCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); + var publishCommand= new PublishCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); publishCommand .Execute($"/p:RuntimeIdentifier={rid}") .Should().Pass() @@ -307,6 +309,8 @@ public void NativeAot_hw_runs_with_PackageReference_PublishAot_is_enabled(string var command = new RunExeCommand(Log, publishedExe) .Execute().Should().Pass() .And.HaveStdOutContaining("Hello World"); + + CheckIlcVersions(Path.Combine(testAsset.TestRoot, testProject.Name), targetFramework, ExplicitPackageVersion); } } @@ -322,7 +326,7 @@ public void NativeAot_hw_runs_with_PackageReference_PublishAot_is_empty(string t var testProject = CreateHelloWorldTestProject(targetFramework, projectName, true); // This will add a reference to a package that will also be automatically imported by the SDK - testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); // Linux symbol files are embedded and require additional steps to be stripped to a separate file // assumes /bin (or /usr/bin) are in the PATH @@ -373,7 +377,6 @@ public void NativeAot_hw_runs_with_cross_target_PublishAot_is_enabled(string tar var publishedExe = Path.Combine(publishDirectory, $"{testProject.Name}{Constants.ExeSuffix}"); File.Exists(publishedDll).Should().BeFalse(); File.Exists(publishedExe).Should().BeTrue(); - } } @@ -391,8 +394,8 @@ public void NativeAot_hw_runs_with_cross_PackageReference_PublishAot_is_enabled( testProject.AdditionalProperties["PublishAot"] = "true"; // This will add a reference to a package that will also be automatically imported by the SDK - testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); - testProject.PackageReferences.Add(new TestPackageReference("runtime.win-x64.Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); + testProject.PackageReferences.Add(new TestPackageReference("runtime.win-x64.Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); var testAsset = _testAssetsManager.CreateTestProject(testProject); @@ -409,6 +412,8 @@ public void NativeAot_hw_runs_with_cross_PackageReference_PublishAot_is_enabled( var publishedExe = Path.Combine(publishDirectory, $"{testProject.Name}{Constants.ExeSuffix}"); File.Exists(publishedDll).Should().BeFalse(); File.Exists(publishedExe).Should().BeTrue(); + + CheckIlcVersions(Path.Combine(testAsset.TestRoot, testProject.Name), targetFramework, ExplicitPackageVersion); } } @@ -424,8 +429,8 @@ public void NativeAot_hw_runs_with_cross_PackageReference_PublishAot_is_empty(st var testProject = CreateHelloWorldTestProject(targetFramework, projectName, true); // This will add a reference to a package that will also be automatically imported by the SDK - testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); - testProject.PackageReferences.Add(new TestPackageReference("runtime.win-x64.Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); + testProject.PackageReferences.Add(new TestPackageReference("runtime.win-x64.Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); var testAsset = _testAssetsManager.CreateTestProject(testProject); @@ -438,7 +443,6 @@ public void NativeAot_hw_runs_with_cross_PackageReference_PublishAot_is_empty(st var publishDirectory = publishCommand.GetOutputDirectory(targetFramework: targetFramework, runtimeIdentifier: rid).FullName; var publishedDll = Path.Combine(publishDirectory, $"{projectName}.dll"); File.Exists(publishedDll).Should().BeTrue(); - } } @@ -476,7 +480,7 @@ public void NativeAot_hw_fails_with_sdk6_PackageReference_PublishAot_is_enabled( var testProject = CreateHelloWorldTestProject("net6.0", projectName, true); testProject.AdditionalProperties["PublishAot"] = "true"; - testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", "7.0.0-rc.2.22456.11")); + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DotNet.ILCompiler", ExplicitPackageVersion)); var testAsset = _testAssetsManager.CreateTestProject(testProject); @@ -700,6 +704,30 @@ public void It_publishes_with_implicit_rid_with_NativeAotApp(string targetFramew } } + private void CheckIlcVersions(string projectPath, string targetFramework, string expectedVersion) + { + // Compiler version matches expected version + var ilcToolsPathCommand = new GetValuesCommand(Log, projectPath, targetFramework, "IlcToolsPath") + { + DependsOnTargets = "WriteIlcRspFileForCompilation" + }; + ilcToolsPathCommand.Execute().Should().Pass(); + var ilcToolsPath = ilcToolsPathCommand.GetValues()[0]; + var ilcVersion = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(ilcToolsPath))); + ilcVersion.Should().Be(ExplicitPackageVersion); + + // Compilation references (corelib) match expected version + var ilcReferenceCommand = new GetValuesCommand(Log, projectPath, targetFramework, "IlcReference", GetValuesCommand.ValueType.Item) + { + DependsOnTargets = "WriteIlcRspFileForCompilation" + }; + ilcReferenceCommand.Execute().Should().Pass(); + var ilcReference = ilcReferenceCommand.GetValues(); + var corelibReference = ilcReference.Where(r => Path.GetFileName(r).Equals("System.Private.CoreLib.dll")).Single(); + var ilcReferenceVersion = Path.GetFileName(Path.GetDirectoryName(Path.GetDirectoryName(corelibReference))); + ilcReferenceVersion.Should().Be(ExplicitPackageVersion); + } + private TestProject CreateHelloWorldTestProject(string targetFramework, string projectName, bool isExecutable) { var testProject = new TestProject()