|
|
|
@ -66,27 +66,53 @@ namespace Grpc.Tools |
|
|
|
|
default: Cpu = CpuKind.Unknown; break; |
|
|
|
|
} |
|
|
|
|
#else |
|
|
|
|
// Running under either Mono or full MS framework. |
|
|
|
|
Os = OsKind.Windows; |
|
|
|
|
if (Type.GetType("Mono.Runtime", throwOnError: false) != null) |
|
|
|
|
// Using the same best-effort detection logic as Grpc.Core/PlatformApis.cs |
|
|
|
|
var platform = Environment.OSVersion.Platform; |
|
|
|
|
if (platform == PlatformID.Win32NT || platform == PlatformID.Win32S || platform == PlatformID.Win32Windows) |
|
|
|
|
{ |
|
|
|
|
// Congratulations. We are running under Mono. |
|
|
|
|
var plat = Environment.OSVersion.Platform; |
|
|
|
|
if (plat == PlatformID.MacOSX) |
|
|
|
|
{ |
|
|
|
|
Os = OsKind.MacOsX; |
|
|
|
|
} |
|
|
|
|
else if (plat == PlatformID.Unix || (int)plat == 128) |
|
|
|
|
{ |
|
|
|
|
// This is how Mono detects OSX internally. |
|
|
|
|
Os = File.Exists("/usr/lib/libc.dylib") ? OsKind.MacOsX : OsKind.Linux; |
|
|
|
|
} |
|
|
|
|
Os = OsKind.Windows; |
|
|
|
|
} |
|
|
|
|
else if (platform == PlatformID.Unix && GetUname() == "Darwin") |
|
|
|
|
{ |
|
|
|
|
Os = OsKind.MacOsX; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
Os = OsKind.Linux; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Hope we are not building on ARM under Xamarin! |
|
|
|
|
Cpu = Environment.Is64BitProcess ? CpuKind.X64 : CpuKind.X86; |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
[DllImport("libc")] |
|
|
|
|
static extern int uname(IntPtr buf); |
|
|
|
|
|
|
|
|
|
// This code is copied from Grpc.Core/PlatformApis.cs |
|
|
|
|
static string GetUname() |
|
|
|
|
{ |
|
|
|
|
var buffer = Marshal.AllocHGlobal(8192); |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
if (uname(buffer) == 0) |
|
|
|
|
{ |
|
|
|
|
return Marshal.PtrToStringAnsi(buffer); |
|
|
|
|
} |
|
|
|
|
return string.Empty; |
|
|
|
|
} |
|
|
|
|
catch |
|
|
|
|
{ |
|
|
|
|
return string.Empty; |
|
|
|
|
} |
|
|
|
|
finally |
|
|
|
|
{ |
|
|
|
|
if (buffer != IntPtr.Zero) |
|
|
|
|
{ |
|
|
|
|
Marshal.FreeHGlobal(buffer); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Exception handling helpers. |
|
|
|
|