Skip to content

Commit ad867bb

Browse files
authored
Merge pull request #2186 from hvitved/csharp/new-env-variables
C#: Teach extractor and autobuilder about new environment variables
2 parents fe2988a + 83ec2d6 commit ad867bb

File tree

11 files changed

+139
-107
lines changed

11 files changed

+139
-107
lines changed

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

Lines changed: 80 additions & 77 deletions
Large diffs are not rendered by default.

csharp/autobuilder/Semmle.Autobuild/AspBuildRule.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.IO;
2-
3-
namespace Semmle.Autobuild
1+
namespace Semmle.Autobuild
42
{
53
/// <summary>
64
/// ASP extraction.
@@ -9,10 +7,14 @@ class AspBuildRule : IBuildRule
97
{
108
public BuildScript Analyse(Autobuilder builder, bool auto)
119
{
10+
(var javaHome, var dist) =
11+
builder.CodeQLJavaHome != null ?
12+
(builder.CodeQLJavaHome, builder.CodeQLExtractorCSharpRoot) :
13+
(builder.SemmleJavaHome, builder.SemmleDist);
1214
var command = new CommandBuilder(builder.Actions).
13-
RunCommand(builder.Actions.PathCombine(builder.SemmleJavaHome, "bin", "java")).
15+
RunCommand(builder.Actions.PathCombine(javaHome, "bin", "java")).
1416
Argument("-jar").
15-
QuoteArgument(builder.Actions.PathCombine(builder.SemmleDist, "tools", "extractor-asp.jar")).
17+
QuoteArgument(builder.Actions.PathCombine(dist, "tools", "extractor-asp.jar")).
1618
Argument(".");
1719
return command.Script;
1820
}

csharp/autobuilder/Semmle.Autobuild/AutobuildOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public class AutobuildOptions
2929
public bool NugetRestore;
3030

3131
public Language Language;
32+
public bool Indexing;
3233

3334
/// <summary>
3435
/// Reads options from environment variables.
@@ -53,6 +54,7 @@ public void ReadEnvironment(IBuildActions actions)
5354
NugetRestore = actions.GetEnvironmentVariable(prefix + "NUGET_RESTORE").AsBool("nuget_restore", true);
5455

5556
Language = actions.GetEnvironmentVariable("LGTM_PROJECT_LANGUAGE").AsLanguage();
57+
Indexing = !actions.GetEnvironmentVariable("CODEQL_AUTOBUILDER_CSHARP_NO_INDEXING").AsBool("no_indexing", false);
5658
}
5759
}
5860

csharp/autobuilder/Semmle.Autobuild/Autobuilder.cs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,18 @@ IEnumerable<IProjectOrSolution> FindFiles(string extension, Func<string, Project
176176
return ret ?? new List<IProjectOrSolution>();
177177
});
178178

179+
CodeQLExtractorCSharpRoot = Actions.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_ROOT");
180+
181+
CodeQLJavaHome = Actions.GetEnvironmentVariable("CODEQL_JAVA_HOME");
182+
179183
SemmleDist = Actions.GetEnvironmentVariable("SEMMLE_DIST");
180184

181185
SemmleJavaHome = Actions.GetEnvironmentVariable("SEMMLE_JAVA_HOME");
182186

183187
SemmlePlatformTools = Actions.GetEnvironmentVariable("SEMMLE_PLATFORM_TOOLS");
184188

185-
if (SemmleDist == null)
186-
Log(Severity.Error, "The environment variable SEMMLE_DIST has not been set.");
189+
if (CodeQLExtractorCSharpRoot == null && SemmleDist == null)
190+
Log(Severity.Error, "The environment variables CODEQL_EXTRACTOR_CSHARP_ROOT and SEMMLE_DIST have not been set.");
187191
}
188192

189193
readonly ILogger logger = new ConsoleLogger(Verbosity.Info);
@@ -259,9 +263,9 @@ BuildScript CheckExtractorRun(bool warnOnFailure) =>
259263
break;
260264
case CSharpBuildStrategy.Auto:
261265
var cleanTrapFolder =
262-
BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("TRAP_FOLDER"));
266+
BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_TRAP_DIR") ?? Actions.GetEnvironmentVariable("TRAP_FOLDER"));
263267
var cleanSourceArchive =
264-
BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("SOURCE_ARCHIVE"));
268+
BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_SOURCE_ARCHIVE_DIR") ?? Actions.GetEnvironmentVariable("SOURCE_ARCHIVE"));
265269
var tryCleanExtractorArgsLogs =
266270
BuildScript.Create(actions =>
267271
{
@@ -361,6 +365,16 @@ BuildScript AutobuildFailure() =>
361365
return 1;
362366
});
363367

368+
/// <summary>
369+
/// Value of CODEQL_EXTRACTOR_CSHARP_ROOT environment variable.
370+
/// </summary>
371+
public string CodeQLExtractorCSharpRoot { get; private set; }
372+
373+
/// <summary>
374+
/// Value of CODEQL_JAVA_HOME environment variable.
375+
/// </summary>
376+
public string CodeQLJavaHome { get; private set; }
377+
364378
/// <summary>
365379
/// Value of SEMMLE_DIST environment variable.
366380
/// </summary>
@@ -380,5 +394,12 @@ BuildScript AutobuildFailure() =>
380394
/// The absolute path of the odasa executable.
381395
/// </summary>
382396
public string Odasa => SemmleDist == null ? null : Actions.PathCombine(SemmleDist, "tools", "odasa");
397+
398+
/// <summary>
399+
/// Construct a command that executed the given <paramref name="cmd"/> wrapped in
400+
/// an <code>odasa --index</code>, unless indexing has been disabled, in which case
401+
/// <paramref name="cmd"/> is run directly.
402+
/// </summary>
403+
internal CommandBuilder MaybeIndex(CommandBuilder builder, string cmd) => Options.Indexing ? builder.IndexCommand(Odasa, cmd) : builder.RunCommand(cmd);
383404
}
384405
}

csharp/autobuilder/Semmle.Autobuild/BuildCommandAutoRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
5252
if (vsTools != null)
5353
command.CallBatFile(vsTools.Path);
5454

55-
command.IndexCommand(builder.Odasa, scriptPath);
55+
builder.MaybeIndex(command, scriptPath);
5656
return command.Script;
5757
});
5858
}

csharp/autobuilder/Semmle.Autobuild/BuildCommandRule.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
1919
var vsTools = MsBuildRule.GetVcVarsBatFile(builder);
2020
if (vsTools != null)
2121
command.CallBatFile(vsTools.Path);
22-
command.IndexCommand(builder.Odasa, builder.Options.BuildCommand);
22+
builder.MaybeIndex(command, builder.Options.BuildCommand);
2323

2424
return command.Script;
2525
});

csharp/autobuilder/Semmle.Autobuild/DotNetRule.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,12 @@ CommandBuilder GetRestoreCommand(IBuildActions actions, (string DotNetPath, IDic
259259

260260
CommandBuilder GetBuildCommand(Autobuilder builder, (string DotNetPath, IDictionary<string, string> Environment)? arg)
261261
{
262-
var build = new CommandBuilder(builder.Actions, null, arg?.Environment).
263-
IndexCommand(builder.Odasa, DotNetCommand(builder.Actions, arg?.DotNetPath)).
262+
var build = new CommandBuilder(builder.Actions, null, arg?.Environment);
263+
return builder.MaybeIndex(build, DotNetCommand(builder.Actions, arg?.DotNetPath)).
264264
Argument("build").
265265
Argument("--no-incremental").
266266
Argument("/p:UseSharedCompilation=false").
267267
Argument(builder.Options.DotNetArguments);
268-
return build;
269268
}
270269
}
271270
}

csharp/autobuilder/Semmle.Autobuild/MsBuildRule.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
3636
builder.Log(Severity.Warning, "Could not find a suitable version of vcvarsall.bat");
3737
}
3838

39-
var nuget = builder.Actions.PathCombine(builder.SemmlePlatformTools, "csharp", "nuget", "nuget.exe");
39+
var nuget =
40+
builder.CodeQLExtractorCSharpRoot != null ?
41+
builder.Actions.PathCombine(builder.CodeQLExtractorCSharpRoot, "tools", "nuget.exe") :
42+
builder.Actions.PathCombine(builder.SemmlePlatformTools, "csharp", "nuget", "nuget.exe");
4043

4144
var ret = BuildScript.Success;
4245

@@ -56,7 +59,7 @@ public BuildScript Analyse(Autobuilder builder, bool auto)
5659
if (vsTools != null)
5760
command.CallBatFile(vsTools.Path);
5861

59-
command.IndexCommand(builder.Odasa, MsBuild);
62+
builder.MaybeIndex(command, MsBuild);
6063
command.QuoteArgument(projectOrSolution.FullPath);
6164

6265
command.Argument("/p:UseSharedCompilation=false");

csharp/autobuilder/Semmle.Autobuild/XmlBuildRule.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Collections.Generic;
2-
3-
namespace Semmle.Autobuild
1+
namespace Semmle.Autobuild
42
{
53
/// <summary>
64
/// XML extraction.
@@ -9,6 +7,9 @@ class XmlBuildRule : IBuildRule
97
{
108
public BuildScript Analyse(Autobuilder builder, bool auto)
119
{
10+
if (!builder.Options.Indexing)
11+
return BuildScript.Success;
12+
1213
var command = new CommandBuilder(builder.Actions).
1314
RunCommand(builder.Odasa).
1415
Argument("index --xml --extensions config csproj props xml");

csharp/extractor/Semmle.Extraction.CSharp/Extractor.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -405,22 +405,23 @@ public static IEnumerable<string> GetCSharpArgsLogs() =>
405405

406406
static string GetCSharpLogDirectory()
407407
{
408-
string snapshot = Environment.GetEnvironmentVariable("ODASA_SNAPSHOT");
409-
string buildErrorDir = Environment.GetEnvironmentVariable("ODASA_BUILD_ERROR_DIR");
410-
string traps = Environment.GetEnvironmentVariable("TRAP_FOLDER");
408+
var codeQlLogDir = Environment.GetEnvironmentVariable("CODEQL_EXTRACTOR_CSHARP_LOG_DIR");
409+
if (!string.IsNullOrEmpty(codeQlLogDir))
410+
return codeQlLogDir;
411+
412+
var snapshot = Environment.GetEnvironmentVariable("ODASA_SNAPSHOT");
411413
if (!string.IsNullOrEmpty(snapshot))
412-
{
413414
return Path.Combine(snapshot, "log");
414-
}
415+
416+
var buildErrorDir = Environment.GetEnvironmentVariable("ODASA_BUILD_ERROR_DIR");
415417
if (!string.IsNullOrEmpty(buildErrorDir))
416-
{
417418
// Used by `qltest`
418419
return buildErrorDir;
419-
}
420+
421+
var traps = Environment.GetEnvironmentVariable("TRAP_FOLDER");
420422
if (!string.IsNullOrEmpty(traps))
421-
{
422423
return traps;
423-
}
424+
424425
return Directory.GetCurrentDirectory();
425426
}
426427
}

0 commit comments

Comments
 (0)