forked from OmniSharp/omnisharp-roslyn
-
Notifications
You must be signed in to change notification settings - Fork 0
/
platform.cake
158 lines (135 loc) · 4.85 KB
/
platform.cake
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
using System.Diagnostics;
public sealed class Platform
{
public static Platform Current { get; } = GetCurrentPlatform();
private readonly string _os;
private readonly string _architecture;
public Version Version { get; }
public string DistroName { get; }
public bool IsWindows => _os == "Windows";
public bool IsMacOS => _os == "MacOS";
public bool IsLinux => _os == "Linux";
public bool Is32Bit => _architecture == "x86";
public bool Is64Bit => _architecture == "x64";
private Platform(string os, string architecture, Version version, string distroName = null)
{
_os = os;
_architecture = architecture;
this.Version = version;
this.DistroName = distroName;
}
public override string ToString() => $"{DistroName ?? _os} {Version} ({_architecture})";
private static Platform GetCurrentPlatform()
{
string os, architecture;
// Simple check to see if this is Windows.
var platformId = (int)Environment.OSVersion.Platform;
if (platformId <= 3 || platformId == 5)
{
os = "Windows";
if (Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86" &&
Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432") == null)
{
architecture = "x86";
}
else
{
architecture = "x64";
}
}
else
{
// If this is not Windows, run 'uname' to get the OS name and architecture.
var output = RunAndCaptureOutput("uname", "-s -m");
var values = output.Split(' ');
var osName = values[0];
var osArch = values[1];
os = osName.Equals("Darwin", StringComparison.OrdinalIgnoreCase)
? "MacOS"
: "Linux";
if (osArch.Equals("x86", StringComparison.OrdinalIgnoreCase))
{
architecture = "x86";
}
else if (osArch.Equals("x86_64", StringComparison.OrdinalIgnoreCase))
{
architecture = "x64";
}
else
{
throw new Exception($"Unexpected architecture: {osArch}");
}
}
switch (os)
{
case "Windows":
return new Platform(os, architecture, Environment.OSVersion.Version);
case "MacOS":
var versionText = RunAndCaptureOutput("sw_vers", "-productVersion");
return new Platform(os, architecture, new Version(versionText));
case "Linux":
string distroName;
Version version;
ReadDistroNameAndVersion(out distroName, out version);
return new Platform(os, architecture, version, distroName);
default:
throw new ArgumentException(nameof(os));
}
}
private static void ReadDistroNameAndVersion(out string distroName, out Version version)
{
var lines = System.IO.File.ReadAllLines("/etc/os-release");
distroName = null;
version = null;
foreach (var line in lines)
{
var equalsIndex = line.IndexOf('=');
if (equalsIndex >= 0)
{
var key = line.Substring(0, equalsIndex).Trim();
var value = line.Substring(equalsIndex + 1).Trim();
value = value.Trim('"');
if (key == "ID")
{
distroName = value;
}
else if (key == "VERSION_ID")
{
// Normalize any versions to include a Major and Minor version
if (!value.Contains("."))
{
value = value + ".0";
}
version = new Version(value);
}
if (distroName != null && version != null)
{
break;
}
}
}
}
private static string RunAndCaptureOutput(string fileName, string arguments, string workingDirectory = null)
{
var startInfo = new ProcessStartInfo(fileName, arguments)
{
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
UseShellExecute = false,
WorkingDirectory = workingDirectory ?? string.Empty,
};
try
{
var process = Process.Start(startInfo);
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return output.Trim();
}
catch (Exception ex)
{
throw new Exception($"Failed to launch '{fileName}' with args, '{arguments}'", ex);
}
}
}