Skip to content

Commit ae6326b

Browse files
authored
Merge pull request github#5882 from hvitved/csharp/autobuilder/shared-compilation
2 parents d46452e + b142ecb commit ae6326b

File tree

2 files changed

+21
-85
lines changed

2 files changed

+21
-85
lines changed

csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ public void TestDefaultCSharpAutoBuilder()
415415
actions.RunProcess["cmd.exe /C dotnet --info"] = 0;
416416
actions.RunProcess[@"cmd.exe /C dotnet clean C:\Project\test.csproj"] = 0;
417417
actions.RunProcess[@"cmd.exe /C dotnet restore C:\Project\test.csproj"] = 0;
418-
actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto dotnet build --no-incremental C:\Project\test.csproj"] = 0;
418+
actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project\test.csproj"] = 0;
419419
actions.FileExists["csharp.log"] = true;
420420
actions.FileExists[@"C:\Project\test.csproj"] = true;
421421
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = "";
@@ -439,9 +439,6 @@ public void TestDefaultCSharpAutoBuilder()
439439
[Fact]
440440
public void TestLinuxCSharpAutoBuilder()
441441
{
442-
actions.RunProcess["dotnet --list-runtimes"] = 0;
443-
actions.RunProcessOut["dotnet --list-runtimes"] = @"Microsoft.AspNetCore.App 2.2.5 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
444-
Microsoft.NETCore.App 2.2.5 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]";
445442
actions.RunProcess["dotnet --info"] = 0;
446443
actions.RunProcess[@"dotnet clean C:\Project/test.csproj"] = 0;
447444
actions.RunProcess[@"dotnet restore C:\Project/test.csproj"] = 0;
@@ -463,7 +460,7 @@ public void TestLinuxCSharpAutoBuilder()
463460
actions.LoadXml[@"C:\Project/test.csproj"] = xml;
464461

465462
var autobuilder = CreateAutoBuilder(false);
466-
TestAutobuilderScript(autobuilder, 0, 5);
463+
TestAutobuilderScript(autobuilder, 0, 4);
467464
}
468465

469466
[Fact]
@@ -603,8 +600,6 @@ private void TestAutobuilderScript(Autobuilder autobuilder, int expectedOutput,
603600
[Fact]
604601
public void TestLinuxBuildCommand()
605602
{
606-
actions.RunProcess["dotnet --list-runtimes"] = 1;
607-
actions.RunProcessOut["dotnet --list-runtimes"] = "";
608603
actions.RunProcess[@"C:\odasa/tools/odasa index --auto ""./build.sh --skip-tests"""] = 0;
609604
actions.FileExists["csharp.log"] = true;
610605
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = "";
@@ -615,7 +610,7 @@ public void TestLinuxBuildCommand()
615610
SkipVsWhere();
616611

617612
var autobuilder = CreateAutoBuilder(false, buildCommand: "./build.sh --skip-tests");
618-
TestAutobuilderScript(autobuilder, 0, 2);
613+
TestAutobuilderScript(autobuilder, 0, 1);
619614
}
620615

621616
[Fact]
@@ -626,14 +621,12 @@ public void TestLinuxBuildSh()
626621
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = "";
627622
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = "";
628623
actions.RunProcess[@"/bin/chmod u+x C:\Project/build/build.sh"] = 0;
629-
actions.RunProcess["dotnet --list-runtimes"] = 1;
630-
actions.RunProcessOut["dotnet --list-runtimes"] = "";
631624
actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/build/build.sh"] = 0;
632625
actions.RunProcessWorkingDirectory[@"C:\odasa/tools/odasa index --auto C:\Project/build/build.sh"] = @"C:\Project/build";
633626
actions.FileExists["csharp.log"] = true;
634627

635628
var autobuilder = CreateAutoBuilder(false);
636-
TestAutobuilderScript(autobuilder, 0, 3);
629+
TestAutobuilderScript(autobuilder, 0, 2);
637630
}
638631

639632
[Fact]
@@ -645,14 +638,12 @@ public void TestLinuxBuildShCSharpLogMissing()
645638
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = "";
646639

647640
actions.RunProcess[@"/bin/chmod u+x C:\Project/build.sh"] = 0;
648-
actions.RunProcess["dotnet --list-runtimes"] = 1;
649-
actions.RunProcessOut["dotnet --list-runtimes"] = "";
650641
actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = 0;
651642
actions.RunProcessWorkingDirectory[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = @"C:\Project";
652643
actions.FileExists["csharp.log"] = false;
653644

654645
var autobuilder = CreateAutoBuilder(false);
655-
TestAutobuilderScript(autobuilder, 1, 3);
646+
TestAutobuilderScript(autobuilder, 1, 2);
656647
}
657648

658649
[Fact]
@@ -664,14 +655,12 @@ public void TestLinuxBuildShFailed()
664655
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR"] = "";
665656

666657
actions.RunProcess[@"/bin/chmod u+x C:\Project/build.sh"] = 0;
667-
actions.RunProcess["dotnet --list-runtimes"] = 1;
668-
actions.RunProcessOut["dotnet --list-runtimes"] = "";
669658
actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = 5;
670659
actions.RunProcessWorkingDirectory[@"C:\odasa/tools/odasa index --auto C:\Project/build.sh"] = @"C:\Project";
671660
actions.FileExists["csharp.log"] = true;
672661

673662
var autobuilder = CreateAutoBuilder(false);
674-
TestAutobuilderScript(autobuilder, 1, 3);
663+
TestAutobuilderScript(autobuilder, 1, 2);
675664
}
676665

677666
[Fact]
@@ -872,9 +861,6 @@ public void TestSkipNugetBuildless()
872861
[Fact]
873862
public void TestSkipNugetDotnet()
874863
{
875-
actions.RunProcess["dotnet --list-runtimes"] = 0;
876-
actions.RunProcessOut["dotnet --list-runtimes"] = @"Microsoft.AspNetCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
877-
Microsoft.NETCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]";
878864
actions.RunProcess["dotnet --info"] = 0;
879865
actions.RunProcess[@"dotnet clean C:\Project/test.csproj"] = 0;
880866
actions.RunProcess[@"dotnet restore C:\Project/test.csproj"] = 0;
@@ -896,7 +882,7 @@ public void TestSkipNugetDotnet()
896882
actions.LoadXml[@"C:\Project/test.csproj"] = xml;
897883

898884
var autobuilder = CreateAutoBuilder(false, dotnetArguments: "--no-restore"); // nugetRestore=false does not work for now.
899-
TestAutobuilderScript(autobuilder, 0, 5);
885+
TestAutobuilderScript(autobuilder, 0, 4);
900886
}
901887

902888
[Fact]
@@ -907,13 +893,10 @@ public void TestDotnetVersionNotInstalled()
907893
actions.RunProcess[@"chmod u+x dotnet-install.sh"] = 0;
908894
actions.RunProcess[@"./dotnet-install.sh --channel release --version 2.1.3 --install-dir C:\Project/.dotnet"] = 0;
909895
actions.RunProcess[@"rm dotnet-install.sh"] = 0;
910-
actions.RunProcess[@"C:\Project/.dotnet/dotnet --list-runtimes"] = 0;
911-
actions.RunProcessOut[@"C:\Project/.dotnet/dotnet --list-runtimes"] = @"Microsoft.AspNetCore.App 3.0.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
912-
Microsoft.NETCore.App 3.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]";
913896
actions.RunProcess[@"C:\Project/.dotnet/dotnet --info"] = 0;
914897
actions.RunProcess[@"C:\Project/.dotnet/dotnet clean C:\Project/test.csproj"] = 0;
915898
actions.RunProcess[@"C:\Project/.dotnet/dotnet restore C:\Project/test.csproj"] = 0;
916-
actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/.dotnet/dotnet build --no-incremental C:\Project/test.csproj"] = 0;
899+
actions.RunProcess[@"C:\odasa/tools/odasa index --auto C:\Project/.dotnet/dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project/test.csproj"] = 0;
917900
actions.FileExists["csharp.log"] = true;
918901
actions.FileExists["test.csproj"] = true;
919902
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = "";
@@ -933,7 +916,7 @@ public void TestDotnetVersionNotInstalled()
933916
actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "dotnet-install.sh"));
934917

935918
var autobuilder = CreateAutoBuilder(false, dotnetVersion: "2.1.3");
936-
TestAutobuilderScript(autobuilder, 0, 9);
919+
TestAutobuilderScript(autobuilder, 0, 8);
937920
}
938921

939922
[Fact]
@@ -945,11 +928,6 @@ public void TestDotnetVersionAlreadyInstalled()
945928
actions.RunProcess[@"chmod u+x dotnet-install.sh"] = 0;
946929
actions.RunProcess[@"./dotnet-install.sh --channel release --version 2.1.3 --install-dir C:\Project/.dotnet"] = 0;
947930
actions.RunProcess[@"rm dotnet-install.sh"] = 0;
948-
actions.RunProcess[@"C:\Project/.dotnet/dotnet --list-runtimes"] = 0;
949-
actions.RunProcessOut[@"C:\Project/.dotnet/dotnet --list-runtimes"] = @"Microsoft.AspNetCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
950-
Microsoft.AspNetCore.App 2.1.4 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
951-
Microsoft.NETCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
952-
Microsoft.NETCore.App 2.1.4 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]";
953931
actions.RunProcess[@"C:\Project/.dotnet/dotnet --info"] = 0;
954932
actions.RunProcess[@"C:\Project/.dotnet/dotnet clean C:\Project/test.csproj"] = 0;
955933
actions.RunProcess[@"C:\Project/.dotnet/dotnet restore C:\Project/test.csproj"] = 0;
@@ -973,7 +951,7 @@ Microsoft.NETCore.App 2.1.3 [/usr/local/share/dotnet/shared/Microsoft.NETCore.Ap
973951
actions.DownloadFiles.Add(("https://dot.net/v1/dotnet-install.sh", "dotnet-install.sh"));
974952

975953
var autobuilder = CreateAutoBuilder(false, dotnetVersion: "2.1.3");
976-
TestAutobuilderScript(autobuilder, 0, 9);
954+
TestAutobuilderScript(autobuilder, 0, 8);
977955
}
978956

979957
private void TestDotnetVersionWindows(Action action, int commandsRun)
@@ -984,7 +962,7 @@ private void TestDotnetVersionWindows(Action action, int commandsRun)
984962
actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet --info"] = 0;
985963
actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet clean C:\Project\test.csproj"] = 0;
986964
actions.RunProcess[@"cmd.exe /C C:\Project\.dotnet\dotnet restore C:\Project\test.csproj"] = 0;
987-
actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\.dotnet\dotnet build --no-incremental C:\Project\test.csproj"] = 0;
965+
actions.RunProcess[@"cmd.exe /C C:\odasa\tools\odasa index --auto C:\Project\.dotnet\dotnet build --no-incremental /p:UseSharedCompilation=false C:\Project\test.csproj"] = 0;
988966
actions.FileExists["csharp.log"] = true;
989967
actions.FileExists[@"C:\Project\test.csproj"] = true;
990968
actions.GetEnvironmentVariable["CODEQL_EXTRACTOR_CSHARP_TRAP_DIR"] = "";

csharp/autobuilder/Semmle.Autobuild.CSharp/DotNetRule.cs

Lines changed: 10 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
3636
builder.Log(Severity.Info, "Attempting to build using .NET Core");
3737
}
3838

39-
return WithDotNet(builder, (dotNetPath, environment, compatibleClr) =>
39+
return WithDotNet(builder, (dotNetPath, environment) =>
4040
{
4141
var ret = GetInfoCommand(builder.Actions, dotNetPath, environment);
4242
foreach (var projectOrSolution in builder.ProjectsOrSolutionsToBuild)
@@ -49,15 +49,15 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
4949
restoreCommand.QuoteArgument(projectOrSolution.FullPath);
5050
var restore = restoreCommand.Script;
5151

52-
var build = GetBuildScript(builder, dotNetPath, environment, compatibleClr, projectOrSolution.FullPath);
52+
var build = GetBuildScript(builder, dotNetPath, environment, projectOrSolution.FullPath);
5353

5454
ret &= BuildScript.Try(clean) & BuildScript.Try(restore) & build;
5555
}
5656
return ret;
5757
});
5858
}
5959

60-
private static BuildScript WithDotNet(Autobuilder builder, Func<string?, IDictionary<string, string>?, bool, BuildScript> f)
60+
private static BuildScript WithDotNet(Autobuilder builder, Func<string?, IDictionary<string, string>?, BuildScript> f)
6161
{
6262
var installDir = builder.Actions.PathCombine(builder.Options.RootDirectory, ".dotnet");
6363
var installScript = DownloadDotNet(builder, installDir);
@@ -81,35 +81,10 @@ private static BuildScript WithDotNet(Autobuilder builder, Func<string?, IDictio
8181
env = null;
8282
}
8383

84-
// The CLR tracer is always compatible on Windows
85-
if (builder.Actions.IsWindows())
86-
return f(installDir, env, true);
87-
88-
// The CLR tracer is only compatible on .NET Core >= 3 on Linux and macOS (see
89-
// https://github.com/dotnet/coreclr/issues/19622)
90-
return BuildScript.Bind(GetInstalledRuntimesScript(builder.Actions, installDir, env), (runtimes, runtimesRet) =>
91-
{
92-
var compatibleClr = false;
93-
if (runtimesRet == 0)
94-
{
95-
var minimumVersion = new Version(3, 0);
96-
var regex = new Regex(@"Microsoft\.NETCore\.App (\d\.\d\.\d)");
97-
compatibleClr = runtimes
98-
.Select(runtime => regex.Match(runtime))
99-
.Where(m => m.Success)
100-
.Select(m => m.Groups[1].Value)
101-
.Any(m => Version.TryParse(m, out var v) && v >= minimumVersion);
102-
}
103-
104-
if (!compatibleClr)
105-
{
106-
if (env is null)
107-
env = new Dictionary<string, string>();
108-
env.Add("UseSharedCompilation", "false");
109-
}
110-
111-
return f(installDir, env, compatibleClr);
112-
});
84+
if (env is null)
85+
env = new Dictionary<string, string>();
86+
env.Add("UseSharedCompilation", "false");
87+
return f(installDir, env);
11388
});
11489
}
11590

@@ -122,7 +97,7 @@ private static BuildScript WithDotNet(Autobuilder builder, Func<string?, IDictio
12297
/// are needed).
12398
/// </summary>
12499
public static BuildScript WithDotNet(Autobuilder builder, Func<IDictionary<string, string>?, BuildScript> f)
125-
=> WithDotNet(builder, (_1, env, _2) => f(env));
100+
=> WithDotNet(builder, (_1, env) => f(env));
126101

127102
/// <summary>
128103
/// Returns a script for downloading relevant versions of the
@@ -259,34 +234,17 @@ private static CommandBuilder GetRestoreCommand(IBuildActions actions, string? d
259234
return restore;
260235
}
261236

262-
private static BuildScript GetInstalledRuntimesScript(IBuildActions actions, string? dotNetPath, IDictionary<string, string>? environment)
263-
{
264-
var listSdks = new CommandBuilder(actions, environment: environment, silent: true).
265-
RunCommand(DotNetCommand(actions, dotNetPath)).
266-
Argument("--list-runtimes");
267-
return listSdks.Script;
268-
}
269-
270237
/// <summary>
271238
/// Gets the `dotnet build` script.
272-
///
273-
/// The CLR tracer only works on .NET Core >= 3 on Linux and macOS (see
274-
/// https://github.com/dotnet/coreclr/issues/19622), so in case we are
275-
/// running on an older .NET Core, we disable shared compilation (and
276-
/// hence the need for CLR tracing), by adding a
277-
/// `/p:UseSharedCompilation=false` argument.
278239
/// </summary>
279-
private static BuildScript GetBuildScript(Autobuilder builder, string? dotNetPath, IDictionary<string, string>? environment, bool compatibleClr, string projOrSln)
240+
private static BuildScript GetBuildScript(Autobuilder builder, string? dotNetPath, IDictionary<string, string>? environment, string projOrSln)
280241
{
281242
var build = new CommandBuilder(builder.Actions, null, environment);
282243
var script = builder.MaybeIndex(build, DotNetCommand(builder.Actions, dotNetPath)).
283244
Argument("build").
284245
Argument("--no-incremental");
285246

286-
return compatibleClr ?
287-
script.Argument(builder.Options.DotNetArguments).
288-
QuoteArgument(projOrSln).
289-
Script :
247+
return
290248
script.Argument("/p:UseSharedCompilation=false").
291249
Argument(builder.Options.DotNetArguments).
292250
QuoteArgument(projOrSln).

0 commit comments

Comments
 (0)