Merge pull request #19251 from tamasvajk/fix/macos15 · github/codeql@de9c1fb · GitHub
Skip to content

Commit de9c1fb

Browse files
authored
Merge pull request #19251 from tamasvajk/fix/macos15
C#: Fix autobuild on macos without mono
2 parents 1c79c5e + a70536f commit de9c1fb

5 files changed

Lines changed: 65 additions & 16 deletions

File tree

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

Lines changed: 27 additions & 3 deletions

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ IEnumerable<string> IBuildActions.EnumerateDirectories(string dir)
150150

151151
bool IBuildActions.IsRunningOnAppleSilicon() => IsRunningOnAppleSilicon;
152152

153+
public bool IsMonoInstalled { get; set; }
154+
155+
bool IBuildActions.IsMonoInstalled() => IsMonoInstalled;
156+
153157
string IBuildActions.PathCombine(params string[] parts)
154158
{
155159
return string.Join(IsWindows ? '\\' : '/', parts.Where(p => !string.IsNullOrWhiteSpace(p)));

‎csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs‎

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ internal static class MsBuildCommandExtensions
1010
/// <summary>
1111
/// Appends a call to msbuild.
1212
/// </summary>
13-
/// <param name="cmdBuilder"></param>
14-
/// <param name="builder"></param>
1513
/// <returns></returns>
16-
public static CommandBuilder MsBuildCommand(this CommandBuilder cmdBuilder, IAutobuilder<AutobuildOptionsShared> builder)
14+
public static CommandBuilder MsBuildCommand(this CommandBuilder cmdBuilder, IAutobuilder<AutobuildOptionsShared> builder, bool preferDotnet)
1715
{
1816
// mono doesn't ship with `msbuild` on Arm-based Macs, but we can fall back to
1917
// msbuild that ships with `dotnet` which can be invoked with `dotnet msbuild`
2018
// perhaps we should do this on all platforms?
21-
return builder.Actions.IsRunningOnAppleSilicon()
19+
// Similarly, there's no point in trying to rely on mono if it's not installed.
20+
// In which case we can still fall back to `dotnet msbuild`.
21+
return preferDotnet
2222
? cmdBuilder.RunCommand("dotnet").Argument("msbuild")
2323
: cmdBuilder.RunCommand("msbuild");
2424
}
@@ -75,13 +75,16 @@ BuildScript GetNugetRestoreScript() =>
7575
QuoteArgument(projectOrSolution.FullPath).
7676
Argument("-DisableParallelProcessing").
7777
Script;
78+
79+
var preferDotnet = builder.Actions.IsRunningOnAppleSilicon() || !builder.Actions.IsWindows() && !builder.Actions.IsMonoInstalled();
80+
7881
var nugetRestore = GetNugetRestoreScript();
7982
var msbuildRestoreCommand = new CommandBuilder(builder.Actions).
80-
MsBuildCommand(builder).
83+
MsBuildCommand(builder, preferDotnet).
8184
Argument("/t:restore").
8285
QuoteArgument(projectOrSolution.FullPath);
8386

84-
if (builder.Actions.IsRunningOnAppleSilicon())
87+
if (preferDotnet)
8588
{
8689
// On Apple Silicon, only try package restore with `dotnet msbuild /t:restore`
8790
ret &= BuildScript.Try(msbuildRestoreCommand.Script);
@@ -119,7 +122,7 @@ BuildScript GetNugetRestoreScript() =>
119122
command.RunCommand("set Platform=&& type NUL", quoteExe: false);
120123
}
121124

122-
command.MsBuildCommand(builder);
125+
command.MsBuildCommand(builder, preferDotnet);
123126
command.QuoteArgument(projectOrSolution.FullPath);
124127

125128
var target = "rebuild";

‎csharp/extractor/Semmle.Util/BuildActions.cs‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ public interface IBuildActions
125125
/// <returns>True if we are running on Apple Silicon.</returns>
126126
bool IsRunningOnAppleSilicon();
127127

128+
/// <summary>
129+
/// Checks if Mono is installed.
130+
/// </summary>
131+
bool IsMonoInstalled();
132+
128133
/// <summary>
129134
/// Combine path segments, Path.Combine().
130135
/// </summary>
@@ -261,6 +266,25 @@ bool IBuildActions.IsRunningOnAppleSilicon()
261266
}
262267
}
263268

269+
bool IBuildActions.IsMonoInstalled()
270+
{
271+
var thisBuildActions = (IBuildActions)this;
272+
273+
if (thisBuildActions.IsWindows())
274+
{
275+
return false;
276+
}
277+
278+
try
279+
{
280+
return 0 == thisBuildActions.RunProcess("mono", "--version", workingDirectory: null, env: null);
281+
}
282+
catch (Exception)
283+
{
284+
return false;
285+
}
286+
}
287+
264288
string IBuildActions.PathCombine(params string[] parts) => Path.Combine(parts);
265289

266290
void IBuildActions.WriteAllText(string filename, string contents) => File.WriteAllText(filename, contents);
Lines changed: 0 additions & 6 deletions

0 commit comments

Comments
 (0)