-
Notifications
You must be signed in to change notification settings - Fork 268
/
Utilities.cs
75 lines (69 loc) · 3.32 KB
/
Utilities.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
namespace ILLinkBenchmarks
{
static class Utilities
{
public static readonly string CurrentRID = RidString(
GetCurrentOSPlatform(),
RuntimeInformation.ProcessArchitecture,
RuntimeInformation.RuntimeIdentifier.Contains("musl") ? "musl" : "default");
private static string RidString(OSPlatform OS, Architecture Arch, string Libc)
{
string os =
OS == OSPlatform.Windows ? "win" :
OS == OSPlatform.Linux ? "linux" :
OS == OSPlatform.OSX ? "osx" :
throw new NotSupportedException("Unsupported OS: " + OS);
string arch = Arch switch
{
Architecture.X64 => "x64",
_ => throw new NotSupportedException("Unsupported architecture")
};
return Libc switch
{
"default" => string.Join("-", os, arch),
"musl" => string.Join('-', os, arch, "musl"),
_ => throw new NotImplementedException()
};
}
private static OSPlatform GetCurrentOSPlatform()
{
return RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? OSPlatform.OSX :
RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? OSPlatform.Windows :
RuntimeInformation.IsOSPlatform(OSPlatform.Linux) ? OSPlatform.Linux :
throw new NotSupportedException("Current OS is not supported: " + RuntimeInformation.OSDescription);
}
public static string GenerateTempFolder()
{
string outputDirectory;
do
{
outputDirectory = Path.Join(Path.GetTempPath(), Path.GetFileNameWithoutExtension(Path.GetRandomFileName()));
} while (System.IO.File.Exists(outputDirectory));
return outputDirectory;
}
public static string FormatStandardOutput(string stdOutput)
=> " >> " + stdOutput.ReplaceLineEndings(Environment.NewLine + " >> ");
/// <summary>
/// Shells out to run `dotnet publish --self-contained` on the project file passed in, and outputs to a random temp folder. Returns path to the output folder.
/// </summary>
public static string PublishSampleProject(string projectFilePath, params string[] extraArgs)
{
string outputDirectory = GenerateTempFolder();
Directory.CreateDirectory(outputDirectory);
ProcessStartInfo processStartInfo = new ProcessStartInfo("dotnet", $"publish {projectFilePath} -f {Environment.GetEnvironmentVariable("PERFLAB_TARGET_FRAMEWORKS") ?? "net9.0"} -r {CurrentRID} --self-contained -o {outputDirectory} {extraArgs.Aggregate("", (agg, val) => agg + " " + val)}");
processStartInfo.RedirectStandardError = false;
processStartInfo.RedirectStandardOutput = true;
var p = Process.Start(processStartInfo);
string stdOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (p.ExitCode != 0)
throw new ApplicationException($"Failed to publish trimmed sample application: \n{FormatStandardOutput(stdOutput)}\n");
return outputDirectory;
}
}
}