From b455b2c1a6c639fb4c3145906e23e006e34757a3 Mon Sep 17 00:00:00 2001 From: Tamas Vajk Date: Mon, 13 Nov 2023 13:09:58 +0100 Subject: [PATCH] C#: Change IsARM to Apple silicon check --- .../BuildScripts.cs | 4 +-- .../BuildScripts.cs | 4 +-- .../Semmle.Autobuild.Shared/BuildActions.cs | 29 +++++++++++++++---- .../Semmle.Autobuild.Shared/MsBuildRule.cs | 4 +-- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/BuildScripts.cs b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/BuildScripts.cs index a3e7987394d..4d3729a6aaa 100644 --- a/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/BuildScripts.cs +++ b/cpp/autobuilder/Semmle.Autobuild.Cpp.Tests/BuildScripts.cs @@ -145,9 +145,9 @@ namespace Semmle.Autobuild.Cpp.Tests bool IBuildActions.IsMacOs() => IsMacOs; - public bool IsArm { get; set; } + public bool IsRunningOnAppleSilicon { get; set; } - bool IBuildActions.IsArm() => IsArm; + bool IBuildActions.IsRunningOnAppleSilicon() => IsRunningOnAppleSilicon; string IBuildActions.PathCombine(params string[] parts) { diff --git a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs index eea83feb491..3cdb83af42d 100644 --- a/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs +++ b/csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs @@ -159,9 +159,9 @@ namespace Semmle.Autobuild.CSharp.Tests bool IBuildActions.IsMacOs() => IsMacOs; - public bool IsArm { get; set; } + public bool IsRunningOnAppleSilicon { get; set; } - bool IBuildActions.IsArm() => IsArm; + bool IBuildActions.IsRunningOnAppleSilicon() => IsRunningOnAppleSilicon; public string PathCombine(params string[] parts) { diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs index 4c66d867b6d..3bfdaec160e 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/BuildActions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Xml; using Semmle.Util; @@ -119,10 +120,10 @@ namespace Semmle.Autobuild.Shared bool IsMacOs(); /// - /// Gets a value indicating whether we are running on arm. + /// Gets a value indicating whether we are running on Apple Silicon. /// - /// True if we are running on arm. - bool IsArm(); + /// True if we are running on Apple Silicon. + bool IsRunningOnAppleSilicon(); /// /// Combine path segments, Path.Combine(). @@ -240,9 +241,25 @@ namespace Semmle.Autobuild.Shared bool IBuildActions.IsMacOs() => RuntimeInformation.IsOSPlatform(OSPlatform.OSX); - bool IBuildActions.IsArm() => - RuntimeInformation.ProcessArchitecture == Architecture.Arm64 || - RuntimeInformation.ProcessArchitecture == Architecture.Arm; + bool IBuildActions.IsRunningOnAppleSilicon() + { + var thisBuildActions = (IBuildActions)this; + + if (!thisBuildActions.IsMacOs()) + { + return false; + } + + try + { + var res = thisBuildActions.RunProcess("sysctl", "machdep.cpu.brand_string", workingDirectory: null, env: null, out var stdOut); + return stdOut?.Any(s => s?.ToLowerInvariant().Contains("apple") == true) ?? false; + } + catch (Exception) + { + return false; + } + } string IBuildActions.PathCombine(params string[] parts) => Path.Combine(parts); diff --git a/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs b/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs index bebf2a1eea4..43d73255cae 100644 --- a/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs +++ b/csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs @@ -15,12 +15,12 @@ namespace Semmle.Autobuild.Shared /// public static CommandBuilder MsBuildCommand(this CommandBuilder cmdBuilder, IAutobuilder builder) { - var isArmMac = builder.Actions.IsMacOs() && builder.Actions.IsArm(); + var IsRunningOnAppleSiliconMac = builder.Actions.IsMacOs() && builder.Actions.IsRunningOnAppleSilicon(); // mono doesn't ship with `msbuild` on Arm-based Macs, but we can fall back to // msbuild that ships with `dotnet` which can be invoked with `dotnet msbuild` // perhaps we should do this on all platforms? - return isArmMac ? + return IsRunningOnAppleSiliconMac ? cmdBuilder.RunCommand("dotnet").Argument("msbuild") : cmdBuilder.RunCommand("msbuild"); }