From b2ecc4bdd6662622df8995e3c34d328c2d9bea81 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 25 Jul 2023 22:43:16 -0400 Subject: [PATCH 1/2] Support `--cli` argument for `CsProjClassicNetToolchain` --- .../ConsoleArguments/ConfigParser.cs | 2 +- .../Diagnosers/PerfCollectProfiler.cs | 1 + .../CsProj/CsProjClassicNetToolchain.cs | 15 ++++++----- .../ConfigParserTests.cs | 26 +++++++++++++------ 4 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs b/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs index c2ad926c3f..76500bed44 100644 --- a/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs +++ b/src/BenchmarkDotNet/ConsoleArguments/ConfigParser.cs @@ -518,7 +518,7 @@ private static Job CreateJobForGivenRuntime(Job baseJob, string runtimeId, Comma case RuntimeMoniker.Net481: return baseJob .WithRuntime(runtimeMoniker.GetRuntime()) - .WithToolchain(CsProjClassicNetToolchain.From(runtimeId, options.RestorePath?.FullName)); + .WithToolchain(CsProjClassicNetToolchain.From(runtimeId, options.RestorePath?.FullName, options.CliPath?.FullName)); case RuntimeMoniker.NetCoreApp20: case RuntimeMoniker.NetCoreApp21: diff --git a/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs b/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs index c31896dcaf..d2a7877383 100644 --- a/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs +++ b/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs @@ -196,6 +196,7 @@ private void EnsureSymbolsForNativeRuntime(DiagnoserActionParameters parameters) { string cliPath = parameters.BenchmarkCase.GetToolchain() switch { + CsProjClassicNetToolchain classic => classic.CustomDotNetCliPath, CsProjCoreToolchain core => core.CustomDotNetCliPath, CoreRunToolchain coreRun => coreRun.CustomDotNetCliPath.FullName, NativeAotToolchain nativeAot => nativeAot.CustomDotNetCliPath, diff --git a/src/BenchmarkDotNet/Toolchains/CsProj/CsProjClassicNetToolchain.cs b/src/BenchmarkDotNet/Toolchains/CsProj/CsProjClassicNetToolchain.cs index be6fae3f4b..4e1fe4a641 100644 --- a/src/BenchmarkDotNet/Toolchains/CsProj/CsProjClassicNetToolchain.cs +++ b/src/BenchmarkDotNet/Toolchains/CsProj/CsProjClassicNetToolchain.cs @@ -23,16 +23,19 @@ public class CsProjClassicNetToolchain : Toolchain [PublicAPI] public static readonly IToolchain Net48 = new CsProjClassicNetToolchain("net48", ".NET Framework 4.8"); [PublicAPI] public static readonly IToolchain Net481 = new CsProjClassicNetToolchain("net481", ".NET Framework 4.8.1"); - private CsProjClassicNetToolchain(string targetFrameworkMoniker, string name, string packagesPath = null) + internal string CustomDotNetCliPath { get; } + + private CsProjClassicNetToolchain(string targetFrameworkMoniker, string name, string packagesPath = null, string customDotNetCliPath = null) : base(name, - new CsProjGenerator(targetFrameworkMoniker, cliPath: null, packagesPath: packagesPath, runtimeFrameworkVersion: null, isNetCore: false), - new DotNetCliBuilder(targetFrameworkMoniker, customDotNetCliPath: null), + new CsProjGenerator(targetFrameworkMoniker, customDotNetCliPath, packagesPath, runtimeFrameworkVersion: null, isNetCore: false), + new DotNetCliBuilder(targetFrameworkMoniker, customDotNetCliPath), new Executor()) { + CustomDotNetCliPath = customDotNetCliPath; } - public static IToolchain From(string targetFrameworkMoniker, string packagesPath = null) - => new CsProjClassicNetToolchain(targetFrameworkMoniker, targetFrameworkMoniker, packagesPath); + public static IToolchain From(string targetFrameworkMoniker, string packagesPath = null, string customDotNetCliPath = null) + => new CsProjClassicNetToolchain(targetFrameworkMoniker, targetFrameworkMoniker, packagesPath, customDotNetCliPath); public override IEnumerable Validate(BenchmarkCase benchmarkCase, IResolver resolver) { @@ -47,7 +50,7 @@ public override IEnumerable Validate(BenchmarkCase benchmarkCas $"Classic .NET toolchain is supported only for Windows, benchmark '{benchmarkCase.DisplayInfo}' will not be executed", benchmarkCase); } - else if (IsCliPathInvalid(customDotNetCliPath: null, benchmarkCase, out var invalidCliError)) + else if (IsCliPathInvalid(CustomDotNetCliPath, benchmarkCase, out var invalidCliError)) { yield return invalidCliError; } diff --git a/tests/BenchmarkDotNet.Tests/ConfigParserTests.cs b/tests/BenchmarkDotNet.Tests/ConfigParserTests.cs index ad6988ae36..538bad8a91 100644 --- a/tests/BenchmarkDotNet.Tests/ConfigParserTests.cs +++ b/tests/BenchmarkDotNet.Tests/ConfigParserTests.cs @@ -270,20 +270,30 @@ public void IlCompilerPathParsedCorrectly() } [Theory] - [InlineData("netcoreapp2.0")] - [InlineData("netcoreapp2.1")] - [InlineData("netcoreapp2.2")] - [InlineData("netcoreapp3.0")] - public void DotNetCliParsedCorrectly(string tfm) + [InlineData("netcoreapp2.0", true)] + [InlineData("netcoreapp2.1", true)] + [InlineData("netcoreapp2.2", true)] + [InlineData("netcoreapp3.0", true)] + [InlineData("net462", false)] + [InlineData("net48", false)] + public void DotNetCliParsedCorrectly(string tfm, bool isCore) { var fakeDotnetCliPath = typeof(object).Assembly.Location; var config = ConfigParser.Parse(new[] { "-r", tfm, "--cli", fakeDotnetCliPath }, new OutputLogger(Output)).config; Assert.Single(config.GetJobs()); - CsProjCoreToolchain toolchain = config.GetJobs().Single().GetToolchain() as CsProjCoreToolchain; - Assert.NotNull(toolchain); + var toolchain = config.GetJobs().Single().GetToolchain(); + if (isCore) + { + Assert.True(toolchain is CsProjCoreToolchain); + Assert.Equal(fakeDotnetCliPath, ((CsProjCoreToolchain) toolchain).CustomDotNetCliPath); + } + else + { + Assert.True(toolchain is CsProjClassicNetToolchain); + Assert.Equal(fakeDotnetCliPath, ((CsProjClassicNetToolchain) toolchain).CustomDotNetCliPath); + } Assert.Equal(tfm, ((DotNetCliGenerator)toolchain.Generator).TargetFrameworkMoniker); - Assert.Equal(fakeDotnetCliPath, toolchain.CustomDotNetCliPath); } [Theory] From 7ac2b6801c7fd0d35a6826bb5c51c5498a46c9b2 Mon Sep 17 00:00:00 2001 From: Tim Cassell <35501420+timcassell@users.noreply.github.com> Date: Wed, 26 Jul 2023 10:18:42 -0400 Subject: [PATCH 2/2] Update src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs Co-authored-by: Adam Sitnik --- src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs b/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs index d2a7877383..c31896dcaf 100644 --- a/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs +++ b/src/BenchmarkDotNet/Diagnosers/PerfCollectProfiler.cs @@ -196,7 +196,6 @@ private void EnsureSymbolsForNativeRuntime(DiagnoserActionParameters parameters) { string cliPath = parameters.BenchmarkCase.GetToolchain() switch { - CsProjClassicNetToolchain classic => classic.CustomDotNetCliPath, CsProjCoreToolchain core => core.CustomDotNetCliPath, CoreRunToolchain coreRun => coreRun.CustomDotNetCliPath.FullName, NativeAotToolchain nativeAot => nativeAot.CustomDotNetCliPath,