Skip to content

Commit 8f3731f

Browse files
committed
C#: Split AutobuildOptions into C#/C++ specific classes
1 parent 1c17d85 commit 8f3731f

File tree

17 files changed

+163
-83
lines changed

17 files changed

+163
-83
lines changed

.github/workflows/csharp-qltest.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,3 +83,4 @@ jobs:
8383
dotnet test -p:RuntimeFrameworkVersion=6.0.4 "${{ github.workspace }}/csharp/extractor/Semmle.Util.Tests"
8484
dotnet test -p:RuntimeFrameworkVersion=6.0.4 "${{ github.workspace }}/csharp/extractor/Semmle.Extraction.Tests"
8585
dotnet test -p:RuntimeFrameworkVersion=6.0.4 "${{ github.workspace }}/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests"
86+
dotnet test -p:RuntimeFrameworkVersion=6.0.4 "${{ github.workspace }}/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests"

cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/BuildScripts.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,11 @@ CppAutobuilder CreateAutoBuilder(bool isWindows,
257257
Actions.GetCurrentDirectory = cwd;
258258
Actions.IsWindows = isWindows;
259259

260-
var options = new AutobuildOptions(Actions, Language.Cpp);
260+
var options = new CppAutobuildOptions(Actions);
261261
return new CppAutobuilder(Actions, options);
262262
}
263263

264-
void TestAutobuilderScript(Autobuilder autobuilder, int expectedOutput, int commandsRun)
264+
void TestAutobuilderScript(CppAutobuilder autobuilder, int expectedOutput, int commandsRun)
265265
{
266266
Assert.Equal(expectedOutput, autobuilder.GetBuildScript().Run(Actions, StartCallback, EndCallback));
267267

@@ -299,7 +299,7 @@ public void TestCppAutobuilderSuccess()
299299
{
300300
Actions.RunProcess[@"cmd.exe /C nuget restore C:\Project\test.sln -DisableParallelProcessing"] = 1;
301301
Actions.RunProcess[@"cmd.exe /C C:\Project\.nuget\nuget.exe restore C:\Project\test.sln -DisableParallelProcessing"] = 0;
302-
Actions.RunProcess[@"cmd.exe /C CALL ^""C:\Program Files ^(x86^)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat^"" && set Platform=&& type NUL && C:\odasa\tools\odasa index --auto msbuild C:\Project\test.sln /t:rebuild /p:Platform=""x86"" /p:Configuration=""Release"" /p:MvcBuildViews=true"] = 0;
302+
Actions.RunProcess[@"cmd.exe /C CALL ^""C:\Program Files ^(x86^)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat^"" && set Platform=&& type NUL && msbuild C:\Project\test.sln /t:rebuild /p:Platform=""x86"" /p:Configuration=""Release"""] = 0;
303303
Actions.RunProcessOut[@"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe -prerelease -legacy -property installationPath"] = "";
304304
Actions.RunProcess[@"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe -prerelease -legacy -property installationPath"] = 1;
305305
Actions.RunProcess[@"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe -prerelease -legacy -property installationVersion"] = 0;

cpp/autobuilder/Semmle.Autobuild.Cpp/CppAutobuilder.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,26 @@
22

33
namespace Semmle.Autobuild.Cpp
44
{
5-
public class CppAutobuilder : Autobuilder
5+
/// <summary>
6+
/// Encapsulates C++ build options.
7+
/// </summary>
8+
public class CppAutobuildOptions : AutobuildOptionsShared
69
{
7-
public CppAutobuilder(IBuildActions actions, AutobuildOptions options) : base(actions, options) { }
10+
public override Language Language => Language.Cpp;
11+
12+
13+
/// <summary>
14+
/// Reads options from environment variables.
15+
/// Throws ArgumentOutOfRangeException for invalid arguments.
16+
/// </summary>
17+
public CppAutobuildOptions(IBuildActions actions) : base(actions)
18+
{
19+
}
20+
}
21+
22+
public class CppAutobuilder : Autobuilder<CppAutobuildOptions>
23+
{
24+
public CppAutobuilder(IBuildActions actions, CppAutobuildOptions options) : base(actions, options) { }
825

926
public override BuildScript GetBuildScript()
1027
{

cpp/autobuilder/Semmle.Autobuild.Cpp/Program.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ static int Main()
1111
try
1212
{
1313
var actions = SystemBuildActions.Instance;
14-
var options = new AutobuildOptions(actions, Language.Cpp);
14+
var options = new CppAutobuildOptions(actions);
1515
try
1616
{
1717
Console.WriteLine("CodeQL C++ autobuilder");
1818
var builder = new CppAutobuilder(actions, options);
1919
return builder.AttemptBuild();
2020
}
21-
catch(InvalidEnvironmentException ex)
21+
catch (InvalidEnvironmentException ex)
2222
{
2323
Console.WriteLine("The environment is invalid: {0}", ex.Message);
2424
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ private CSharpAutobuilder CreateAutoBuilder(bool isWindows,
403403
actions.GetCurrentDirectory = cwd;
404404
actions.IsWindows = isWindows;
405405

406-
var options = new AutobuildOptions(actions, Language.CSharp);
406+
var options = new CSharpAutobuildOptions(actions);
407407
return new CSharpAutobuilder(actions, options);
408408
}
409409

@@ -576,7 +576,7 @@ private void SkipVsWhere()
576576
actions.FileExists[@"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"] = false;
577577
}
578578

579-
private void TestAutobuilderScript(Autobuilder autobuilder, int expectedOutput, int commandsRun)
579+
private void TestAutobuilderScript(CSharpAutobuilder autobuilder, int expectedOutput, int commandsRun)
580580
{
581581
Assert.Equal(expectedOutput, autobuilder.GetBuildScript().Run(actions, StartCallback, EndCallback));
582582

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

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,32 @@
44

55
namespace Semmle.Autobuild.CSharp
66
{
7-
public class CSharpAutobuilder : Autobuilder
7+
/// <summary>
8+
/// Encapsulates C# build options.
9+
/// </summary>
10+
public class CSharpAutobuildOptions : AutobuildOptionsShared
811
{
9-
public CSharpAutobuilder(IBuildActions actions, AutobuildOptions options) : base(actions, options) { }
12+
private const string extractorOptionPrefix = "CODEQL_EXTRACTOR_CSHARP_OPTION_";
13+
14+
public bool Buildless { get; }
15+
16+
public override Language Language => Language.CSharp;
17+
18+
19+
/// <summary>
20+
/// Reads options from environment variables.
21+
/// Throws ArgumentOutOfRangeException for invalid arguments.
22+
/// </summary>
23+
public CSharpAutobuildOptions(IBuildActions actions) : base(actions)
24+
{
25+
Buildless = actions.GetEnvironmentVariable(lgtmPrefix + "BUILDLESS").AsBool("buildless", false) ||
26+
actions.GetEnvironmentVariable(extractorOptionPrefix + "BUILDLESS").AsBool("buildless", false);
27+
}
28+
}
29+
30+
public class CSharpAutobuilder : Autobuilder<CSharpAutobuildOptions>
31+
{
32+
public CSharpAutobuilder(IBuildActions actions, CSharpAutobuildOptions options) : base(actions, options) { }
1033

1134
public override BuildScript GetBuildScript()
1235
{

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ namespace Semmle.Autobuild.CSharp
1313
/// A build rule where the build command is of the form "dotnet build".
1414
/// Currently unused because the tracer does not work with dotnet.
1515
/// </summary>
16-
internal class DotNetRule : IBuildRule
16+
internal class DotNetRule : IBuildRule<CSharpAutobuildOptions>
1717
{
18-
public BuildScript Analyse(Autobuilder builder, bool auto)
18+
public BuildScript Analyse(IAutobuilder<CSharpAutobuildOptions> builder, bool auto)
1919
{
2020
if (!builder.ProjectsOrSolutionsToBuild.Any())
2121
return BuildScript.Failure;
@@ -24,7 +24,7 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
2424
{
2525
var notDotNetProject = builder.ProjectsOrSolutionsToBuild
2626
.SelectMany(p => Enumerators.Singleton(p).Concat(p.IncludedProjects))
27-
.OfType<Project>()
27+
.OfType<Project<CSharpAutobuildOptions>>()
2828
.FirstOrDefault(p => !p.DotNetProject);
2929
if (notDotNetProject is not null)
3030
{
@@ -56,7 +56,7 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
5656
});
5757
}
5858

59-
private static BuildScript WithDotNet(Autobuilder builder, Func<string?, IDictionary<string, string>?, BuildScript> f)
59+
private static BuildScript WithDotNet(IAutobuilder<AutobuildOptionsShared> builder, Func<string?, IDictionary<string, string>?, BuildScript> f)
6060
{
6161
var installDir = builder.Actions.PathCombine(builder.Options.RootDirectory, ".dotnet");
6262
var installScript = DownloadDotNet(builder, installDir);
@@ -92,15 +92,15 @@ private static BuildScript WithDotNet(Autobuilder builder, Func<string?, IDictio
9292
/// variables needed by the installed .NET Core (<code>null</code> when no variables
9393
/// are needed).
9494
/// </summary>
95-
public static BuildScript WithDotNet(Autobuilder builder, Func<IDictionary<string, string>?, BuildScript> f)
95+
public static BuildScript WithDotNet(IAutobuilder<AutobuildOptionsShared> builder, Func<IDictionary<string, string>?, BuildScript> f)
9696
=> WithDotNet(builder, (_1, env) => f(env));
9797

9898
/// <summary>
9999
/// Returns a script for downloading relevant versions of the
100100
/// .NET Core SDK. The SDK(s) will be installed at <code>installDir</code>
101101
/// (provided that the script succeeds).
102102
/// </summary>
103-
private static BuildScript DownloadDotNet(Autobuilder builder, string installDir)
103+
private static BuildScript DownloadDotNet(IAutobuilder<AutobuildOptionsShared> builder, string installDir)
104104
{
105105
if (!string.IsNullOrEmpty(builder.Options.DotNetVersion))
106106
// Specific version supplied in configuration: always use that
@@ -137,7 +137,7 @@ private static BuildScript DownloadDotNet(Autobuilder builder, string installDir
137137
///
138138
/// See https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-install-script.
139139
/// </summary>
140-
private static BuildScript DownloadDotNetVersion(Autobuilder builder, string path, string version)
140+
private static BuildScript DownloadDotNetVersion(IAutobuilder<AutobuildOptionsShared> builder, string path, string version)
141141
{
142142
return BuildScript.Bind(GetInstalledSdksScript(builder.Actions), (sdks, sdksRet) =>
143143
{
@@ -233,7 +233,7 @@ private static CommandBuilder GetRestoreCommand(IBuildActions actions, string? d
233233
/// <summary>
234234
/// Gets the `dotnet build` script.
235235
/// </summary>
236-
private static BuildScript GetBuildScript(Autobuilder builder, string? dotNetPath, IDictionary<string, string>? environment, string projOrSln)
236+
private static BuildScript GetBuildScript(IAutobuilder<CSharpAutobuildOptions> builder, string? dotNetPath, IDictionary<string, string>? environment, string projOrSln)
237237
{
238238
var build = new CommandBuilder(builder.Actions, null, environment);
239239
var script = build.RunCommand(DotNetCommand(builder.Actions, dotNetPath)).

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public static int Main()
1111
try
1212
{
1313
var actions = SystemBuildActions.Instance;
14-
var options = new AutobuildOptions(actions, Language.CSharp);
14+
var options = new CSharpAutobuildOptions(actions);
1515
try
1616
{
1717
Console.WriteLine("CodeQL C# autobuilder");

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ namespace Semmle.Autobuild.CSharp
66
/// <summary>
77
/// Build using standalone extraction.
88
/// </summary>
9-
internal class StandaloneBuildRule : IBuildRule
9+
internal class StandaloneBuildRule : IBuildRule<CSharpAutobuildOptions>
1010
{
11-
public BuildScript Analyse(Autobuilder builder, bool auto)
11+
public BuildScript Analyse(IAutobuilder<CSharpAutobuildOptions> builder, bool auto)
1212
{
1313
BuildScript GetCommand(string? solution)
1414
{

csharp/autobuilder/Semmle.Autobuild.Shared/AutobuildOptions.cs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66
namespace Semmle.Autobuild.Shared
77
{
88
/// <summary>
9-
/// Encapsulates build options.
9+
/// Encapsulates build options shared between C# and C++.
1010
/// </summary>
11-
public class AutobuildOptions
11+
public abstract class AutobuildOptionsShared
1212
{
13-
private const string lgtmPrefix = "LGTM_INDEX_";
14-
private const string extractorOptionPrefix = "CODEQL_EXTRACTOR_CSHARP_OPTION_";
13+
protected const string lgtmPrefix = "LGTM_INDEX_";
14+
1515

1616
public int SearchDepth { get; } = 3;
1717
public string RootDirectory { get; }
@@ -25,16 +25,16 @@ public class AutobuildOptions
2525
public string? BuildCommand { get; }
2626
public IEnumerable<string> Solution { get; }
2727
public bool IgnoreErrors { get; }
28-
public bool Buildless { get; }
28+
2929
public bool AllSolutions { get; }
3030
public bool NugetRestore { get; }
31-
public Language Language { get; }
31+
public abstract Language Language { get; }
3232

3333
/// <summary>
3434
/// Reads options from environment variables.
3535
/// Throws ArgumentOutOfRangeException for invalid arguments.
3636
/// </summary>
37-
public AutobuildOptions(IBuildActions actions, Language language)
37+
public AutobuildOptionsShared(IBuildActions actions)
3838
{
3939
RootDirectory = actions.GetCurrentDirectory();
4040
VsToolsVersion = actions.GetEnvironmentVariable(lgtmPrefix + "VSTOOLS_VERSION");
@@ -48,12 +48,8 @@ public AutobuildOptions(IBuildActions actions, Language language)
4848
Solution = actions.GetEnvironmentVariable(lgtmPrefix + "SOLUTION").AsListWithExpandedEnvVars(actions, Array.Empty<string>());
4949

5050
IgnoreErrors = actions.GetEnvironmentVariable(lgtmPrefix + "IGNORE_ERRORS").AsBool("ignore_errors", false);
51-
Buildless = actions.GetEnvironmentVariable(lgtmPrefix + "BUILDLESS").AsBool("buildless", false) ||
52-
actions.GetEnvironmentVariable(extractorOptionPrefix + "BUILDLESS").AsBool("buildless", false);
5351
AllSolutions = actions.GetEnvironmentVariable(lgtmPrefix + "ALL_SOLUTIONS").AsBool("all_solutions", false);
5452
NugetRestore = actions.GetEnvironmentVariable(lgtmPrefix + "NUGET_RESTORE").AsBool("nuget_restore", true);
55-
56-
Language = language;
5753
}
5854
}
5955

0 commit comments

Comments
 (0)