1*cc02d7e2SAndroid Build Coastguard Worker #region Copyright notice and license 2*cc02d7e2SAndroid Build Coastguard Worker 3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2018 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker // 5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker // 9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker // 11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker 17*cc02d7e2SAndroid Build Coastguard Worker #endregion 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker using Microsoft.Build.Framework; 20*cc02d7e2SAndroid Build Coastguard Worker using Microsoft.Build.Utilities; 21*cc02d7e2SAndroid Build Coastguard Worker using Grpc.Core.Internal; 22*cc02d7e2SAndroid Build Coastguard Worker 23*cc02d7e2SAndroid Build Coastguard Worker namespace Grpc.Tools 24*cc02d7e2SAndroid Build Coastguard Worker { 25*cc02d7e2SAndroid Build Coastguard Worker /// <summary> 26*cc02d7e2SAndroid Build Coastguard Worker /// A helper task to resolve actual OS type and bitness. 27*cc02d7e2SAndroid Build Coastguard Worker /// </summary> 28*cc02d7e2SAndroid Build Coastguard Worker public class ProtoToolsPlatform : Task 29*cc02d7e2SAndroid Build Coastguard Worker { 30*cc02d7e2SAndroid Build Coastguard Worker /// <summary> 31*cc02d7e2SAndroid Build Coastguard Worker /// Return one of 'linux', 'macosx' or 'windows'. 32*cc02d7e2SAndroid Build Coastguard Worker /// If the OS is unknown, the property is not set. 33*cc02d7e2SAndroid Build Coastguard Worker /// </summary> 34*cc02d7e2SAndroid Build Coastguard Worker [Output] 35*cc02d7e2SAndroid Build Coastguard Worker public string Os { get; set; } 36*cc02d7e2SAndroid Build Coastguard Worker 37*cc02d7e2SAndroid Build Coastguard Worker /// <summary> 38*cc02d7e2SAndroid Build Coastguard Worker /// Return one of 'x64', 'x86', 'arm64'. 39*cc02d7e2SAndroid Build Coastguard Worker /// If the CPU is unknown, the property is not set. 40*cc02d7e2SAndroid Build Coastguard Worker /// </summary> 41*cc02d7e2SAndroid Build Coastguard Worker [Output] 42*cc02d7e2SAndroid Build Coastguard Worker public string Cpu { get; set; } 43*cc02d7e2SAndroid Build Coastguard Worker 44*cc02d7e2SAndroid Build Coastguard Worker Execute()45*cc02d7e2SAndroid Build Coastguard Worker public override bool Execute() 46*cc02d7e2SAndroid Build Coastguard Worker { 47*cc02d7e2SAndroid Build Coastguard Worker switch (Platform.Os) 48*cc02d7e2SAndroid Build Coastguard Worker { 49*cc02d7e2SAndroid Build Coastguard Worker case CommonPlatformDetection.OSKind.Linux: Os = "linux"; break; 50*cc02d7e2SAndroid Build Coastguard Worker case CommonPlatformDetection.OSKind.MacOSX: Os = "macosx"; break; 51*cc02d7e2SAndroid Build Coastguard Worker case CommonPlatformDetection.OSKind.Windows: Os = "windows"; break; 52*cc02d7e2SAndroid Build Coastguard Worker default: Os = ""; break; 53*cc02d7e2SAndroid Build Coastguard Worker } 54*cc02d7e2SAndroid Build Coastguard Worker 55*cc02d7e2SAndroid Build Coastguard Worker switch (Platform.Cpu) 56*cc02d7e2SAndroid Build Coastguard Worker { 57*cc02d7e2SAndroid Build Coastguard Worker case CommonPlatformDetection.CpuArchitecture.X86: Cpu = "x86"; break; 58*cc02d7e2SAndroid Build Coastguard Worker case CommonPlatformDetection.CpuArchitecture.X64: Cpu = "x64"; break; 59*cc02d7e2SAndroid Build Coastguard Worker case CommonPlatformDetection.CpuArchitecture.Arm64: Cpu = "arm64"; break; 60*cc02d7e2SAndroid Build Coastguard Worker default: Cpu = ""; break; 61*cc02d7e2SAndroid Build Coastguard Worker } 62*cc02d7e2SAndroid Build Coastguard Worker 63*cc02d7e2SAndroid Build Coastguard Worker // Use x64 on macosx arm64 until a native protoc is shipped 64*cc02d7e2SAndroid Build Coastguard Worker if (Os == "macosx" && Cpu == "arm64") 65*cc02d7e2SAndroid Build Coastguard Worker { 66*cc02d7e2SAndroid Build Coastguard Worker Cpu = "x64"; 67*cc02d7e2SAndroid Build Coastguard Worker } 68*cc02d7e2SAndroid Build Coastguard Worker // Use x86 on Windows arm64 until a native protoc is shipped 69*cc02d7e2SAndroid Build Coastguard Worker else if (Os == "windows" && Cpu == "arm64") 70*cc02d7e2SAndroid Build Coastguard Worker { 71*cc02d7e2SAndroid Build Coastguard Worker Cpu = "x86"; 72*cc02d7e2SAndroid Build Coastguard Worker } 73*cc02d7e2SAndroid Build Coastguard Worker 74*cc02d7e2SAndroid Build Coastguard Worker return true; 75*cc02d7e2SAndroid Build Coastguard Worker } 76*cc02d7e2SAndroid Build Coastguard Worker }; 77*cc02d7e2SAndroid Build Coastguard Worker } 78